From 41f563b64122add41e2fcb539fed8865fafa0e8e Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Sun, 1 May 2011 14:20:25 +0100 Subject: [PATCH] Small DynFlags improvements --- compiler/ghc.mk | 52 +++++++++++++++++++++++++++++++++++++++++++++ compiler/main/DynFlags.hs | 22 +++++++++++++------ configure.ac | 1 + 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/compiler/ghc.mk b/compiler/ghc.mk index e26149c..801b2fe 100644 --- a/compiler/ghc.mk +++ b/compiler/ghc.mk @@ -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' >> $@ diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index e2103f9..522daa4 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -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) diff --git a/configure.ac b/configure.ac index d2deeb6..4e9b548 100644 --- a/configure.ac +++ b/configure.ac @@ -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) -- 1.7.10.4