blob: f4fccc79552c7ea542dd0adc5f567bf138e9b2d6 [file] [log] [blame]
# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//build/config/lto/config.gni")
import("//build/toolchain/variant.gni")
# This config is added unconditionally by BUILDCONFIG.gn to pick up the
# global `use_lto` build argument. For fine-grained control, leave
# `use_lto=false` and use `select_variant` to choose the `lto` or `thinlto`
# variant for some components.
config("default") {
if (use_lto) {
if (use_thinlto) {
configs = [ ":thinlto" ]
} else {
configs = [ ":lto" ]
}
}
}
variant("lto") {
common_flags = [
"-flto",
# Enable whole-program devirtualization and virtual constant propagation.
"-fwhole-program-vtables",
]
# TODO(https://fxbug.dev/42061844): Temporarily disable branch funneling on lto. Branch
# funneling likely generates bad code involving return values not propagated
# correctly to other functions. Once this is resolved, come back and remove this.
if (is_fuchsia) {
disable_branch_funneling = "-wholeprogramdevirt-branch-funnel-threshold=0"
cflags = [
"-mllvm",
"$disable_branch_funneling",
]
ldflags = [ "-Wl,-mllvm,$disable_branch_funneling" ]
# TODO(https://fxbug.dev/42086180): The linker flags below are required to avoid code
# generation bugs during LTO. They can be removed once LTO properly handles
# target features
if (target_cpu == "riscv64") {
ldflags += [
"-Wl,-mllvm,-mattr=+c",
"-Wl,-mllvm,-mattr=+relax",
]
}
}
rustflags = [
"-Clto=fat",
"-Zdylib-lto",
]
}
variant("thinlto") {
common_flags = [ "-flto=thin" ]
# These switches have the same meaning but different spellings for
# lld-link vs ld.lld.
if (current_os == "win") {
_jobs = "/opt:lldltojobs="
_cache_dir = "/lldltocache:"
} else {
_jobs = "--thinlto-jobs="
_cache_dir = "--thinlto-cache-dir="
}
ldflags = [
# The ThinLTO driver launches a number of threads in parallel whose
# number is by default equivalent to the number of cores. We need
# to limit the parallelism to avoid aggressive competition between
# different linker jobs.
"-Wl,${_jobs}$thinlto_jobs",
# Set the ThinLTO cache directory which is used to cache native
# object files for ThinLTO incremental builds. This directory is
# not managed by Ninja and has to be cleaned manually, but it is
# periodically garbage-collected by the ThinLTO driver.
"-Wl,${_cache_dir}$thinlto_cache_dir",
]
# TODO(https://fxbug.dev/42086180): The linker flags below are required to avoid code
# generation bugs during LTO. They can be removed once LTO properly handles
# target features
if (target_cpu == "riscv64") {
ldflags += [
"-Wl,-mllvm,-mattr=+c",
"-Wl,-mllvm,-mattr=+relax",
]
}
rustflags = [
"-Clto=thin",
"-Zdylib-lto",
]
}