diff options
| author | David Terei <davidterei@gmail.com> | 2010-07-18 23:10:00 +0000 |
|---|---|---|
| committer | David Terei <davidterei@gmail.com> | 2010-07-18 23:10:00 +0000 |
| commit | efee3ecf26da95178b773ed68f33601e3fea2c23 (patch) | |
| tree | 1207bbd556ea4e8861551a3d52f699d4c041940f /compiler/llvmGen/LlvmCodeGen/Ppr.hs | |
| parent | 4029d85741ffa537084e97ba276605b6a443c304 (diff) | |
| download | haskell-efee3ecf26da95178b773ed68f33601e3fea2c23.tar.gz | |
LLVM: Use mangler to fix up stack alignment issues on OSX
Diffstat (limited to 'compiler/llvmGen/LlvmCodeGen/Ppr.hs')
| -rw-r--r-- | compiler/llvmGen/LlvmCodeGen/Ppr.hs | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/compiler/llvmGen/LlvmCodeGen/Ppr.hs b/compiler/llvmGen/LlvmCodeGen/Ppr.hs index 6c65f184a5..853f1b14c5 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" @@ -20,6 +20,7 @@ import qualified Outputable import Pretty import Unique + -- ---------------------------------------------------------------------------- -- * Top level -- @@ -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) @@ -121,6 +122,11 @@ pprInfoTable env count lbl stat then Outputable.panic "LlvmCodeGen.Ppr: invalid info table!" else (pprLlvmData ([ldata'], ltypes), llvmUsed) +-- | 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 an appropriate section declaration for subsection <n> of text -- WARNING: This technique could fail as gas documentation says it only @@ -129,12 +135,21 @@ pprInfoTable env count lbl stat -- so we are hoping it does. 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) + = Just (fsLit $ infoSection ++ show n +#if darwin_TARGET_OS + ) +#else + ++ "#") +#endif + +-- | The section we are putting info tables and their entry code into +infoSection :: String +#if darwin_TARGET_OS +infoSection = "__STRIP,__me" #else - = Just (fsLit $ ".text; .text " ++ show n ++ " #") +infoSection = ".text; .text " #endif |
