diff --git a/llvm/utils/gn/build/BUILD.gn b/llvm/utils/gn/build/BUILD.gn --- a/llvm/utils/gn/build/BUILD.gn +++ b/llvm/utils/gn/build/BUILD.gn @@ -256,6 +256,27 @@ cflags += [ "-fsanitize=thread" ] ldflags += [ "-fsanitize=thread" ] } + + if (use_thinlto) { + assert(is_clang, "ThinLTO only supported on Clang") + + lto_opt_level = 2 + + cflags += [ "-flto=thin" ] + + if (host_os == "win") { + ldflags += [ + "/opt:lldlto=" + lto_opt_level, + "/opt:lldltojobs=" + max_jobs_per_lto_link, + ] + } else { + ldflags += [ + "-flto=thin", + "-Wl,--thinlto-jobs=" + max_jobs_per_lto_link, + "-Wl,--lto-O" + lto_opt_level, + ] + } + } } config("no_exceptions") { diff --git a/llvm/utils/gn/build/buildflags.gni b/llvm/utils/gn/build/buildflags.gni --- a/llvm/utils/gn/build/buildflags.gni +++ b/llvm/utils/gn/build/buildflags.gni @@ -10,16 +10,22 @@ # Whether to build with asan. use_asan = false -} - -# args that depend on other args must live in a later declare_args() block. -declare_args() { - # Whether to build with optimizations. - is_optimized = !is_debug # Whether to enable assertions. llvm_enable_assertions = true # Whether to enable expensive checks. llvm_enable_expensive_checks = false + + # Whether to build with ThinLTO. + use_thinlto = false + + # Max jobs per ThinLTO link. + max_jobs_per_lto_link = 8 +} + +# args that depend on other args must live in a later declare_args() block. +declare_args() { + # Whether to build with optimizations. + is_optimized = !is_debug }