Small DynFlags improvements
authorIan Lynagh <igloo@earth.li>
Sun, 1 May 2011 13:20:25 +0000 (14:20 +0100)
committerIan Lynagh <igloo@earth.li>
Sun, 1 May 2011 13:35:44 +0000 (14:35 +0100)
compiler/ghc.mk
compiler/main/DynFlags.hs
configure.ac

index e26149c..801b2fe 100644 (file)
@@ -96,6 +96,58 @@ compiler/stage%/build/Config.hs : mk/config.mk mk/project.mk | $$(dir $$@)/.
        @echo '#error Unknown target arch'                                  >> $@
        @echo '#endif'                                                      >> $@
        @echo                                                               >> $@
+# Sync this with checkOS in configure.ac
+       @echo 'cTargetOS :: OS'                                             >> $@
+       @echo '#if linux_TARGET_OS'                                         >> $@
+       @echo 'cTargetOS = Linux'                                           >> $@
+       @echo '#elif freebsd_TARGET_OS'                                     >> $@
+       @echo 'cTargetOS = FreeBSD'                                         >> $@
+       @echo '#elif netbsd_TARGET_OS'                                      >> $@
+       @echo 'cTargetOS = NetBSD'                                          >> $@
+       @echo '#elif openbsd_TARGET_OS'                                     >> $@
+       @echo 'cTargetOS = OpenBSD'                                         >> $@
+       @echo '#elif dragonfly_TARGET_OS'                                   >> $@
+       @echo 'cTargetOS = OtherOS "dragonfly"'                             >> $@
+       @echo '#elif osf1_TARGET_OS'                                        >> $@
+       @echo 'cTargetOS = OtherOS "osf"'                                   >> $@
+       @echo '#elif osf3_TARGET_OS'                                        >> $@
+       @echo 'cTargetOS = OtherOS "osf"'                                   >> $@
+       @echo '#elif hpux_TARGET_OS'                                        >> $@
+       @echo 'cTargetOS = HPUX'                                            >> $@
+       @echo '#elif linuxaout_TARGET_OS'                                   >> $@
+       @echo 'cTargetOS = Linux'                                           >> $@
+       @echo '#elif kfreebsdgnu_TARGET_OS'                                 >> $@
+       @echo 'cTargetOS = OtherOS "kfreebsdgnu"'                           >> $@
+       @echo '#elif freebsd2_TARGET_OS'                                    >> $@
+       @echo 'cTargetOS = FreeBSD'                                         >> $@
+       @echo '#elif solaris2_TARGET_OS'                                    >> $@
+       @echo 'cTargetOS = Solaris'                                         >> $@
+       @echo '#elif cygwin32_TARGET_OS'                                    >> $@
+       @echo 'cTargetOS = Windows'                                         >> $@
+       @echo '#elif mingw32_TARGET_OS'                                     >> $@
+       @echo 'cTargetOS = Windows'                                         >> $@
+       @echo '#elif darwin_TARGET_OS'                                      >> $@
+       @echo 'cTargetOS = OSX'                                             >> $@
+       @echo '#elif gnu_TARGET_OS'                                         >> $@
+       @echo 'cTargetOS = OtherOS "gnu"'                                   >> $@
+       @echo '#elif nextstep2_TARGET_OS'                                   >> $@
+       @echo 'cTargetOS = OtherOS "nextstep"'                              >> $@
+       @echo '#elif nextstep3_TARGET_OS'                                   >> $@
+       @echo 'cTargetOS = OtherOS "nextstep"'                              >> $@
+       @echo '#elif sunos4_TARGET_OS'                                      >> $@
+       @echo 'cTargetOS = Solaris'                                         >> $@
+       @echo '#elif ultrix_TARGET_OS'                                      >> $@
+       @echo 'cTargetOS = OtherOS "ultrix"'                                >> $@
+       @echo '#elif irix_TARGET_OS'                                        >> $@
+       @echo 'cTargetOS = IRIX'                                            >> $@
+       @echo '#elif aix_TARGET_OS'                                         >> $@
+       @echo 'cTargetOS = AIX'                                             >> $@
+       @echo '#elif haiku_TARGET_OS'                                       >> $@
+       @echo 'cTargetOS = OtherOS "haiku"'                                 >> $@
+       @echo '#else'                                                       >> $@
+       @echo '#error Unknown target OS'                                    >> $@
+       @echo '#endif'                                                      >> $@
+       @echo                                                               >> $@
        @echo 'cProjectName          :: String'                             >> $@
        @echo 'cProjectName          = "$(ProjectName)"'                    >> $@
        @echo 'cProjectVersion       :: String'                             >> $@
index e2103f9..522daa4 100644 (file)
@@ -111,6 +111,7 @@ import Data.List
 import Data.Map (Map)
 import qualified Data.Map as Map
 -- import Data.Maybe
+import Distribution.System
 import System.FilePath
 import System.IO        ( stderr, hPutChar )
 
@@ -403,7 +404,7 @@ data DynFlags = DynFlags {
                                        --   See CoreMonad.FloatOutSwitches
 
 #ifndef OMIT_NATIVE_CODEGEN
-  targetPlatform       :: Platform,    -- ^ The platform we're compiling for. Used by the NCG.
+  targetPlatform        :: Platform.Platform, -- ^ The platform we're compiling for. Used by the NCG.
 #endif
   cmdlineHcIncludes     :: [String],    -- ^ @\-\#includes@
   importPaths           :: [FilePath],
@@ -630,6 +631,14 @@ data HscTarget
   | HscNothing     -- ^ Don't generate any code.  See notes above.
   deriving (Eq, Show)
 
+showHscTargetFlag :: HscTarget -> String
+showHscTargetFlag HscC           = "-fvia-c"
+showHscTargetFlag HscAsm         = "-fasm"
+showHscTargetFlag HscLlvm        = "-fllvm"
+showHscTargetFlag HscJava        = panic "No flag for HscJava"
+showHscTargetFlag HscInterpreted = "-fbyte-code"
+showHscTargetFlag HscNothing     = "-fno-code"
+
 -- | Will this target result in an object file on the disk?
 isObjectTarget :: HscTarget -> Bool
 isObjectTarget HscC     = True
@@ -1100,12 +1109,13 @@ parseDynamicFlags_ dflags0 args pkg_flags = do
   when (not (null errs)) $ ghcError $ errorsToGhcException errs
 
   let (pic_warns, dflags2)
-#if !(x86_64_TARGET_ARCH && linux_TARGET_OS)
-        | (not opt_Static || opt_PIC) && hscTarget dflags1 == HscLlvm
+        | not (cTargetArch == X86_64 && cTargetOS == Linux) &&
+          (not opt_Static || opt_PIC) &&
+          hscTarget dflags1 == HscLlvm
         = ([L noSrcSpan $ "Warning: -fllvm is incompatible with -fPIC and -"
-                ++ "dynamic on this platform;\n              ignoring -fllvm"],
-                dflags1{ hscTarget = HscAsm })
-#endif
+                       ++ "dynamic on this platform;\n"
+                       ++ "         using " ++ showHscTargetFlag defaultObjectTarget ++ " instead"],
+                dflags1{ hscTarget = defaultObjectTarget })
         | otherwise = ([], dflags1)
 
   return (dflags2, leftover, pic_warns ++ warns)
index d2deeb6..4e9b548 100644 (file)
@@ -265,6 +265,7 @@ checkVendor() {
     esac
 }
 
+# Sync this with cTargetOS in compiler/ghc.mk
 checkOS() {
     case $1 in
     linux|freebsd|netbsd|openbsd|dragonfly|osf1|osf3|hpux|linuxaout|kfreebsdgnu|freebsd2|solaris2|cygwin32|mingw32|darwin|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix|haiku)