{-# OPTIONS_GHC -cpp #-}

module UHC.Light.Compiler.ConfigDefines
( mkB
, GCVariant (..), gcVariant
, useBoehmGC
, sizeofWord, sizeofWordInBits, sizeofWordAsInteger, sizeofWordInLog
, nodeNeedsForwarding
, magicNumberHI
, mpLib, MPLib (..)
, sizeofFloat, sizeofDouble, sizeofCInt )
where
import UHC.Light.Compiler.Opts.Base
import Data.Word
import Data.Char


{-# LINE 18 "src/ehc/ConfigDefines.chs" #-}
magicNumberHI :: [Word8]
magicNumberHI = map (fromInteger . toInteger . fromEnum) "UHI1"

{-# LINE 27 "src/ehc/ConfigDefines.chs" #-}
mkB :: Int -> Bool
mkB x = if x /= 0 then True else False

{-# LINE 39 "src/ehc/ConfigDefines.chs" #-}
#define USE_BOEHM_GC 0

data GCVariant
  = GCVariant_Boehm | GCVariant_Uhc
  deriving Eq

gcVariant :: EHCOpts -> GCVariant
gcVariant opts | ehcOptEmitExecBytecode opts = GCVariant_Uhc
               | mkB USE_BOEHM_GC            = GCVariant_Boehm
               | otherwise                   = GCVariant_Uhc

{-# LINE 56 "src/ehc/ConfigDefines.chs" #-}
useBoehmGC :: EHCOpts -> Bool
useBoehmGC opts = gcVariant opts == GCVariant_Boehm

{-# LINE 61 "src/ehc/ConfigDefines.chs" #-}
#define USE_LTM 1
#define USE_GMP 0

data MPLib
  = MPLib_LTM | MPLib_GMP
  deriving (Show,Eq)

mpLib :: MPLib
mpLib | mkB USE_GMP = MPLib_GMP
      | otherwise   = MPLib_LTM

{-# LINE 78 "src/ehc/ConfigDefines.chs" #-}
#define SIZEOF_INTPTR_T 8

{-# LINE 82 "src/ehc/ConfigDefines.chs" #-}
sizeofWord :: Int
sizeofWord = SIZEOF_INTPTR_T

sizeofWordInBits :: Int
sizeofWordInBits = sizeofWord * 8

sizeofWordInLog :: Int
sizeofWordInLog = if sizeofWord == 8 then 3 else 2

sizeofWordAsInteger :: Integer
sizeofWordAsInteger = toInteger sizeofWord

{-# LINE 100 "src/ehc/ConfigDefines.chs" #-}
nodeNeedsForwarding :: EHCOpts -> Bool
nodeNeedsForwarding opts
  = case gcVariant opts of
      GCVariant_Boehm -> False -- header only
      GCVariant_Uhc   -> True  -- header + 1 fld for forwarding

{-# LINE 112 "src/ehc/ConfigDefines.chs" #-}
#define SIZEOF_FLOAT 4
#define SIZEOF_DOUBLE 8
#define SIZEOF_INT 4

{-# LINE 118 "src/ehc/ConfigDefines.chs" #-}
sizeofFloat :: Int
sizeofFloat = SIZEOF_FLOAT

sizeofDouble :: Int
sizeofDouble = SIZEOF_DOUBLE

sizeofCInt :: Int
sizeofCInt = SIZEOF_INT