module DDC.Core.Llvm.Convert.Base
( ConvertM
, LlvmState(..)
, llvmStateInit
, Error (..)
, throw
, newUnique
, newUniqueVar
, newUniqueNamedVar
, newUniqueLabel)
where
import DDC.Core.Llvm.Convert.Error
import DDC.Llvm.Syntax
import DDC.Control.Monad.Check
import Data.Map (Map)
import qualified Data.Map as Map
type ConvertM = CheckM LlvmState Error
data LlvmState
= LlvmState
{
llvmStateUnique :: Int
, llvmConstants :: Map Var Lit }
llvmStateInit :: LlvmState
llvmStateInit
= LlvmState
{ llvmStateUnique = 1
, llvmConstants = Map.empty }
newUnique :: ConvertM Int
newUnique
= do s <- get
let u = llvmStateUnique s
put $ s { llvmStateUnique = u + 1 }
return $ u
newUniqueVar :: Type -> ConvertM Var
newUniqueVar t
= do u <- newUnique
return $ Var (NameLocal ("_v" ++ show u)) t
newUniqueNamedVar :: String -> Type -> ConvertM Var
newUniqueNamedVar name t
= do u <- newUnique
return $ Var (NameLocal ("_v" ++ show u ++ "." ++ name)) t
newUniqueLabel :: String -> ConvertM Label
newUniqueLabel name
= do u <- newUnique
return $ Label ("l" ++ show u ++ "." ++ name)