ghc/toplevel-reorder.patch

264 lines
9.4 KiB
Diff

--- ./distrib/configure-bin.ac.orig 2007-04-25 19:10:40.000000000 +0200
+++ ./distrib/configure-bin.ac 2007-09-03 15:18:46.000000000 +0200
@@ -139,7 +139,13 @@
AC_PROG_CPP
#
-AC_OUTPUT(Makefile)
+dnl ** Check gcc version and flags we need to pass it **
+#
+FP_GCC_EXTRA_FLAGS
+
+#
+AC_CONFIG_FILES(Makefile extra-gcc-opts)
+AC_OUTPUT
echo "****************************************************"
echo "Configuration done, ready to either 'make install'"
--- ./compiler/main/DriverPipeline.hs.orig 2007-04-25 19:10:40.000000000 +0200
+++ ./compiler/main/DriverPipeline.hs 2007-09-03 15:13:00.000000000 +0200
@@ -815,6 +815,7 @@
(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
@@ -881,6 +882,13 @@
++ (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 [])
@@ -890,10 +898,6 @@
++ 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)
--- ./compiler/main/DynFlags.hs.orig 2007-04-25 19:10:39.000000000 +0200
+++ ./compiler/main/DynFlags.hs 2007-09-03 15:13:00.000000000 +0200
@@ -1243,6 +1243,18 @@
-----------------------------------------------------------------------------
-- 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
@@ -1285,20 +1297,6 @@
-- , if suffixMatch "mingw32" 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
@@ -1317,13 +1315,6 @@
-- 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
--- ./compiler/main/SysTools.lhs.orig 2007-04-25 19:10:41.000000000 +0200
+++ ./compiler/main/SysTools.lhs 2007-09-03 15:13:00.000000000 +0200
@@ -22,6 +22,7 @@
copy,
copyWithHeader,
normalisePath, -- FilePath -> FilePath
+ getExtraViaCOpts,
-- Temporary-file management
setTmpDir,
@@ -518,6 +519,10 @@
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}
%************************************************************************
--- ./aclocal.m4.orig 2007-04-25 19:10:41.000000000 +0200
+++ ./aclocal.m4 2007-09-03 15:13:00.000000000 +0200
@@ -922,45 +922,47 @@
])# FP_GHC_HAS_READLINE
-# FP_GCC_NEEDS_NO_OMIT_LFPTR
-# --------------------------
+# FP_GCC_EXTRA_FLAGS
+# ------------------
+# Determine which extra flags we need to pass gcc when we invoke it
+# to compile .hc code.
+#
# Some OSs (Mandrake Linux, in particular) configure GCC with
-# -momit-leaf-frame-pointer on by default. If this is the case, we need to turn
-# it off for mangling to work. The test is currently a bit crude, using only the
-# version number of gcc. Defines HAVE_GCC_MNO_OMIT_LFPTR.
-AC_DEFUN([FP_GCC_NEEDS_NO_OMIT_LFPTR],
+# -momit-leaf-frame-pointer on by default. If this is the case, we
+# need to turn it off for mangling to work. The test is currently a
+# bit crude, using only the version number of gcc.
+#
+# -fwrapv is needed for gcc to emit well-behaved code in the presence of
+# integer wrap around. (Trac #952)
+#
+# -fno-unit-at-a-time or -fno-toplevel-reoder is necessary to avoid gcc
+# reordering things in the module and confusing the manger and/or splitter.
+# (eg. Trac #1427)
+#
+AC_DEFUN([FP_GCC_EXTRA_FLAGS],
[AC_REQUIRE([FP_HAVE_GCC])
-AC_CACHE_CHECK([whether gcc needs -mno-omit-leaf-frame-pointer], [fp_cv_gcc_needs_no_omit_lfptr],
-[FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.2],
- [fp_cv_gcc_needs_no_omit_lfptr=yes],
- [fp_cv_gcc_needs_no_omit_lfptr=no])])
-if test "$fp_cv_gcc_needs_no_omit_lfptr" = "yes"; then
- AC_DEFINE([HAVE_GCC_MNO_OMIT_LFPTR], [1], [Define to 1 if gcc supports -mno-omit-leaf-frame-pointer.])
-fi])# FP_GCC_NEEDS_NO_OMIT_LFPTR
-
-# FP_GCC_HAS_NO_UNIT_AT_A_TIME
-# --------------------------
-AC_DEFUN([FP_GCC_HAS_NO_UNIT_AT_A_TIME],
-[AC_REQUIRE([FP_HAVE_GCC])
-AC_CACHE_CHECK([whether gcc has -fno-unit-at-a-time], [fp_cv_gcc_has_no_unit_at_a_time],
-[FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.4],
- [fp_cv_gcc_has_no_unit_at_a_time=yes],
- [fp_cv_gcc_has_no_unit_at_a_time=no])])
-if test "$fp_cv_gcc_has_no_unit_at_a_time" = "yes"; then
- AC_DEFINE([HAVE_GCC_HAS_NO_UNIT_AT_A_TIME], [1], [Define to 1 if gcc supports -fno-unit-at-a-time.])
-fi])
-
-# FP_GCC_HAS_WRAPV
-# --------------------------
-AC_DEFUN([FP_GCC_HAS_WRAPV],
-[AC_REQUIRE([FP_HAVE_GCC])
-AC_CACHE_CHECK([whether gcc has -fwrapv], [fp_cv_gcc_has_wrapv],
-[FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.4],
- [fp_cv_gcc_has_wrapv=yes],
- [fp_cv_gcc_has_wrapv=no])])
-if test "$fp_cv_gcc_has_wrapv" = "yes"; then
- AC_DEFINE([HAVE_GCC_HAS_WRAPV], [1], [Define to 1 if gcc supports -fwrapv.])
-fi])
+AC_CACHE_CHECK([for extra options to pass gcc when compiling via C], [fp_cv_gcc_extra_opts],
+[fp_cv_gcc_extra_opts=
+ FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.4],
+ [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fwrapv"],
+ [])
+ case $TargetPlatform in
+ i386-*|x86_64-*)
+ FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.2],
+ [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -mno-omit-leaf-frame-pointer"],
+ [])
+ FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.4],
+ [FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [4.2],
+ [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fno-toplevel-reorder"],
+ [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fno-unit-at-a-time"]
+ )],
+ [])
+ ;;
+ esac
+])
+AC_SUBST([GccExtraViaCOpts],$fp_cv_gcc_extra_opts)
+])
+
# FP_SETUP_PROJECT_VERSION
# ---------------------
--- ./configure.ac.orig 2007-04-25 19:10:41.000000000 +0200
+++ ./configure.ac 2007-09-03 15:13:00.000000000 +0200
@@ -909,9 +909,7 @@
dnl
FP_HAVE_GCC
FP_MINGW_GCC
-FP_GCC_NEEDS_NO_OMIT_LFPTR
-FP_GCC_HAS_NO_UNIT_AT_A_TIME
-FP_GCC_HAS_WRAPV
+FP_GCC_EXTRA_FLAGS
dnl ** figure out how to invoke cpp directly (gcc -E is no good)
AC_PROG_CPP
@@ -1251,6 +1249,6 @@
fi
AC_SUBST([GTK_CONFIG])
-AC_CONFIG_FILES([mk/config.mk ghc.spec docs/users_guide/ug-book.xml])
+AC_CONFIG_FILES([mk/config.mk ghc.spec extra-gcc-opts docs/users_guide/ug-book.xml])
AC_CONFIG_COMMANDS([mk/stamp-h],[echo timestamp > mk/stamp-h])
AC_OUTPUT
--- ./Makefile.orig 2007-04-25 19:10:41.000000000 +0200
+++ ./Makefile 2007-09-03 15:17:11.000000000 +0200
@@ -171,6 +171,11 @@
endif
endif
+# Install gcc-extra-opts
+install ::
+ @$(INSTALL_DIR) $(libdir)
+ $(INSTALL_DATA) $(INSTALL_OPTS) extra-gcc-opts $(libdir)
+
install-docs ::
@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
for i in $(SUBDIRS); do \
@@ -232,6 +237,7 @@
LICENSE \
utils/mkdirhier/mkdirhier \
install-sh \
+ extra-gcc-opts.in \
config.guess \
config.sub \
aclocal.m4
--- ./extra-gcc-opts.in.orig 2007-09-03 15:55:59.000000000 +0200
+++ ./extra-gcc-opts.in 2007-09-03 15:13:00.000000000 +0200
@@ -0,0 +1 @@
+@GccExtraViaCOpts@