haskell.compiler.ghc902Binary: bump LLVM by wrapping opt(1) (#440271)

This commit is contained in:
Wolfgang Walther
2025-09-07 18:14:38 +00:00
committed by GitHub
6 changed files with 109 additions and 31 deletions

View File

@@ -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)

View File

@@ -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}";

View File

@@ -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}";

View File

@@ -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}";

View File

@@ -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:
# <https://gitlab.haskell.org/ghc/ghc/-/merge_requests/8999>.
#
# 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
# <https://gitlab.haskell.org/ghc/ghc/-/issues/23870>, 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<tbaa>),function(mem2reg),globalopt,function(lower-expect)')
shift 5
;;
-O1)
expect "$2" -globalopt
expect "$3" -enable-tbaa
expect "$4" -tbaa
args+=('-passes=default<O1>')
shift 4
;;
-O2)
expect "$2" -enable-tbaa
expect "$3" -tbaa
args+=('-passes=default<O2>')
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[@]}"

View File

@@ -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 =