buildMozillaMach: use llvmPackages_20 on aarch64-darwin

There's a bug in llvm 21 that makes Firefox crash on loading a PNG
favicon that is being investigated in Mozilla bug tracker:

https://bugzilla.mozilla.org/show_bug.cgi?id=1995582

While this is being fixed, switch to llvmPackages_20 for aarch64-darwin.
(x86_64-darwin is not affected.)

Note: this change will also affect Thunderbird. Though strictly speaking
not a required change because we are not aware of a specific issue with
Thunderbird (yet), I feel we may want to stick to the same LLVM for both
types of Mozilla apps while this is being investigated. It also
simplifies the code somewhat.

Fixes #453372
This commit is contained in:
Ihar Hrachyshka
2025-10-27 22:43:13 -04:00
parent 7231e23e22
commit 40eea21c1e
@@ -58,9 +58,7 @@ in
pkgsCross, # wasm32 rlbox
python3,
runCommand,
rustc,
rust-cbindgen,
rustPlatform,
unzip,
which,
wrapGAppsHook3,
@@ -201,9 +199,25 @@ assert elfhackSupport -> isElfhackPlatform stdenv;
let
inherit (lib) enableFeature;
rustPackages =
pkgs:
(pkgs.rust.override (
# aarch64-darwin firefox crashes on loading favicons due to a llvm 21 bug:
# https://github.com/NixOS/nixpkgs/issues/453372
# https://bugzilla.mozilla.org/show_bug.cgi?id=1995582#c16
lib.optionalAttrs (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64) {
llvmPackages = pkgs.llvmPackages_20;
}
)).packages.stable;
toRustC = pkgs: (rustPackages pkgs).rustc;
rustc = toRustC pkgs;
inherit (rustPackages pkgs) rustPlatform;
# Target the LLVM version that rustc is built with for LTO.
llvmPackages0 = rustc.llvmPackages;
llvmPackagesBuildBuild0 = pkgsBuildBuild.rustc.llvmPackages;
llvmPackagesBuildBuild0 = (toRustC pkgsBuildBuild).llvmPackages;
# Force the use of lld and other llvm tools for LTO
llvmPackages = llvmPackages0.override {
@@ -218,7 +232,7 @@ let
# LTO requires LLVM bintools including ld.lld and llvm-ar.
buildStdenv = overrideCC llvmPackages.stdenv (
llvmPackages.stdenv.cc.override {
bintools = if ltoSupport then buildPackages.rustc.llvmPackages.bintools else stdenv.cc.bintools;
bintools = if ltoSupport then (toRustC buildPackages).llvmPackages.bintools else stdenv.cc.bintools;
}
);