264 lines
9.4 KiB
Diff
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@
|