Unverified Commit 50a00d86 authored by Wolfgang Walther's avatar Wolfgang Walther Committed by GitHub
Browse files

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

parents a9b86987 fb5a523d
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -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)
+3 −7
Original line number Diff line number Diff line
@@ -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}";
+3 −7
Original line number Diff line number Diff line
@@ -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}";
+3 −7
Original line number Diff line number Diff line
@@ -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}";
+80 −0
Original line number Diff line number Diff line
#!@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[@]}"
Loading