X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FllvmGen%2FLlvmCodeGen%2FData.hs;h=3cf6cdac852f757d0e3feec0349e5791116b7ecd;hp=13da03b8408eb0d3af5066a168091aa9cb278b5d;hb=3aadff5e31bf6b665cf7ae7606c94cdab85624d2;hpb=09e6aba8000ccf52943ada4fb9ac76e0d93a202f diff --git a/compiler/llvmGen/LlvmCodeGen/Data.hs b/compiler/llvmGen/LlvmCodeGen/Data.hs index 13da03b..3cf6cda 100644 --- a/compiler/llvmGen/LlvmCodeGen/Data.hs +++ b/compiler/llvmGen/LlvmCodeGen/Data.hs @@ -37,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 :: [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,10 +48,11 @@ genLlvmData (CmmDataLabel lbl:xs) = strucTy = LMStruct types alias = LMAlias (label `appendFS` structStr) strucTy - in (lbl, alias, static) + in (lbl, sec, alias, static) genLlvmData _ = panic "genLlvmData: CmmData section doesn't start with label!" + resolveLlvmDatas :: LlvmEnv -> [LlvmUnresData] -> [LlvmData] -> (LlvmEnv, [LlvmData]) resolveLlvmDatas env [] ldata @@ -63,17 +64,29 @@ resolveLlvmDatas env (udata : rest) ldata -- | Fix up CLabel references now that we should have passed all CmmData. resolveLlvmData :: LlvmEnv -> LlvmUnresData -> (LlvmEnv, LlvmData) -resolveLlvmData env (lbl, alias, unres) = +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 Nothing Nothing + 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 -- @@ -114,7 +127,7 @@ resData env (Left cmm@(CmmLabel l)) = -- pointer to it. Just ty' -> let var = LMGlobalVar label (LMPointer ty') - ExternallyVisible Nothing Nothing + ExternallyVisible Nothing Nothing False ptr = LMStaticPointer var in (env, LMPtoI ptr lmty, [Nothing])