FIX #1427, #1569: gcc 4.2.x needs -fno-toplevel-reorder
[ghc-hetmet.git] / compiler / main / DynFlags.hs
index ce58c90..1721b4c 100644 (file)
@@ -470,7 +470,9 @@ defaultDynFlags =
         hpcDir                 = ".hpc",
 
        opt_L                   = [],
-       opt_P                   = [],
+       opt_P                   = (if opt_PIC
+                                  then ["-D__PIC__"]
+                                  else []),
        opt_F                   = [],
        opt_c                   = [],
        opt_a                   = [],
@@ -1513,6 +1515,18 @@ setOptHpcDir arg  = upd $ \ d -> d{hpcDir = arg}
 -----------------------------------------------------------------------------
 -- Via-C compilation stuff
 
+-- There are some options that we need to pass to gcc when compiling
+-- Haskell code via C, but are only supported by recent versions of
+-- gcc.  The configure script decides which of these options we need,
+-- and puts them in the file "extra-gcc-opts" in $topdir, which is
+-- read before each via-C compilation.  The advantage of having these
+-- in a separate file is that the file can be created at install-time
+-- depending on the available gcc version, and even re-generated  later
+-- if gcc is upgraded.
+--
+-- The options below are not dependent on the version of gcc, only the
+-- platform.
+
 machdepCCOpts :: DynFlags -> ([String], -- flags for all C compilations
                              [String]) -- for registerised HC compilations
 machdepCCOpts dflags
@@ -1555,20 +1569,6 @@ machdepCCOpts dflags
 --                    , if "mingw32" `isSuffixOf` cTARGETPLATFORM then "-mno-cygwin" else "" 
                      ],
                      [ "-fno-defer-pop",
-#ifdef HAVE_GCC_MNO_OMIT_LFPTR
-                       -- Some gccs are configured with
-                       -- -momit-leaf-frame-pointer on by default, and it
-                       -- apparently takes precedence over 
-                       -- -fomit-frame-pointer, so we disable it first here.
-                       "-mno-omit-leaf-frame-pointer",
-#endif
-#ifdef HAVE_GCC_HAS_NO_UNIT_AT_A_TIME
-                       "-fno-unit-at-a-time",
-                       -- unit-at-a-time doesn't do us any good, and screws
-                       -- up -split-objs by moving the split markers around.
-                       -- It's only turned on with -O2, but put it here just
-                       -- in case someone uses -optc-O2.
-#endif
                        "-fomit-frame-pointer",
                        -- we want -fno-builtin, because when gcc inlines
                        -- built-in functions like memcpy() it tends to
@@ -1587,13 +1587,6 @@ machdepCCOpts dflags
                        -- and get in the way of -split-objs.  Another option
                        -- would be to throw them away in the mangler, but this
                        -- is easier.
-#ifdef HAVE_GCC_HAS_NO_UNIT_AT_A_TIME
-                "-fno-unit-at-a-time",
-                       -- unit-at-a-time doesn't do us any good, and screws
-                       -- up -split-objs by moving the split markers around.
-                       -- It's only turned on with -O2, but put it here just
-                       -- in case someone uses -optc-O2.
-#endif
                 "-fno-builtin"
                        -- calling builtins like strlen() using the FFI can
                        -- cause gcc to run out of regs, so use the external
@@ -1628,15 +1621,18 @@ picCCOpts dflags
       --     in dynamic libraries.
 
     | opt_PIC
-        = ["-fno-common"]
+        = ["-fno-common", "-D__PIC__"]
     | otherwise
         = ["-mdynamic-no-pic"]
 #elif mingw32_TARGET_OS
       -- no -fPIC for Windows
+    | opt_PIC
+        = ["-D__PIC__"]
+    | otherwise
         = []
 #else
     | opt_PIC
-        = ["-fPIC"]
+        = ["-fPIC", "-D__PIC__"]
     | otherwise
         = []
 #endif