diff --git a/pkgs/development/compilers/ghc/9.0.2-binary.nix b/pkgs/development/compilers/ghc/9.0.2-binary.nix index 0b077dc8ae96a..e99a7fe331c89 100644 --- a/pkgs/development/compilers/ghc/9.0.2-binary.nix +++ b/pkgs/development/compilers/ghc/9.0.2-binary.nix @@ -11,6 +11,7 @@ numactl, libffi, llvmPackages, + replaceVarsWith, coreutils, targetPackages, @@ -214,6 +215,20 @@ let coreutils # for cat ] ++ lib.optionals useLLVM [ + # Allow the use of newer LLVM versions; see the script for details. + (replaceVarsWith { + name = "subopt"; + src = ./subopt.bash; + dir = "bin"; + isExecutable = true; + preBuild = '' + name=opt + ''; + replacements = { + inherit (stdenv) shell; + opt = lib.getExe' llvmPackages.llvm "opt"; + }; + }) (lib.getBin llvmPackages.llvm) ] # On darwin, we need unwrapped bintools as well (for otool) diff --git a/pkgs/development/compilers/ghc/9.2.4-binary.nix b/pkgs/development/compilers/ghc/9.2.4-binary.nix index 77986b76d64b6..d867b79266842 100644 --- a/pkgs/development/compilers/ghc/9.2.4-binary.nix +++ b/pkgs/development/compilers/ghc/9.2.4-binary.nix @@ -10,7 +10,6 @@ libiconv, numactl, libffi, - llvmPackages, coreutils, targetPackages, @@ -193,8 +192,6 @@ let ) binDistUsed.archSpecificLibraries )).nixPackage; - useLLVM = !(import ./common-have-ncg.nix { inherit lib stdenv version; }); - libPath = lib.makeLibraryPath ( # Add arch-specific libraries. map ({ nixPackage, ... }: nixPackage) binDistUsed.archSpecificLibraries @@ -207,9 +204,6 @@ let targetPackages.stdenv.cc.bintools coreutils # for cat ] - ++ lib.optionals useLLVM [ - (lib.getBin llvmPackages.llvm) - ] # On darwin, we need unwrapped bintools as well (for otool) ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ targetPackages.stdenv.cc.bintools.bintools @@ -217,6 +211,8 @@ let in +assert import ./common-have-ncg.nix { inherit lib stdenv version; }; + stdenv.mkDerivation { inherit version; pname = "ghc-binary${binDistUsed.variantSuffix}"; @@ -470,7 +466,7 @@ stdenv.mkDerivation { targetPrefix = ""; enableShared = true; - inherit llvmPackages; + llvmPackages = null; # Our Cabal compiler name haskellCompilerName = "ghc-${version}"; diff --git a/pkgs/development/compilers/ghc/9.6.3-binary.nix b/pkgs/development/compilers/ghc/9.6.3-binary.nix index 72367c6b3d80f..1557cb48a3df0 100644 --- a/pkgs/development/compilers/ghc/9.6.3-binary.nix +++ b/pkgs/development/compilers/ghc/9.6.3-binary.nix @@ -10,7 +10,6 @@ libiconv, numactl, libffi, - llvmPackages, coreutils, targetPackages, @@ -192,8 +191,6 @@ let ) binDistUsed.archSpecificLibraries )).nixPackage; - useLLVM = !(import ./common-have-ncg.nix { inherit lib stdenv version; }); - libPath = lib.makeLibraryPath ( # Add arch-specific libraries. map ({ nixPackage, ... }: nixPackage) binDistUsed.archSpecificLibraries @@ -206,9 +203,6 @@ let targetPackages.stdenv.cc.bintools coreutils # for cat ] - ++ lib.optionals useLLVM [ - (lib.getBin llvmPackages.llvm) - ] # On darwin, we need unwrapped bintools as well (for otool) ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ targetPackages.stdenv.cc.bintools.bintools @@ -216,6 +210,8 @@ let in +assert import ./common-have-ncg.nix { inherit lib stdenv version; }; + stdenv.mkDerivation { inherit version; pname = "ghc-binary${binDistUsed.variantSuffix}"; @@ -449,7 +445,7 @@ stdenv.mkDerivation { targetPrefix = ""; enableShared = true; - inherit llvmPackages; + llvmPackages = null; # Our Cabal compiler name haskellCompilerName = "ghc-${version}"; diff --git a/pkgs/development/compilers/ghc/9.8.4-binary.nix b/pkgs/development/compilers/ghc/9.8.4-binary.nix index e8e1e5e4397a9..b691715f8795c 100644 --- a/pkgs/development/compilers/ghc/9.8.4-binary.nix +++ b/pkgs/development/compilers/ghc/9.8.4-binary.nix @@ -9,7 +9,6 @@ libiconv, numactl, libffi, - llvmPackages, coreutils, targetPackages, @@ -206,8 +205,6 @@ let ) binDistUsed.archSpecificLibraries )).nixPackage; - useLLVM = !(import ./common-have-ncg.nix { inherit lib stdenv version; }); - libPath = lib.makeLibraryPath ( # Add arch-specific libraries. map ({ nixPackage, ... }: nixPackage) binDistUsed.archSpecificLibraries @@ -220,9 +217,6 @@ let targetPackages.stdenv.cc.bintools coreutils # for cat ] - ++ lib.optionals useLLVM [ - (lib.getBin llvmPackages.llvm) - ] # On darwin, we need unwrapped bintools as well (for otool) ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ targetPackages.stdenv.cc.bintools.bintools @@ -230,6 +224,8 @@ let in +assert import ./common-have-ncg.nix { inherit lib stdenv version; }; + stdenv.mkDerivation { inherit version; pname = "ghc-binary${binDistUsed.variantSuffix}"; @@ -464,7 +460,7 @@ stdenv.mkDerivation { targetPrefix = ""; enableShared = true; - inherit llvmPackages; + llvmPackages = null; # Our Cabal compiler name haskellCompilerName = "ghc-${version}"; diff --git a/pkgs/development/compilers/ghc/subopt.bash b/pkgs/development/compilers/ghc/subopt.bash new file mode 100644 index 0000000000000..1f3d3a3ebdcc5 --- /dev/null +++ b/pkgs/development/compilers/ghc/subopt.bash @@ -0,0 +1,80 @@ +#!@shell@ + +# This script wraps the LLVM `opt(1)` executable and maps the options +# passed by old versions of GHC to the equivalents passed by newer +# versions that support recent versions of LLVM. +# +# It achieves the same effect as the following GHC change externally: +# . +# +# This is used solely for bootstrapping newer GHCs from the GHC 9.0.2 +# binary on AArch64, as that is the only architecture supported by that +# binary distribution that requires LLVM, and our later binary packages +# all use the native code generator for all supported platforms. +# +# No attempt is made to support custom LLVM optimization flags, or the +# undocumented flag to disable TBAA, or avoid +# , as these are not +# required to bootstrap GHC and at worst will produce an error message. +# +# It is called `subopt` to reflect the fact that it uses `opt(1)` as a +# subprocess, and the fact that the GHC build system situation +# requiring this hack is suboptimal. + +set -e + +expect() { + if [[ $1 != $2 ]]; then + printf >&2 'subopt: got %q; expected %q\n' "$1" "$2" + return 2 + fi +} + +if [[ $NIX_DEBUG -ge 1 ]]; then + printf >&2 'subopt: before:' + printf >&2 ' %q' "$@" + printf >&2 '\n' +fi + +args=() + +while [[ $# -gt 0 ]]; do + case "$1" in + -enable-new-pm=0) + shift 1 + ;; + -mem2reg) + expect "$2" -globalopt + expect "$3" -lower-expect + expect "$4" -enable-tbaa + expect "$5" -tbaa + args+=('-passes=function(require),function(mem2reg),globalopt,function(lower-expect)') + shift 5 + ;; + -O1) + expect "$2" -globalopt + expect "$3" -enable-tbaa + expect "$4" -tbaa + args+=('-passes=default') + shift 4 + ;; + -O2) + expect "$2" -enable-tbaa + expect "$3" -tbaa + args+=('-passes=default') + shift 3 + ;; + *) + args+=("$1") + shift 1 + ;; + esac +done + +if [[ $NIX_DEBUG -ge 1 ]]; then + printf >&2 'subopt: after:' + printf >&2 ' %q' "${args[@]}" + printf >&2 '\n' +fi + +exec @opt@ "${args[@]}" diff --git a/pkgs/top-level/haskell-packages.nix b/pkgs/top-level/haskell-packages.nix index c6920778ef865..d9da08cfeb1b5 100644 --- a/pkgs/top-level/haskell-packages.nix +++ b/pkgs/top-level/haskell-packages.nix @@ -70,21 +70,16 @@ in bb = pkgsBuildBuild.haskell; in { + # Required to bootstrap 9.4.8. ghc902Binary = callPackage ../development/compilers/ghc/9.0.2-binary.nix { - llvmPackages = pkgs.llvmPackages_12; + llvmPackages = pkgs.llvmPackages_20; }; - ghc924Binary = callPackage ../development/compilers/ghc/9.2.4-binary.nix { - llvmPackages = pkgs.llvmPackages_12; - }; + ghc924Binary = callPackage ../development/compilers/ghc/9.2.4-binary.nix { }; - ghc963Binary = callPackage ../development/compilers/ghc/9.6.3-binary.nix { - llvmPackages = pkgs.llvmPackages_15; - }; + ghc963Binary = callPackage ../development/compilers/ghc/9.6.3-binary.nix { }; - ghc984Binary = callPackage ../development/compilers/ghc/9.8.4-binary.nix { - llvmPackages = pkgs.llvmPackages_15; - }; + ghc984Binary = callPackage ../development/compilers/ghc/9.8.4-binary.nix { }; ghc948 = callPackage ../development/compilers/ghc/9.4.8.nix { bootPkgs =