| Index: build/toolchain/gcc_toolchain.gni
|
| diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni
|
| index 21985f88852ed678f085bdcb011f59d49234e0be..9a32ebcd5f5d95597e05e75b3798153d2a208199 100644
|
| --- a/build/toolchain/gcc_toolchain.gni
|
| +++ b/build/toolchain/gcc_toolchain.gni
|
| @@ -12,6 +12,11 @@ import("//build/toolchain/clang_static_analyzer.gni")
|
| import("//build/toolchain/goma.gni")
|
| import("//build/toolchain/toolchain.gni")
|
|
|
| +# Path to the Clang static analysis wrapper script.
|
| +analyzer_wrapper =
|
| + rebase_path("//build/toolchain/clang_static_analyzer_wrapper.py",
|
| + root_build_dir)
|
| +
|
| # This template defines a toolchain for something that works like gcc
|
| # (including clang).
|
| #
|
| @@ -126,22 +131,49 @@ template("gcc_toolchain") {
|
| } else {
|
| toolchain_cc_wrapper = cc_wrapper
|
| }
|
| + assert(!(toolchain_cc_wrapper != "" && toolchain_uses_goma),
|
| + "Goma and cc_wrapper can't be used together.")
|
|
|
| - # Compute the compiler prefix.
|
| + # When the invoker has explicitly overridden use_goma or cc_wrapper in the
|
| + # toolchain args, use those values, otherwise default to the global one.
|
| + # This works because the only reasonable override that toolchains might
|
| + # supply for these values are to force-disable them.
|
| if (toolchain_uses_goma) {
|
| - assert(toolchain_cc_wrapper == "",
|
| - "Goma and cc_wrapper can't be used together.")
|
| - compiler_prefix = "$goma_dir/gomacc "
|
| - } else if (toolchain_cc_wrapper != "") {
|
| - compiler_prefix = toolchain_cc_wrapper + " "
|
| + goma_path = "$goma_dir/gomacc"
|
| +
|
| + # Use the static analysis script if static analysis is turned on
|
| + # AND the tool has not opted out by setting
|
| + # 'is_clang_static_analysis_supported' to false.
|
| + if (is_clang && use_clang_static_analyzer &&
|
| + (!defined(invoker.is_clang_analysis_supported) ||
|
| + invoker.is_clang_analysis_supported)) {
|
| + compiler_prefix = "${analyzer_wrapper} ${goma_path} "
|
| +
|
| + # Create a distinct variable for "asm", since analysis runs pass
|
| + # a bunch of flags to clang/clang++ that are nonsensical on assembler
|
| + # runs.
|
| + asm = "${goma_path} ${invoker.cc}"
|
| + } else {
|
| + compiler_prefix = "${goma_path} "
|
| + }
|
| } else {
|
| - compiler_prefix = ""
|
| + if (is_clang && use_clang_static_analyzer &&
|
| + (!defined(invoker.is_clang_analysis_supported) ||
|
| + invoker.is_clang_analysis_supported)) {
|
| + compiler_prefix = "${analyzer_wrapper} "
|
| + asm = invoker.cc
|
| + } else {
|
| + compiler_prefix = "${toolchain_cc_wrapper} "
|
| + }
|
| }
|
|
|
| cc = compiler_prefix + invoker.cc
|
| cxx = compiler_prefix + invoker.cxx
|
| ar = invoker.ar
|
| ld = invoker.ld
|
| + if (!defined(asm)) {
|
| + asm = cc
|
| + }
|
| if (defined(invoker.readelf)) {
|
| readelf = invoker.readelf
|
| } else {
|
| @@ -263,7 +295,7 @@ template("gcc_toolchain") {
|
| tool("asm") {
|
| # For GCC we can just use the C compiler to compile assembly.
|
| depfile = "{{output}}.d"
|
| - command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}"
|
| + command = "$asm -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}"
|
| depsformat = "gcc"
|
| description = "ASM {{output}}"
|
| outputs = [
|
| @@ -518,34 +550,15 @@ template("clang_toolchain") {
|
| cc = "$prefix/clang"
|
| cxx = "$prefix/clang++"
|
| ld = cxx
|
| -
|
| - if (use_clang_static_analyzer) {
|
| - # Static analysis isn't supported under GOMA. See crbug.com/687245
|
| - # for progress on this issue.
|
| - assert(!use_goma, "'use_clang_static_analyzer' cannot be used with GOMA.")
|
| -
|
| - # Call "ccc-analyzer" or "c++-analyzer" instead of directly calling Clang.
|
| - # |wrapper_tool| sets the environment variables which are read by the
|
| - # analyzer tools.
|
| - analyzer_wrapper =
|
| - rebase_path("//build/toolchain/clang_static_analyzer_wrapper.py",
|
| - root_build_dir)
|
| - cc = analyzer_wrapper + " --clang-cc-path=${cc} --analyzer=" +
|
| - rebase_path("//third_party/scan-build/src/libexec/ccc-analyzer",
|
| - root_build_dir)
|
| - cxx = analyzer_wrapper + " --clang-cxx-path=${cxx} --analyzer=" +
|
| - rebase_path("//third_party/scan-build/src/libexec/c++-analyzer",
|
| - root_build_dir)
|
| - }
|
| -
|
| readelf = "${toolprefix}readelf"
|
| ar = "${toolprefix}ar"
|
| nm = "${toolprefix}nm"
|
|
|
| forward_variables_from(invoker,
|
| [
|
| - "enable_linker_map",
|
| "strip",
|
| + "is_clang_analysis_supported",
|
| + "enable_linker_map",
|
| ])
|
|
|
| toolchain_args = {
|
|
|