Bug 1747533 - Update clang pass manager flags handling. r=firefox-build-system-reviewers,andi

- Avoid the flag selection silently not enabling the new pass manager
  when --enable-new-pass-manager is passed explicitly.
- Avoid adding the -fexperimental-new-pass-manager to clang >= 13, which
  has it enabled by default. Likewise for the linker flags.
- Remove the force-enable of the new pass manager with clang < 12 on
  automation, since we're using version 13 anyways.
- Account for the fact that both lld and ld64 can pass the
  -import-hot-multiplier flag to the LTO plugin on mac builds, which
  effectively will set it for the first time on mac, and might improve
  performance.

Differential Revision: https://phabricator.services.mozilla.com/D134860
This commit is contained in:
Mike Hommey 2021-12-31 08:41:16 +00:00
Родитель 69654fc5e6
Коммит d179837cf2
3 изменённых файлов: 56 добавлений и 19 удалений

Просмотреть файл

@ -35,32 +35,68 @@ option(
enable_fuzzing,
ubsan,
)
def new_pass_manager_flags(enabled, compiler, host, target, pgo, enable_fuzzing, ubsan):
def pass_manager(enabled, compiler, host, target, pgo, enable_fuzzing, ubsan):
if compiler.type not in ("clang", "clang-cl"):
return None
# As of clang 13, the default pass manager is the new one.
if compiler.version >= "13.0.0":
if enabled:
return namespace(flags=None, enabled=True)
if compiler.type == "clang":
return namespace(flags=["-flegacy-pass-manager"], enabled=False)
if compiler.type == "clang-cl":
return namespace(flags=["-Xclang", "-flegacy-pass-manager"], enabled=False)
if not enabled:
return None
if compiler.version < "9.0.0":
if enabled.origin != "default":
die("--enable-new-pass-manager is only supported with clang >= 9")
return None
if host.os == "OSX":
# Some native Mac builds hang with the new pass manager. Given the
# inability to test in CI, don't take the risk of further breakage.
if enabled.origin != "default":
die(
"--enable-new-pass-manager causes problems on mac hosts with clang < 13"
)
return None
if target.os == "OSX" and not pgo:
# Also disable when cross-compiling to Mac, because plain-ish opt
# builds hang. Variants like asan and ccov work fine, but it would be
# too tedious to test them all here. PGO is the only thing that matters
# enough to make an exception for.
if enabled.origin != "default":
die(
"--enable-new-pass-manager causes problems on mac builds with clang < 13"
)
return None
if enable_fuzzing and compiler.version < "10.0.0":
# Clang 9 does not seem to play well with libFuzzer
if enabled.origin != "default":
die(
"--enable-new-pass-manager causes problems on fuzzing builds with clang < 10"
)
return None
if ubsan and compiler.version == "10.0.0":
# Clang 10.0.0 hangs with some ubsan-inserted code constructs.
# This was fixed in 10.0.1 (https://llvm.org/pr45835)
if enabled.origin != "default":
die(
"--enable-new-pass-manager causes problems with ubsan builds with clang 10.0.0"
)
return None
if enabled and compiler.version >= "9.0.0":
if compiler.type == "clang":
return ["-fexperimental-new-pass-manager"]
elif compiler.type == "clang-cl":
return ["-Xclang", "-fexperimental-new-pass-manager"]
if compiler.type == "clang":
return namespace(flags=["-fexperimental-new-pass-manager"], enabled=True)
elif compiler.type == "clang-cl":
return namespace(
flags=["-Xclang", "-fexperimental-new-pass-manager"], enabled=True
)
set_config("MOZ_NEW_PASS_MANAGER_FLAGS", new_pass_manager_flags)
set_config("MOZ_PASS_MANAGER_FLAGS", pass_manager.flags)
# Try to make builds more reproducible and allow sharing built artifacts across

Просмотреть файл

@ -183,22 +183,20 @@ imply_option("MOZ_LD64_KNOWN_GOOD", depends_if("MOZ_AUTOMATION")(lambda _: True)
"--enable-lto",
c_compiler,
select_linker,
"MOZ_AUTOMATION",
"MOZ_LD64_KNOWN_GOOD",
target,
"--enable-profile-generate",
new_pass_manager_flags,
pass_manager.enabled,
)
@imports("multiprocessing")
def lto(
value,
c_compiler,
select_linker,
automation,
ld64_known_good,
target,
instrumented_build,
newpm_flags,
pass_manager,
):
cflags = []
ldflags = []
@ -234,6 +232,7 @@ def lto(
target.kernel == "Darwin"
and target.os == "OSX"
and value == "cross"
and select_linker.KIND == "ld64"
and not ld64_known_good
):
die(
@ -315,15 +314,17 @@ def lto(
# If we're using the new pass manager, we can also enable the new PM
# during LTO. Further we can use the resulting size savings to increase
# the import limit in hot functions.
if newpm_flags:
if pass_manager:
if target.os == "WINNT":
# On Windows, this flag requires a change from clang-12, which
# is applied as a patch to our automation toolchain.
if automation or c_compiler.version >= "12.0.0":
if c_compiler.version >= "12.0.0" and c_compiler.version < "13.0.0":
ldflags.append("-opt:ltonewpassmanager")
if c_compiler.version >= "12.0.0":
ldflags.append("-mllvm:-import-hot-multiplier=30")
elif select_linker.KIND != "ld64" and c_compiler.type == "clang":
ldflags.append("-Wl,-plugin-opt=new-pass-manager")
elif target.os == "OSX":
ldflags.append("-Wl,-mllvm,-import-hot-multiplier=30")
else:
if c_compiler.version < "13.0.0":
ldflags.append("-Wl,-plugin-opt=new-pass-manager")
ldflags.append("-Wl,-plugin-opt=-import-hot-multiplier=30")
return namespace(

Просмотреть файл

@ -655,8 +655,8 @@ class CompileFlags(TargetCompileFlags):
("CXXFLAGS", "CFLAGS"),
),
(
"NEWPM",
context.config.substs.get("MOZ_NEW_PASS_MANAGER_FLAGS"),
"PASS_MANAGER",
context.config.substs.get("MOZ_PASS_MANAGER_FLAGS"),
("CXXFLAGS", "CFLAGS"),
),
(