[commit: ghc] master: Do version specific detection of LLVM tools (#10170). (42448e3)

git at git.haskell.org git at git.haskell.org
Mon Mar 23 21:57:11 UTC 2015


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/42448e3757f25735a0a5b5e2b7ee456b5e8b0039/ghc

>---------------------------------------------------------------

commit 42448e3757f25735a0a5b5e2b7ee456b5e8b0039
Author: Erik de Castro Lopo <erikd at mega-nerd.com>
Date:   Fri Mar 20 12:16:23 2015 +1100

    Do version specific detection of LLVM tools (#10170).
    
    The LLVM developers seem to make breaking changes in the LLVM IR
    language between major releases. As a consumer of the LLVM tools
    GHC now needs to be locked more tightly to a single version of
    the LLVM tools.
    
    GHC HEAD currently only supports LLVM version 3.6. This commit
    changes the configure script to look for `llc-3.6` and `opt-3.6`
    before looking for `llc` and `opt`. If the former are not found,
    but the later are, check that they actually are version 3.6.
    
    At the same time, when detecting known problems with the LLVM
    tools (ie #9439) test for it using the versions of the LLVM tools
    retrieved from the bootstrap compiler's settings file.
    
    Test Plan: Manual testing.
    
    Reviewers: thomie, rwbarton, nomeata, austin
    
    Subscribers: thomie
    
    Differential Revision: https://phabricator.haskell.org/D745
    
    GHC Trac Issues: #10170


>---------------------------------------------------------------

42448e3757f25735a0a5b5e2b7ee456b5e8b0039
 aclocal.m4   | 55 ++++++++++++++++++++++++++++++-------------------------
 configure.ac | 27 ++++++++++++++++++++++-----
 2 files changed, 52 insertions(+), 30 deletions(-)

diff --git a/aclocal.m4 b/aclocal.m4
index 871dacc..5726a3f 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -2096,38 +2096,43 @@ AC_DEFUN([XCODE_VERSION],[
 # $1 = the variable to set
 # $2 = the with option name
 # $3 = the command to look for
+# $4 = the version of the command to look for
 #
 AC_DEFUN([FIND_LLVM_PROG],[
-    FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL_NOTARGET([$1], [$2], [$3])
+	# Test for program with version name.
+    FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL_NOTARGET([$1], [$2], [$3-$4])
     if test "$$1" = ""; then
-        echo -n "checking for $3-x.x... "
-        save_IFS=$IFS
-        IFS=":;"
-        if test "$windows" = YES; then
-            PERM=
-            MODE=
+		# Test for program without version name.
+		FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL_NOTARGET([$1], [$2], [$3])
+		AC_MSG_CHECKING([$$1 is version $4])
+		if test `$$1 --version | grep -c "version $4"` -gt 0 ; then
+            AC_MSG_RESULT(yes)
         else
-            # Search for executables.
-            PERM="-perm"
-            MODE="/+x"
-        fi
-        for p in ${PATH}; do
-            if test -d "${p}"; then
-                $1=`${FindCmd} "${p}" -maxdepth 1 \( -type f -o -type l \) ${PERM} ${MODE} -regex ".*/$3-[[0-9]]\.[[0-9]]" | ${SortCmd} -n | tail -1`
-                if test -n "$$1"; then
-                    break
-                fi
-            fi
-        done
-        IFS=$save_IFS
-        if test -n "$$1"; then
-            echo "$$1"
-        else
-            echo "no"
-        fi
+			AC_MSG_RESULT(no)
+			$1=""
+		fi
     fi
 ])
 
+# FIND_GHC_BOOTSTRAP_PROG()
+# --------------------------------
+# Parse the bootstrap GHC's compier settings file for the location of things
+# like the `llc` and `opt` commands.
+#
+# $1 = the variable to set
+# $2 = The bootstrap compiler.
+# $3 = The string to grep for to find the correct line.
+#
+AC_DEFUN([FIND_GHC_BOOTSTRAP_PROG],[
+	BootstrapTmpCmd=`grep $3 $($2 --print-libdir)/settings 2>/dev/null | sed 's/.*", "//;s/".*//'`
+	if test -n "$BootstrapTmpCmd" && test `basename $BootstrapTmpCmd` = $BootstrapTmpCmd ; then
+		AC_PATH_PROG([$1], [$BootstrapTmpCmd], "")
+	else
+		$1=$BootstrapTmpCmd
+	fi
+])
+
+
 # FIND_GCC()
 # --------------------------------
 # Finds where gcc is
diff --git a/configure.ac b/configure.ac
index e7d467f..fc6b3c2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -483,15 +483,21 @@ cygwin32|mingw32)
     ;;
 esac
 
+# Here is where we re-target which specific version of the LLVM
+# tools we are looking for. In the past, GHC supported a number of
+# versions of LLVM simultaneously, but that stopped working around
+# 3.5/3.6 release of LLVM.
+llvm_version=3.6
+
 dnl ** Which LLVM llc to use?
 dnl --------------------------------------------------------------
-FIND_LLVM_PROG([LLC], [llc], [llc])
+FIND_LLVM_PROG([LLC], [llc], [llc], [$llvm_version])
 LlcCmd="$LLC"
 AC_SUBST([LlcCmd])
 
 dnl ** Which LLVM opt to use?
 dnl --------------------------------------------------------------
-FIND_LLVM_PROG([OPT], [opt], [opt])
+FIND_LLVM_PROG([OPT], [opt], [opt], [$llvm_version])
 OptCmd="$OPT"
 AC_SUBST([OptCmd])
 
@@ -513,13 +519,24 @@ 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.
-if test -n "$LlcCmd" && test -n "$OptCmd"
+
+dnl This problem is further complicated by the fact that the llvm
+dnl version used by the bootstrap compiler may be different from the
+dnl version we arre trying to compile GHC against. Therefore, we need
+dnl to find the boostrap compiler's `settings` file then check to see
+dnl if the `opt` and `llc` command strings are non-empty and if these
+dnl programs exist. Only if they exist to we test for bug #9439.
+
+FIND_GHC_BOOTSTRAP_PROG([BootstrapLlcCmd], [${WithGhc}], "LLVM llc command")
+FIND_GHC_BOOTSTRAP_PROG([BootstrapOptCmd], [${WithGhc}], "LLVM opt command")
+
+if test -n "$BootstrapLlcCmd" && test -n "$BootstrapOptCmd"
 then
     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}" -pgmlc="${LlcCmd}" -pgmlo="${OptCmd}" conftestghc.hs 2>&1 >/dev/null
+    "${WithGhc}" -pgmlc="${BootstrapLlcCmd}" -pgmlo="${BootstrapOptCmd}" conftestghc.hs 2>&1 >/dev/null
     res=`./conftestghc`
     if test "x$res" = "x%object"
     then
@@ -536,7 +553,7 @@ then
 
     # -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 -pgmlc="${LlcCmd}" -pgmlo="${OptCmd}" -fllvm conftestghc.hs 2>&1 >/dev/null
+    "${WithGhc}" -fforce-recomp -pgmlc="${BootstrapLlcCmd}" -pgmlo="${BootstrapOptCmd}" -fllvm conftestghc.hs 2>&1 >/dev/null
     if test $? = 0
     then
         res=`./conftestghc`



More information about the ghc-commits mailing list