diff options
-rw-r--r-- | Makefile | 7 | ||||
-rw-r--r-- | configure.ac | 50 | ||||
-rw-r--r-- | mk/project.mk.in | 3 |
3 files changed, 60 insertions, 0 deletions
@@ -44,6 +44,13 @@ endif include mk/custom-settings.mk +# Verify that stage 0 LLVM backend isn't affected by Bug #9439 if needed +ifeq "$(GHC_LLVM_AFFECTED_BY_9439)" "1" +ifneq "$(findstring -fllvm,$(GhcHcOpts) $(GhcStage1HcOpts))" "" +$(error Stage 0 compiler is affected by Bug #9439. Refusing to bootstrap with -fllvm) +endif +endif + # No need to update makefiles for these targets: REALGOALS=$(filter-out binary-dist binary-dist-prep bootstrapping-files framework-pkg clean clean_% distclean maintainer-clean show echo help test fulltest,$(MAKECMDGOALS)) diff --git a/configure.ac b/configure.ac index a065b31255..1c72cfa3c2 100644 --- a/configure.ac +++ b/configure.ac @@ -189,6 +189,56 @@ AC_SUBST([WithGhc]) dnl ** Without optimization some INLINE trickery fails for GHCi SRC_CC_OPTS="-O" +dnl ** Bug 9439: Some GHC 7.8 releases had broken LLVM code generator. +dnl Unfortunately we don't know whether the user is going to request a +dnl build with the LLVM backend as this is only given in build.mk. +dnl +dnl Instead, we try to do as much work as possible here, checking +dnl whether -fllvm is the stage 0 compiler's default. If so we +dnl fail. If not, we check whether -fllvm is affected explicitly and +dnl if so set a flag. The build system will later check this flag +dnl after the desired build flags are known. +AC_MSG_CHECKING(whether bootstrap compiler is affected by bug 9439) +echo "main = putStrLn \"%function\"" > conftestghc.hs + +# Check whether LLVM backend is default for this platform +${WithGhc} conftestghc.hs 2>&1 >/dev/null +res=`./conftestghc` +if test "x$res" == "x%object" +then + AC_MSG_RESULT(yes) + echo "Buggy bootstrap compiler" + echo "" + echo "The stage 0 compiler $WithGhc is affected by GHC Bug \#9439" + echo "and therefore will miscompile the LLVM backend if -fllvm is" + echo "used." + echo + echo "Please use another bootstrap compiler" + exit 1 +fi + +# -fllvm is not the default, but set a flag so the Makefile can check +# -for it in the build flags later on +${WithGhc} -fforce-recomp -fllvm conftestghc.hs 2>&1 >/dev/null +if test $? == 0 +then + res=`./conftestghc` + if test "x$res" == "x%object" + then + AC_MSG_RESULT(yes) + GHC_LLVM_AFFECTED_BY_9439=1 + elif test "x$res" == "x%function" + then + AC_MSG_RESULT(no) + GHC_LLVM_AFFECTED_BY_9439=0 + else + AC_MSG_WARN(unexpected output $res) + fi +else + AC_MSG_RESULT(failed to compile, assuming no) +fi +AC_SUBST([GHC_LLVM_AFFECTED_BY_9439]) + dnl-------------------------------------------------------------------- dnl * Choose host(/target/build) platform dnl-------------------------------------------------------------------- diff --git a/mk/project.mk.in b/mk/project.mk.in index 28692d4cbb..69ed88575e 100644 --- a/mk/project.mk.in +++ b/mk/project.mk.in @@ -157,3 +157,6 @@ SOLARIS_BROKEN_SHLD=@SOLARIS_BROKEN_SHLD@ # Do we have a C compiler using an LLVM back end? CC_LLVM_BACKEND = @CC_LLVM_BACKEND@ CC_CLANG_BACKEND = @CC_CLANG_BACKEND@ + +# Is the stage0 compiler affected by Bug #9439? +GHC_LLVM_AFFECTED_BY_9439 = @GHC_LLVM_AFFECTED_BY_9439@ |