зеркало из https://github.com/mozilla/gecko-dev.git
146 строки
5.4 KiB
Python
146 строки
5.4 KiB
Python
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
|
|
# vim: set filetype=python:
|
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
# We support C++14, but we don't want to enable the sized deallocation
|
|
# facilities in C++14 yet.
|
|
check_and_add_flag("-fno-sized-deallocation", compiler=cxx_compiler)
|
|
# Likewise for C++17 and aligned allocation. It's not immediately obvious
|
|
# from the clang and GCC documentation, but they both support this.
|
|
check_and_add_flag("-fno-aligned-new", compiler=cxx_compiler)
|
|
|
|
# Please keep these last in this file.
|
|
add_old_configure_assignment("_COMPILATION_CFLAGS", compilation_flags.cflags)
|
|
add_old_configure_assignment("_COMPILATION_CXXFLAGS", compilation_flags.cxxflags)
|
|
add_old_configure_assignment("_COMPILATION_HOST_CFLAGS", compilation_flags.host_cflags)
|
|
add_old_configure_assignment(
|
|
"_COMPILATION_HOST_CXXFLAGS", compilation_flags.host_cxxflags
|
|
)
|
|
|
|
|
|
option(
|
|
"--disable-new-pass-manager",
|
|
help="Use the legacy LLVM pass manager in clang builds",
|
|
)
|
|
|
|
|
|
@depends(
|
|
"--enable-new-pass-manager",
|
|
c_compiler,
|
|
host,
|
|
target,
|
|
"MOZ_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:
|
|
if compiler.version >= "15.0.0":
|
|
die("--disable-new-pass-manager is only supported with clang < 15")
|
|
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 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_PASS_MANAGER_FLAGS", pass_manager.flags)
|
|
|
|
|
|
# Try to make builds more reproducible and allow sharing built artifacts across
|
|
# source and object directories by using -ffile-prefix-map and friends. To
|
|
# "unwind" the prefix maps, use:
|
|
#
|
|
# (gdb) set substitute-path /topsrcdir/ $topsrcdir/
|
|
#
|
|
# (lldb) settings set target.source-map /topobjdir/ $topobjdir/
|
|
#
|
|
# See, for example, https://lldb.llvm.org/use/map.html.
|
|
@depends(
|
|
path_remapping,
|
|
path_remappings,
|
|
c_compiler,
|
|
)
|
|
@imports(_from="os", _import="sep")
|
|
def file_prefix_map_flags(path_remapping, path_remappings, compiler):
|
|
if "c" not in path_remapping:
|
|
return []
|
|
|
|
if (compiler.type == "gcc" and compiler.version < "8.1") or (
|
|
compiler.type in ("clang", "clang-cl") and compiler.version < "10.0.0"
|
|
):
|
|
die(
|
|
f"Compiler of type {compiler.type} and version {compiler.version} "
|
|
"does not support --enable-path-remapping."
|
|
)
|
|
|
|
flags = []
|
|
for old, new in path_remappings:
|
|
# We would prefer to use just -ffile-prefix-map, but clang-cl doesn't
|
|
# seem to recognize it.
|
|
for flag in ("-fdebug-prefix-map", "-fmacro-prefix-map"):
|
|
flag = f"{flag}={old}={new}"
|
|
if compiler.type in ("gcc", "clang"):
|
|
flags.append(flag)
|
|
elif compiler.type == "clang-cl":
|
|
flags.extend(["-Xclang", flag])
|
|
|
|
return flags
|
|
|
|
|
|
set_config("MOZ_FILE_PREFIX_MAP_FLAGS", file_prefix_map_flags)
|