LLVM: Add support for 64bit OSX. (partial #4210)
authorDavid Terei <davidterei@gmail.com>
Sun, 1 May 2011 19:58:56 +0000 (05:58 +1000)
committerDavid Terei <davidterei@gmail.com>
Wed, 4 May 2011 22:00:59 +0000 (15:00 -0700)
compiler/llvmGen/LlvmMangler.hs
compiler/main/DynFlags.hs

index ac187e0..890f710 100644 (file)
@@ -12,6 +12,8 @@
 
 module LlvmMangler ( llvmFixupAsm ) where
 
+#include "HsVersions.h"
+
 import Control.Exception
 import qualified Data.ByteString.Char8 as B
 import Data.Char
@@ -23,14 +25,20 @@ infoSec, newInfoSec, newLine, spInst, jmpInst :: B.ByteString
 infoSec    = B.pack "\t.section\t__STRIP,__me"
 newInfoSec = B.pack "\n\t.text"
 newLine    = B.pack "\n"
-spInst     = B.pack ", %esp\n"
 jmpInst    = B.pack "\n\tjmp"
 
-infoLen, spFix, labelStart :: Int
-infoLen = B.length infoSec
-spFix   = 4
+infoLen, labelStart, spFix :: Int
+infoLen    = B.length infoSec
 labelStart = B.length jmpInst
 
+#if x86_64_TARGET_ARCH
+spInst     = B.pack ", %rsp\n"
+spFix      = 8
+#else
+spInst     = B.pack ", %esp\n"
+spFix      = 4
+#endif
+
 -- Search Predicates
 eolPred, dollarPred, commaPred :: Char -> Bool
 eolPred    = ((==) '\n')
index 1d2d1f5..4131a34 100644 (file)
@@ -1103,12 +1103,13 @@ parseDynamicFlags_ dflags0 args pkg_flags = do
   when (not (null errs)) $ ghcError $ errorsToGhcException errs
 
   let (pic_warns, dflags2)
-        | not (cTargetArch == X86_64 && cTargetOS == Linux) &&
+        | not (cTargetArch == X86_64 && (cTargetOS == Linux || cTargetOS == OSX)) &&
           (not opt_Static || opt_PIC) &&
           hscTarget dflags1 == HscLlvm
-        = ([L noSrcSpan $ "Warning: -fllvm is incompatible with -fPIC and -"
-                       ++ "dynamic on this platform;\n"
-                       ++ "         using " ++ showHscTargetFlag defaultObjectTarget ++ " instead"],
+        = ([L noSrcSpan $ "Warning: -fllvm is incompatible with -fPIC and "
+                       ++ "-dynamic on this platform;\n"
+                       ++ "         using "
+                       ++ showHscTargetFlag defaultObjectTarget ++ " instead"],
                 dflags1{ hscTarget = defaultObjectTarget })
         | otherwise = ([], dflags1)