| # 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", |
| ] |
| } |