diff options
author | David Terei <davidterei@gmail.com> | 2010-06-21 12:52:20 +0000 |
---|---|---|
committer | David Terei <davidterei@gmail.com> | 2010-06-21 12:52:20 +0000 |
commit | 09e6aba8000ccf52943ada4fb9ac76e0d93a202f (patch) | |
tree | c0f513c69355bcc0b5bf2975e44708e0483407f7 /compiler/llvmGen/LlvmCodeGen | |
parent | 4bb4a1cfa8b88fefae3405d101dc6ff0f7adbae3 (diff) | |
download | haskell-09e6aba8000ccf52943ada4fb9ac76e0d93a202f.tar.gz |
Reduce the number of passes over the cmm in llvm BE
Diffstat (limited to 'compiler/llvmGen/LlvmCodeGen')
-rw-r--r-- | compiler/llvmGen/LlvmCodeGen/CodeGen.hs | 5 | ||||
-rw-r--r-- | compiler/llvmGen/LlvmCodeGen/Data.hs | 21 | ||||
-rw-r--r-- | compiler/llvmGen/LlvmCodeGen/Ppr.hs | 25 |
3 files changed, 25 insertions, 26 deletions
diff --git a/compiler/llvmGen/LlvmCodeGen/CodeGen.hs b/compiler/llvmGen/LlvmCodeGen/CodeGen.hs index f5c71ab2b9..13fe123f48 100644 --- a/compiler/llvmGen/LlvmCodeGen/CodeGen.hs +++ b/compiler/llvmGen/LlvmCodeGen/CodeGen.hs @@ -275,7 +275,7 @@ genCall env target res args ret = do CmmPrim mop -> do let name = cmmPrimOpFunctions mop let lbl = mkForeignLabel name Nothing - ForeignLabelInExternalPackage IsFunction + ForeignLabelInExternalPackage IsFunction getFunPtr $ CmmCallee (CmmLit (CmmLabel lbl)) CCallConv (env2, fptr, stmts2, top2) <- getFunPtr target @@ -335,7 +335,8 @@ arg_vars env (CmmHinted e AddrHint:rest) (vars, stmts, tops) ++ show a ++ ")" (v2, s1) <- doExpr i8Ptr $ Cast op v1 i8Ptr - arg_vars env' rest (vars ++ [v2], stmts `appOL` stmts' `snocOL` s1, tops ++ top') + arg_vars env' rest (vars ++ [v2], stmts `appOL` stmts' `snocOL` s1, + tops ++ top') arg_vars env (CmmHinted e _:rest) (vars, stmts, tops) = do (env', v1, stmts', top') <- exprToVar env e diff --git a/compiler/llvmGen/LlvmCodeGen/Data.hs b/compiler/llvmGen/LlvmCodeGen/Data.hs index e3d2adc079..13da03b840 100644 --- a/compiler/llvmGen/LlvmCodeGen/Data.hs +++ b/compiler/llvmGen/LlvmCodeGen/Data.hs @@ -15,7 +15,6 @@ import BlockId import CLabel import Cmm -import DynFlags import FastString import qualified Outputable @@ -38,8 +37,8 @@ structStr = fsLit "_struct" -- complete this completely though as we need to pass all CmmStatic -- sections before all references can be resolved. This last step is -- done by 'resolveLlvmData'. -genLlvmData :: DynFlags -> (Section, [CmmStatic]) -> LlvmUnresData -genLlvmData _ ( _ , (CmmDataLabel lbl):xs) = +genLlvmData :: [CmmStatic] -> LlvmUnresData +genLlvmData (CmmDataLabel lbl:xs) = let static = map genData xs label = strCLabel_llvm lbl @@ -51,20 +50,20 @@ genLlvmData _ ( _ , (CmmDataLabel lbl):xs) = alias = LMAlias (label `appendFS` structStr) strucTy in (lbl, alias, static) -genLlvmData _ _ = panic "genLlvmData: CmmData section doesn't start with label!" +genLlvmData _ = panic "genLlvmData: CmmData section doesn't start with label!" -resolveLlvmDatas :: DynFlags -> LlvmEnv -> [LlvmUnresData] -> [LlvmData] +resolveLlvmDatas :: LlvmEnv -> [LlvmUnresData] -> [LlvmData] -> (LlvmEnv, [LlvmData]) -resolveLlvmDatas _ env [] ldata +resolveLlvmDatas env [] ldata = (env, ldata) -resolveLlvmDatas dflags env (udata : rest) ldata - = let (env', ndata) = resolveLlvmData dflags env udata - in resolveLlvmDatas dflags env' rest (ldata ++ [ndata]) +resolveLlvmDatas env (udata : rest) ldata + = let (env', ndata) = resolveLlvmData env udata + in resolveLlvmDatas env' rest (ldata ++ [ndata]) -- | Fix up CLabel references now that we should have passed all CmmData. -resolveLlvmData :: DynFlags -> LlvmEnv -> LlvmUnresData -> (LlvmEnv, LlvmData) -resolveLlvmData _ env (lbl, alias, unres) = +resolveLlvmData :: LlvmEnv -> LlvmUnresData -> (LlvmEnv, LlvmData) +resolveLlvmData env (lbl, alias, unres) = let (env', static, refs) = resDatas env unres ([], []) refs' = catMaybes refs struct = Just $ LMStaticStruc static alias diff --git a/compiler/llvmGen/LlvmCodeGen/Ppr.hs b/compiler/llvmGen/LlvmCodeGen/Ppr.hs index 689be6c66c..5afbd174ce 100644 --- a/compiler/llvmGen/LlvmCodeGen/Ppr.hs +++ b/compiler/llvmGen/LlvmCodeGen/Ppr.hs @@ -15,7 +15,6 @@ import LlvmCodeGen.Data import CLabel import Cmm -import DynFlags import FastString import Pretty import Unique @@ -61,14 +60,14 @@ pprLlvmHeader = moduleLayout -- | Pretty print LLVM code -pprLlvmCmmTop :: DynFlags -> LlvmEnv -> Int -> LlvmCmmTop -> (Doc, [LlvmVar]) -pprLlvmCmmTop dflags _ _ (CmmData _ lmdata) - = (vcat $ map (pprLlvmData dflags) lmdata, []) +pprLlvmCmmTop :: LlvmEnv -> Int -> LlvmCmmTop -> (Doc, [LlvmVar]) +pprLlvmCmmTop _ _ (CmmData _ lmdata) + = (vcat $ map pprLlvmData lmdata, []) -pprLlvmCmmTop dflags env count (CmmProc info lbl _ (ListGraph blks)) +pprLlvmCmmTop env count (CmmProc info lbl _ (ListGraph blks)) = let static = CmmDataLabel lbl : info (idoc, ivar) = if not (null info) - then pprCmmStatic dflags env count static + then pprCmmStatic env count static else (empty, []) in (idoc $+$ ( let sec = mkLayoutSection (count + 1) @@ -87,18 +86,18 @@ pprLlvmCmmTop dflags env count (CmmProc info lbl _ (ListGraph blks)) -- | Pretty print LLVM data code -pprLlvmData :: DynFlags -> LlvmData -> Doc -pprLlvmData _ (globals, types) = +pprLlvmData :: LlvmData -> Doc +pprLlvmData (globals, types) = let globals' = ppLlvmGlobals globals types' = ppLlvmTypes types in types' $+$ globals' -- | Pretty print CmmStatic -pprCmmStatic :: DynFlags -> LlvmEnv -> Int -> [CmmStatic] -> (Doc, [LlvmVar]) -pprCmmStatic dflags env count stat - = let unres = genLlvmData dflags (Data,stat) - (_, (ldata, ltypes)) = resolveLlvmData dflags env unres +pprCmmStatic :: LlvmEnv -> Int -> [CmmStatic] -> (Doc, [LlvmVar]) +pprCmmStatic env count stat + = let unres = genLlvmData stat + (_, (ldata, ltypes)) = resolveLlvmData env unres setSection (gv@(LMGlobalVar s ty l _ _), d) = let v = if l == Internal then [gv] else [] @@ -107,7 +106,7 @@ pprCmmStatic dflags env count stat setSection v = (v,[]) (ldata', llvmUsed) = mapAndUnzip setSection ldata - in (pprLlvmData dflags (ldata', ltypes), concat llvmUsed) + in (pprLlvmData (ldata', ltypes), concat llvmUsed) -- | Create an appropriate section declaration for subsection <n> of text |