diff options
author | Simon Marlow <simonmar@microsoft.com> | 2007-08-21 15:15:53 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2007-08-21 15:15:53 +0000 |
commit | 2ebe8addfaae2bc65e6b87ad369928b02053014f (patch) | |
tree | 40444e55dd6b6a6c3d1b575203b9ed140157f9dc /compiler | |
parent | 04a42d01c41923baf66eacabf6ffb22dfe367108 (diff) | |
download | haskell-2ebe8addfaae2bc65e6b87ad369928b02053014f.tar.gz |
FIX #1427, #1569: gcc 4.2.x needs -fno-toplevel-reorder
We now have various flags that need to be passed to gcc, but only if
the local gcc version supports them. So instead of wiring this
knowledge into ghc when it is built, we now put these "extra gcc
flags" into a text file in $libdir, extra-gcc-flags, which is created
by configure. It is also created by the configure script of a binary
distribution, so a binary dist is independent of the gcc version used
to build it.
Hopefully I got the binary-dist stuff right, but binary dists aren't
currently working so we'll need to come back and check this.
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/main/DriverPipeline.hs | 12 | ||||
-rw-r--r-- | compiler/main/DynFlags.hs | 33 | ||||
-rw-r--r-- | compiler/main/SysTools.lhs | 5 |
3 files changed, 25 insertions, 25 deletions
diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs index e414f4cb3d..cf6bff18ee 100644 --- a/compiler/main/DriverPipeline.hs +++ b/compiler/main/DriverPipeline.hs @@ -811,6 +811,7 @@ runPhase cc_phase stop dflags basename suff input_fn get_output_fn maybe_loc (cmdline_include_paths ++ pkg_include_dirs) let (md_c_flags, md_regd_c_flags) = machdepCCOpts dflags + gcc_extra_viac_flags <- getExtraViaCOpts dflags let pic_c_flags = picCCOpts dflags let verb = getVerbFlag dflags @@ -877,6 +878,13 @@ runPhase cc_phase stop dflags basename suff input_fn get_output_fn maybe_loc ++ (if hcc && mangle then md_regd_c_flags else []) + ++ (if hcc + then if mangle + then gcc_extra_viac_flags + else filter (=="-fwrapv") + gcc_extra_viac_flags + -- still want -fwrapv even for unreg'd + else []) ++ (if hcc then more_hcc_opts else []) @@ -886,10 +894,6 @@ runPhase cc_phase stop dflags basename suff input_fn get_output_fn maybe_loc ++ split_opt ++ include_paths ++ pkg_extra_cc_opts -#ifdef HAVE_GCC_HAS_WRAPV - -- We need consistent integer overflow (trac #952) - ++ ["-fwrapv"] -#endif )) return (next_phase, dflags, maybe_loc, output_fn) diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index 8880550fa3..1721b4c0b3 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -1515,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 @@ -1557,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 @@ -1589,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 diff --git a/compiler/main/SysTools.lhs b/compiler/main/SysTools.lhs index 64e7b7803f..e098dd9eab 100644 --- a/compiler/main/SysTools.lhs +++ b/compiler/main/SysTools.lhs @@ -22,6 +22,7 @@ module SysTools ( copy, copyWithHeader, normalisePath, -- FilePath -> FilePath + getExtraViaCOpts, -- Temporary-file management setTmpDir, @@ -536,6 +537,10 @@ copyWithHeader dflags purpose maybe_header from to = do hPutStr h ls hClose h +getExtraViaCOpts :: DynFlags -> IO [String] +getExtraViaCOpts dflags = do + f <- readFile (topDir dflags `joinFileName` "extra-gcc-opts") + return (words f) \end{code} %************************************************************************ |