X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FllvmGen%2FLlvmCodeGen%2FPpr.hs;h=9f25c088260041b8684d329d24e84ec91d23cf08;hb=0af06ed99ed56341adfdda4a92a0a36678780109;hp=daadc55fff255520f56421a7656dc00d04a7dfa9;hpb=df1fecb95e3a0cf901184605da96dc8ae092b173;p=ghc-hetmet.git diff --git a/compiler/llvmGen/LlvmCodeGen/Ppr.hs b/compiler/llvmGen/LlvmCodeGen/Ppr.hs index daadc55..9f25c08 100644 --- a/compiler/llvmGen/LlvmCodeGen/Ppr.hs +++ b/compiler/llvmGen/LlvmCodeGen/Ppr.hs @@ -3,7 +3,7 @@ -- module LlvmCodeGen.Ppr ( - pprLlvmHeader, pprLlvmCmmTop, pprLlvmData + pprLlvmHeader, pprLlvmCmmTop, pprLlvmData, infoSection, iTableSuf ) where #include "HsVersions.h" @@ -13,13 +13,14 @@ import LlvmCodeGen.Base import LlvmCodeGen.Data import CLabel -import Cmm +import OldCmm import FastString import qualified Outputable import Pretty import Unique + -- ---------------------------------------------------------------------------- -- * Top level -- @@ -81,7 +82,7 @@ pprLlvmCmmTop :: LlvmEnv -> Int -> LlvmCmmTop -> (Doc, [LlvmVar]) pprLlvmCmmTop _ _ (CmmData _ lmdata) = (vcat $ map pprLlvmData lmdata, []) -pprLlvmCmmTop 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 pprInfoTable env count lbl static @@ -110,7 +111,7 @@ pprInfoTable env count lbl stat setSection ((LMGlobalVar _ ty l _ _ c), d) = let sec = mkLayoutSection count ilabel = strCLabel_llvm (entryLblToInfoLbl lbl) - `appendFS` (fsLit "_itable") + `appendFS` fsLit iTableSuf gv = LMGlobalVar ilabel ty l sec llvmInfAlign c v = if l == Internal then [gv] else [] in ((gv, d), v) @@ -122,19 +123,24 @@ pprInfoTable env count lbl stat else (pprLlvmData ([ldata'], ltypes), llvmUsed) --- | Create an appropriate section declaration for subsection of text --- WARNING: This technique could fail as gas documentation says it only --- supports up to 8192 subsections per section. Inspection of the source --- code and some test programs seem to suggest it supports more than this --- so we are hoping it does. +-- | We generate labels for info tables by converting them to the same label +-- as for the entry code but adding this string as a suffix. +iTableSuf :: String +iTableSuf = "_itable" + + +-- | Create a specially crafted section declaration that encodes the order this +-- section should be in the final object code. +-- +-- The LlvmMangler.llvmFixupAsm pass over the assembly produced by LLVM uses +-- this section declaration to do its processing. mkLayoutSection :: Int -> LMSection mkLayoutSection n -#if darwin_TARGET_OS - -- On OSX we can't use the GNU Assembler, we must use the OSX assembler, which - -- doesn't support subsections. So we post process the assembly code, this - -- section specifier will be replaced with '.text' by the mangler. - = Just (fsLit $ "__STRIP,__me" ++ show n) -#else - = Just (fsLit $ ".text # .text " ++ show n ++ " #") -#endif + = Just (fsLit $ infoSection ++ show n) + + +-- | The section we are putting info tables and their entry code into, should +-- be unique since we process the assembly pattern matching this. +infoSection :: String +infoSection = "X98A__STRIP,__me"