X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FllvmGen%2FLlvmCodeGen%2FData.hs;h=3e486a544f33e9d087bcd46d10a6abd208a1300a;hp=a5b82aadf2252ac2c16d4e66da8d3d8f4a9f2c7f;hb=c5b178be60a5a44abd2f4ddf8c399857678326e2;hpb=49a8e5c021009430d373d6224b29004c7d18c408 diff --git a/compiler/llvmGen/LlvmCodeGen/Data.hs b/compiler/llvmGen/LlvmCodeGen/Data.hs index a5b82aa..3e486a5 100644 --- a/compiler/llvmGen/LlvmCodeGen/Data.hs +++ b/compiler/llvmGen/LlvmCodeGen/Data.hs @@ -13,9 +13,8 @@ import LlvmCodeGen.Base import BlockId import CLabel -import Cmm +import OldCmm -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 :: (Section, [CmmStatic]) -> LlvmUnresData +genLlvmData (sec, CmmDataLabel lbl:xs) = let static = map genData xs label = strCLabel_llvm lbl @@ -48,33 +47,46 @@ genLlvmData _ ( _ , (CmmDataLabel lbl):xs) = getStatTypes (Right x) = getStatType x strucTy = LMStruct types - alias = LMAlias (label `appendFS` structStr) strucTy - in (lbl, alias, static) + alias = LMAlias ((label `appendFS` structStr), strucTy) + in (lbl, sec, 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, sec, alias, unres) = let (env', static, refs) = resDatas env unres ([], []) refs' = catMaybes refs struct = Just $ LMStaticStruc static alias label = strCLabel_llvm lbl link = if (externallyVisibleCLabel lbl) then ExternallyVisible else Internal - glob = LMGlobalVar label alias link + const = isSecConstant sec + glob = LMGlobalVar label alias link Nothing Nothing const in (env', (refs' ++ [(glob, struct)], [alias])) +-- | Should a data in this section be considered constant +isSecConstant :: Section -> Bool +isSecConstant Text = True +isSecConstant Data = False +isSecConstant ReadOnlyData = True +isSecConstant RelocatableReadOnlyData = True +isSecConstant UninitialisedData = False +isSecConstant ReadOnlyData16 = True +isSecConstant (OtherSection _) = False + + -- ---------------------------------------------------------------------------- -- ** Resolve Data/CLabel references -- @@ -94,7 +106,7 @@ resDatas env (cmm : rest) (stats, globs) -- -- We check the 'LlvmEnv' to see if the reference has been defined in this -- module. If it has we can retrieve its type and make a pointer, otherwise --- we introduce a generic external defenition for the referenced label and +-- we introduce a generic external definition for the referenced label and -- then make a pointer. resData :: LlvmEnv -> UnresStatic -> (LlvmEnv, LlvmStatic, [Maybe LMGlobal]) @@ -114,7 +126,8 @@ resData env (Left cmm@(CmmLabel l)) = -- Referenced data exists in this module, retrieve type and make -- pointer to it. Just ty' -> - let var = LMGlobalVar label (LMPointer ty') ExternallyVisible + let var = LMGlobalVar label (LMPointer ty') + ExternallyVisible Nothing Nothing False ptr = LMStaticPointer var in (env, LMPtoI ptr lmty, [Nothing]) @@ -167,7 +180,7 @@ genStaticLit (CmmInt i w) = Right $ LMStaticLit (LMIntLit i (LMInt $ widthInBits w)) genStaticLit (CmmFloat r w) - = Right $ LMStaticLit (LMFloatLit r (widthToLlvmFloat w)) + = Right $ LMStaticLit (LMFloatLit (fromRational r) (widthToLlvmFloat w)) -- Leave unresolved, will fix later genStaticLit c@(CmmLabel _ ) = Left $ c