summaryrefslogtreecommitdiff
path: root/compiler/llvmGen/LlvmCodeGen/Base.hs
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2011-10-02 01:31:05 +0100
committerIan Lynagh <igloo@earth.li>2011-10-02 16:39:08 +0100
commitac7a7eb93397a2343402f77f1a8a8b4a0e0298df (patch)
tree86fae1d7598b2ddb94b1c00906468eb54af9a48e /compiler/llvmGen/LlvmCodeGen/Base.hs
parentd8d161749c8b13c3db802f348761cff662741c53 (diff)
downloadhaskell-ac7a7eb93397a2343402f77f1a8a8b4a0e0298df.tar.gz
More CPP removal: pprDynamicLinkerAsmLabel in CLabel
And some knock-on changes
Diffstat (limited to 'compiler/llvmGen/LlvmCodeGen/Base.hs')
-rw-r--r--compiler/llvmGen/LlvmCodeGen/Base.hs46
1 files changed, 26 insertions, 20 deletions
diff --git a/compiler/llvmGen/LlvmCodeGen/Base.hs b/compiler/llvmGen/LlvmCodeGen/Base.hs
index c41ced8b76..f075aaa362 100644
--- a/compiler/llvmGen/LlvmCodeGen/Base.hs
+++ b/compiler/llvmGen/LlvmCodeGen/Base.hs
@@ -12,7 +12,7 @@ module LlvmCodeGen.Base (
LlvmVersion, defaultLlvmVersion,
LlvmEnv, initLlvmEnv, clearVars, varLookup, varInsert,
- funLookup, funInsert, getLlvmVer, setLlvmVer,
+ funLookup, funInsert, getLlvmVer, setLlvmVer, getLlvmPlatform,
cmmToLlvmType, widthToLlvmFloat, widthToLlvmInt, llvmFunTy,
llvmFunSig, llvmStdFunAttrs, llvmFunAlign, llvmInfAlign,
@@ -34,6 +34,7 @@ import Constants
import FastString
import OldCmm
import qualified Outputable as Outp
+import Platform
import UniqFM
import Unique
@@ -89,8 +90,8 @@ llvmFunTy :: LlvmType
llvmFunTy = LMFunction $ llvmFunSig' (fsLit "a") ExternallyVisible
-- | Llvm Function signature
-llvmFunSig :: CLabel -> LlvmLinkageType -> LlvmFunctionDecl
-llvmFunSig lbl link = llvmFunSig' (strCLabel_llvm lbl) link
+llvmFunSig :: LlvmEnv -> CLabel -> LlvmLinkageType -> LlvmFunctionDecl
+llvmFunSig env lbl link = llvmFunSig' (strCLabel_llvm env lbl) link
llvmFunSig' :: LMString -> LlvmLinkageType -> LlvmFunctionDecl
llvmFunSig' lbl link
@@ -100,10 +101,10 @@ llvmFunSig' lbl link
(map (toParams . getVarType) llvmFunArgs) llvmFunAlign
-- | Create a Haskell function in LLVM.
-mkLlvmFunc :: CLabel -> LlvmLinkageType -> LMSection -> LlvmBlocks
+mkLlvmFunc :: LlvmEnv -> CLabel -> LlvmLinkageType -> LMSection -> LlvmBlocks
-> LlvmFunction
-mkLlvmFunc lbl link sec blks
- = let funDec = llvmFunSig lbl link
+mkLlvmFunc env lbl link sec blks
+ = let funDec = llvmFunSig env lbl link
funArgs = map (fsLit . getPlainName) llvmFunArgs
in LlvmFunction funDec funArgs llvmStdFunAttrs sec blks
@@ -148,46 +149,51 @@ defaultLlvmVersion = 28
--
-- two maps, one for functions and one for local vars.
-newtype LlvmEnv = LlvmEnv (LlvmEnvMap, LlvmEnvMap, LlvmVersion)
+newtype LlvmEnv = LlvmEnv (LlvmEnvMap, LlvmEnvMap, LlvmVersion, Platform)
type LlvmEnvMap = UniqFM LlvmType
-- | Get initial Llvm environment.
-initLlvmEnv :: LlvmEnv
-initLlvmEnv = LlvmEnv (emptyUFM, emptyUFM, defaultLlvmVersion)
+initLlvmEnv :: Platform -> LlvmEnv
+initLlvmEnv platform = LlvmEnv (emptyUFM, emptyUFM, defaultLlvmVersion, platform)
-- | Clear variables from the environment.
clearVars :: LlvmEnv -> LlvmEnv
-clearVars (LlvmEnv (e1, _, n)) = LlvmEnv (e1, emptyUFM, n)
+clearVars (LlvmEnv (e1, _, n, p)) = LlvmEnv (e1, emptyUFM, n, p)
-- | Insert functions into the environment.
varInsert, funInsert :: Uniquable key => key -> LlvmType -> LlvmEnv -> LlvmEnv
-varInsert s t (LlvmEnv (e1, e2, n)) = LlvmEnv (e1, addToUFM e2 s t, n)
-funInsert s t (LlvmEnv (e1, e2, n)) = LlvmEnv (addToUFM e1 s t, e2, n)
+varInsert s t (LlvmEnv (e1, e2, n, p)) = LlvmEnv (e1, addToUFM e2 s t, n, p)
+funInsert s t (LlvmEnv (e1, e2, n, p)) = LlvmEnv (addToUFM e1 s t, e2, n, p)
-- | Lookup functions in the environment.
varLookup, funLookup :: Uniquable key => key -> LlvmEnv -> Maybe LlvmType
-varLookup s (LlvmEnv (_, e2, _)) = lookupUFM e2 s
-funLookup s (LlvmEnv (e1, _, _)) = lookupUFM e1 s
+varLookup s (LlvmEnv (_, e2, _, _)) = lookupUFM e2 s
+funLookup s (LlvmEnv (e1, _, _, _)) = lookupUFM e1 s
-- | Get the LLVM version we are generating code for
getLlvmVer :: LlvmEnv -> LlvmVersion
-getLlvmVer (LlvmEnv (_, _, n)) = n
+getLlvmVer (LlvmEnv (_, _, n, _)) = n
-- | Set the LLVM version we are generating code for
setLlvmVer :: LlvmVersion -> LlvmEnv -> LlvmEnv
-setLlvmVer n (LlvmEnv (e1, e2, _)) = LlvmEnv (e1, e2, n)
+setLlvmVer n (LlvmEnv (e1, e2, _, p)) = LlvmEnv (e1, e2, n, p)
+
+-- | Get the platform we are generating code for
+getLlvmPlatform :: LlvmEnv -> Platform
+getLlvmPlatform (LlvmEnv (_, _, _, p)) = p
-- ----------------------------------------------------------------------------
-- * Label handling
--
-- | Pretty print a 'CLabel'.
-strCLabel_llvm :: CLabel -> LMString
-strCLabel_llvm l = (fsLit . show . llvmSDoc . pprCLabel) l
+strCLabel_llvm :: LlvmEnv -> CLabel -> LMString
+strCLabel_llvm env l
+ = (fsLit . show . llvmSDoc . pprCLabel (getLlvmPlatform env)) l
-- | Create an external definition for a 'CLabel' defined in another module.
-genCmmLabelRef :: CLabel -> LMGlobal
-genCmmLabelRef = genStringLabelRef . strCLabel_llvm
+genCmmLabelRef :: LlvmEnv -> CLabel -> LMGlobal
+genCmmLabelRef env = genStringLabelRef . strCLabel_llvm env
-- | As above ('genCmmLabelRef') but taking a 'LMString', not 'CLabel'.
genStringLabelRef :: LMString -> LMGlobal