| Index: build/toolchain/gcc_toolchain.gni | 
| diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni | 
| index f38b5a3bfd50ef2fc47581e3dd9a826ecd3ddc82..4490de73afd7566b98eded60d0d8e60ff8bbff11 100644 | 
| --- a/build/toolchain/gcc_toolchain.gni | 
| +++ b/build/toolchain/gcc_toolchain.gni | 
| @@ -22,9 +22,9 @@ if (allow_posix_link_time_opt || is_cfi) { | 
| # (including clang). | 
| # | 
| # It requires the following variables specifying the executables to run: | 
| +#  - ar | 
| #  - cc | 
| #  - cxx | 
| -#  - ar | 
| #  - ld | 
| # and the following which is used in the toolchain_args | 
| #  - toolchain_cpu  (What "current_cpu" should be set to when invoking a | 
| @@ -34,6 +34,18 @@ if (allow_posix_link_time_opt || is_cfi) { | 
| # | 
| # Optional parameters that control the tools: | 
| # | 
| +#  - extra_cflags | 
| +#      Extra flags to be appended when compiling C files (but not C++ files). | 
| +#  - extra_cppflags | 
| +#      Extra flags to be appended when compiling both C and C++ files. "CPP" | 
| +#      stands for "C PreProcessor" in this context, although it can be | 
| +#      used for non-preprocessor flags as well. Not to be confused with | 
| +#      "CXX" (which follows). | 
| +#  - extra_cxxflags | 
| +#      Extra flags to be appended when compiling C++ files (but not C files). | 
| +#  - extra_ldflags | 
| +#      Extra flags to be appended when linking | 
| +# | 
| #  - libs_section_prefix | 
| #  - libs_section_postfix | 
| #      The contents of these strings, if specified, will be placed around | 
| @@ -94,9 +106,9 @@ if (allow_posix_link_time_opt || is_cfi) { | 
| #      toolchain has a custom link step that is not actually using Gold. | 
| template("gcc_toolchain") { | 
| toolchain(target_name) { | 
| +    assert(defined(invoker.ar), "gcc_toolchain() must specify a \"ar\" value") | 
| assert(defined(invoker.cc), "gcc_toolchain() must specify a \"cc\" value") | 
| assert(defined(invoker.cxx), "gcc_toolchain() must specify a \"cxx\" value") | 
| -    assert(defined(invoker.ar), "gcc_toolchain() must specify a \"ar\" value") | 
| assert(defined(invoker.ld), "gcc_toolchain() must specify a \"ld\" value") | 
| assert(defined(invoker.toolchain_cpu), | 
| "gcc_toolchain() must specify a \"toolchain_cpu\"") | 
| @@ -180,6 +192,30 @@ template("gcc_toolchain") { | 
| solink_libs_section_postfix = "" | 
| } | 
|  | 
| +    if (defined(invoker.extra_cflags) && invoker.extra_cflags != "") { | 
| +      extra_cflags = " " + invoker.extra_cflags | 
| +    } else { | 
| +      extra_cflags = "" | 
| +    } | 
| + | 
| +    if (defined(invoker.extra_cppflags) && invoker.extra_cppflags != "") { | 
| +      extra_cppflags = " " + invoker.extra_cppflags | 
| +    } else { | 
| +      extra_cppflags = "" | 
| +    } | 
| + | 
| +    if (defined(invoker.extra_cxxflags) && invoker.extra_cxxflags != "") { | 
| +      extra_cxxflags = " " + invoker.extra_cxxflags | 
| +    } else { | 
| +      extra_cxxflags = "" | 
| +    } | 
| + | 
| +    if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != "") { | 
| +      extra_ldflags = " " + invoker.extra_ldflags | 
| +    } else { | 
| +      extra_ldflags = "" | 
| +    } | 
| + | 
| # These library switches can apply to all tools below. | 
| lib_switch = "-l" | 
| lib_dir_switch = "-L" | 
| @@ -189,7 +225,7 @@ template("gcc_toolchain") { | 
|  | 
| tool("cc") { | 
| depfile = "{{output}}.d" | 
| -      command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}" | 
| +      command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cppflags}${extra_cflags} -c {{source}} -o {{output}}" | 
| depsformat = "gcc" | 
| description = "CC {{output}}" | 
| outputs = [ | 
| @@ -199,7 +235,7 @@ template("gcc_toolchain") { | 
|  | 
| tool("cxx") { | 
| depfile = "{{output}}.d" | 
| -      command = "$cxx -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}" | 
| +      command = "$cxx -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cppflags}${extra_cxxflags} -c {{source}} -o {{output}}" | 
| depsformat = "gcc" | 
| description = "CXX {{output}}" | 
| outputs = [ | 
| @@ -257,7 +293,7 @@ template("gcc_toolchain") { | 
| # .TOC file, overwrite it, otherwise, don't change it. | 
| tocfile = sofile + ".TOC" | 
|  | 
| -      link_command = "$ld -shared {{ldflags}} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\"" | 
| +      link_command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\"" | 
|  | 
| assert(defined(readelf), "to solink you must have a readelf") | 
| assert(defined(nm), "to solink you must have an nm") | 
| @@ -317,7 +353,7 @@ template("gcc_toolchain") { | 
| unstripped_sofile = sofile | 
| } | 
|  | 
| -      command = "$ld -shared {{ldflags}} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\"" | 
| +      command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\"" | 
|  | 
| if (defined(invoker.strip)) { | 
| strip_command = "${invoker.strip} --strip-unneeded -o \"$sofile\" \"$unstripped_sofile\"" | 
| @@ -368,7 +404,7 @@ template("gcc_toolchain") { | 
| unstripped_outfile = "{{root_out_dir}}/exe.unstripped/$exename" | 
| } | 
|  | 
| -      command = "$ld {{ldflags}} -o \"$unstripped_outfile\" -Wl,--start-group @\"$rspfile\" {{solibs}} -Wl,--end-group $libs_section_prefix {{libs}} $libs_section_postfix" | 
| +      command = "$ld {{ldflags}}${extra_ldflags} -o \"$unstripped_outfile\" -Wl,--start-group @\"$rspfile\" {{solibs}} -Wl,--end-group $libs_section_prefix {{libs}} $libs_section_postfix" | 
| if (defined(invoker.strip)) { | 
| link_wrapper = | 
| rebase_path("//build/toolchain/gcc_link_wrapper.py", root_build_dir) | 
| @@ -428,6 +464,9 @@ template("gcc_toolchain") { | 
| if (defined(invoker.use_gold)) { | 
| use_gold = invoker.use_gold | 
| } | 
| +      if (defined(invoker.use_sysroot)) { | 
| +        use_sysroot = invoker.use_sysroot | 
| +      } | 
|  | 
| if (defined(invoker.clear_sanitizers) && invoker.clear_sanitizers) { | 
| is_asan = false | 
|  |