Automatic code cleanup.

PiperOrigin-RevId: 234750806
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
index 5291383..a46e459 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -840,6 +840,9 @@
     }
 
     if (cppConfiguration.forcePic()) {
+      if (unsupportedFeatures.contains(CppRuleClasses.SUPPORTS_PIC)) {
+        throw new EvalException(/* location= */ null, PIC_CONFIGURATION_ERROR);
+      }
       allRequestedFeaturesBuilder.add(CppRuleClasses.SUPPORTS_PIC);
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
index e62d88d..fd599d7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
@@ -99,6 +99,12 @@
     return linkerInputArtifacts;
   }
 
+  @Nullable
+  @VisibleForTesting
+  public FeatureConfiguration getFeatureConfiguration() {
+    return featureConfiguration;
+  }
+
   /**
    * Returns the current type of link target set.
    */
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL b/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL
index a8bee88..b7ca89c 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL
@@ -1,408 +1,1009 @@
-# This test resource file is the default test setup - it largely matches what
-# we have in our repository cover; individual test cases can override this in
-# order to test more scenarios.
-
 major_version: "1"
 minor_version: "42"
-
 toolchain {
-  abi_version: "local"
-  abi_libc_version: "local"
-  builtin_sysroot: "/test/"
-  compiler: "compiler"
-  host_system_name: "local"
-  needsPic: true
-  supports_incremental_linker: false
-  supports_fission: false
-  supports_interface_shared_objects: false
-  supports_normalizing_ar: false
-  supports_start_end_lib: false
-  target_libc: "local"
-  target_cpu: "local"
-  target_system_name: "local"
   toolchain_identifier: "toolchain-identifier-local"
-
-  tool_path { name: "ar" path: "/usr/bin/ar" }
-  tool_path { name: "compat-ld" path: "/usr/bin/ld" }
-  tool_path { name: "cpp" path: "/usr/bin/cpp" }
-  tool_path { name: "dwp" path: "/usr/bin/dwp" }
-  tool_path { name: "gcc" path: "/usr/bin/gcc" }
-  cxx_flag: "-std=c++0x"
-  linker_flag: "-lstdc++"
-
-  # TODO(bazel-team): In theory, the path here ought to exactly match the path
-  # used by gcc. That works because bazel currently doesn't track files at
-  # absolute locations and has no remote execution, yet. However, this will need
-  # to be fixed, maybe with auto-detection?
-  cxx_builtin_include_directory: "/usr/lib/gcc/"
-  cxx_builtin_include_directory: "/usr/local/include"
-  cxx_builtin_include_directory: "/usr/include"
-  tool_path { name: "gcov" path: "/usr/bin/gcov" }
-
-  # C(++) compiles invoke the compiler (as that is the one knowing where
-  # to find libraries), but we provide LD so other rules can invoke the linker.
-  tool_path { name: "ld" path: "/usr/bin/ld" }
-
-  tool_path { name: "nm" path: "/usr/bin/nm" }
-  tool_path { name: "objcopy" path: "/usr/bin/objcopy" }
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  tool_path { name: "objdump" path: "/usr/bin/objdump" }
-  tool_path { name: "strip" path: "/usr/bin/strip" }
-  tool_path { name: "llvm-profdata" path: "/usr/bin/llvm-profdata" }
-
-  # Anticipated future default.
-  unfiltered_cxx_flag: "-no-canonical-prefixes"
-  unfiltered_cxx_flag: "-fno-canonical-system-headers"
-
-  # Make C++ compilation deterministic. Use linkstamping instead of these
-  # compiler symbols.
-  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
-  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
-
-  # Security hardening on by default.
-  # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
-  # We need to undef it before redefining it as some distributions now have
-  # it enabled by default.
-  compiler_flag: "-U_FORTIFY_SOURCE"
-  compiler_flag: "-D_FORTIFY_SOURCE=1"
-  compiler_flag: "-fstack-protector"
-  linker_flag: "-Wl,-z,relro,-z,now"
-
-  # Enable coloring even if there's no attached terminal. Bazel removes the
-  # escape sequences if --nocolor is specified. This isn't supported by gcc
-  # on Ubuntu 14.04.
-  # compiler_flag: "-fcolor-diagnostics"
-
-  # All warnings are enabled. Maybe enable -Werror as well?
-  compiler_flag: "-Wall"
-  # Enable a few more warnings that aren't part of -Wall.
-  compiler_flag: "-Wunused-but-set-parameter"
-  # But disable some that are problematic.
-  compiler_flag: "-Wno-free-nonheap-object" # has false positives
-
-  # Keep stack frames for debugging, even in opt mode.
-  compiler_flag: "-fno-omit-frame-pointer"
-
-  # Anticipated future default.
-  linker_flag: "-no-canonical-prefixes"
-  # Have gcc return the exit code from ld.
-  linker_flag: "-pass-exit-codes"
-  # Gold linker only? Can we enable this by default?
-  # linker_flag: "-Wl,--warn-execstack"
-  # linker_flag: "-Wl,--detect-odr-violations"
-
-  compilation_mode_flags {
-    mode: DBG
-    # Enable debug symbols.
-    compiler_flag: "-g"
-  }
-  compilation_mode_flags {
-    mode: OPT
-
-    # No debug symbols.
-    # Maybe we should enable https://gcc.gnu.org/wiki/DebugFission for opt or
-    # even generally? However, that can't happen here, as it requires special
-    # handling in Bazel.
-    compiler_flag: "-g0"
-
-    # Conservative choice for -O
-    # -O3 can increase binary size and even slow down the resulting binaries.
-    # Profile first and / or use FDO if you need better performance than this.
-    compiler_flag: "-O2"
-
-    # Disable assertions
-    compiler_flag: "-DNDEBUG"
-
-    # Removal of unused code and data at link time (can this increase binary size in some cases?).
-    compiler_flag: "-ffunction-sections"
-    compiler_flag: "-fdata-sections"
-    linker_flag: "-Wl,--gc-sections"
-  }
-  linking_mode_flags { mode: DYNAMIC }
-}
-
-toolchain {
+  host_system_name: "local"
+  target_system_name: "local"
+  target_cpu: "local"
+  target_libc: "local"
+  compiler: "compiler"
   abi_version: "local"
   abi_libc_version: "local"
-  builtin_sysroot: "/test/"
-  compiler: "compiler"
-  host_system_name: "local"
-  needsPic: true
-  supports_incremental_linker: false
-  supports_fission: false
-  supports_interface_shared_objects: false
-  supports_normalizing_ar: false
-  supports_start_end_lib: false
-  target_libc: "local"
-  target_cpu: "ppc"
-  target_system_name: "local"
-  toolchain_identifier: "toolchain-identifier-ppc"
-
-  tool_path { name: "ar" path: "/usr/bin/ar" }
-  tool_path { name: "compat-ld" path: "/usr/bin/ld" }
-  tool_path { name: "cpp" path: "/usr/bin/cpp" }
-  tool_path { name: "dwp" path: "/usr/bin/dwp" }
-  tool_path { name: "gcc" path: "/usr/bin/gcc" }
-  cxx_flag: "-std=c++0x"
-  linker_flag: "-lstdc++"
-
-  # TODO(bazel-team): In theory, the path here ought to exactly match the path
-  # used by gcc. That works because bazel currently doesn't track files at
-  # absolute locations and has no remote execution, yet. However, this will need
-  # to be fixed, maybe with auto-detection?
+  tool_path {
+    name: "ar"
+    path: "/usr/bin/ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "/usr/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "/usr/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "/usr/bin/gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "/usr/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "/usr/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "/usr/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "/usr/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "/usr/bin/strip"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "/usr/bin/llvm-profdata"
+  }
   cxx_builtin_include_directory: "/usr/lib/gcc/"
   cxx_builtin_include_directory: "/usr/local/include"
   cxx_builtin_include_directory: "/usr/include"
-  tool_path { name: "gcov" path: "/usr/bin/gcov" }
-
-  # C(++) compiles invoke the compiler (as that is the one knowing where
-  # to find libraries), but we provide LD so other rules can invoke the linker.
-  tool_path { name: "ld" path: "/usr/bin/ld" }
-
-  tool_path { name: "nm" path: "/usr/bin/nm" }
-  tool_path { name: "objcopy" path: "/usr/bin/objcopy" }
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  tool_path { name: "objdump" path: "/usr/bin/objdump" }
-  tool_path { name: "strip" path: "/usr/bin/strip" }
-  tool_path { name: "llvm-profdata" path: "/usr/bin/llvm-profdata" }
-
-  # Anticipated future default.
-  unfiltered_cxx_flag: "-no-canonical-prefixes"
-  unfiltered_cxx_flag: "-fno-canonical-system-headers"
-
-  # Make C++ compilation deterministic. Use linkstamping instead of these
-  # compiler symbols.
-  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
-  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
-
-  # Security hardening on by default.
-  # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
-  # We need to undef it before redefining it as some distributions now have
-  # it enabled by default.
-  compiler_flag: "-U_FORTIFY_SOURCE"
-  compiler_flag: "-D_FORTIFY_SOURCE=1"
-  compiler_flag: "-fstack-protector"
-  linker_flag: "-Wl,-z,relro,-z,now"
-
-  # Enable coloring even if there's no attached terminal. Bazel removes the
-  # escape sequences if --nocolor is specified. This isn't supported by gcc
-  # on Ubuntu 14.04.
-  # compiler_flag: "-fcolor-diagnostics"
-
-  # All warnings are enabled. Maybe enable -Werror as well?
-  compiler_flag: "-Wall"
-  # Enable a few more warnings that aren't part of -Wall.
-  compiler_flag: "-Wunused-but-set-parameter"
-  # But disable some that are problematic.
-  compiler_flag: "-Wno-free-nonheap-object" # has false positives
-
-  # Keep stack frames for debugging, even in opt mode.
-  compiler_flag: "-fno-omit-frame-pointer"
-
-  # Anticipated future default.
-  linker_flag: "-no-canonical-prefixes"
-  # Have gcc return the exit code from ld.
-  linker_flag: "-pass-exit-codes"
-  # Gold linker only? Can we enable this by default?
-  # linker_flag: "-Wl,--warn-execstack"
-  # linker_flag: "-Wl,--detect-odr-violations"
-
-  compilation_mode_flags {
-    mode: DBG
-    # Enable debug symbols.
-    compiler_flag: "-g"
+  builtin_sysroot: "/test/"
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-U_FORTIFY_SOURCE"
+        flag: "-D_FORTIFY_SOURCE=1"
+        flag: "-fstack-protector"
+        flag: "-Wall"
+        flag: "-Wunused-but-set-parameter"
+        flag: "-Wno-free-nonheap-object"
+        flag: "-fno-omit-frame-pointer"
+      }
+    }
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-g"
+      }
+      with_feature {
+        feature: "dbg"
+      }
+    }
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-g0"
+        flag: "-O2"
+        flag: "-DNDEBUG"
+        flag: "-ffunction-sections"
+        flag: "-fdata-sections"
+      }
+      with_feature {
+        feature: "opt"
+      }
+    }
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=c++0x"
+      }
+    }
+    enabled: true
   }
-  compilation_mode_flags {
-    mode: OPT
-
-    # No debug symbols.
-    # Maybe we should enable https://gcc.gnu.org/wiki/DebugFission for opt or
-    # even generally? However, that can't happen here, as it requires special
-    # handling in Bazel.
-    compiler_flag: "-g0"
-
-    # Conservative choice for -O
-    # -O3 can increase binary size and even slow down the resulting binaries.
-    # Profile first and / or use FDO if you need better performance than this.
-    compiler_flag: "-O2"
-
-    # Disable assertions
-    compiler_flag: "-DNDEBUG"
-
-    # Removal of unused code and data at link time (can this increase binary size in some cases?).
-    compiler_flag: "-ffunction-sections"
-    compiler_flag: "-fdata-sections"
-    linker_flag: "-Wl,--gc-sections"
+  feature {
+    name: "default_link_flags"
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-lstdc++"
+        flag: "-Wl,-z,relro,-z,now"
+        flag: "-no-canonical-prefixes"
+        flag: "-pass-exit-codes"
+      }
+    }
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-Wl,--gc-sections"
+      }
+      with_feature {
+        feature: "opt"
+      }
+    }
+    enabled: true
   }
-  linking_mode_flags { mode: DYNAMIC }
+  feature {
+    name: "supports_dynamic_linker"
+    enabled: true
+  }
+  feature {
+    name: "supports_pic"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "opt"
+  }
+  feature {
+    name: "dbg"
+  }
+  feature {
+    name: "user_compile_flags"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "%{user_compile_flags}"
+        iterate_over: "user_compile_flags"
+        expand_if_all_available: "user_compile_flags"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "sysroot"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "--sysroot=%{sysroot}"
+        expand_if_all_available: "sysroot"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "unfiltered_compile_flags"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-no-canonical-prefixes"
+        flag: "-fno-canonical-system-headers"
+        flag: "-Wno-builtin-macro-redefined"
+        flag: "-D__DATE__=\"redacted\""
+        flag: "-D__TIMESTAMP__=\"redacted\""
+        flag: "-D__TIME__=\"redacted\""
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "/usr/bin/objcopy"
+    }
+    enabled: true
+  }
 }
-
+toolchain {
+  toolchain_identifier: "toolchain-identifier-ppc"
+  host_system_name: "local"
+  target_system_name: "local"
+  target_cpu: "ppc"
+  target_libc: "local"
+  compiler: "compiler"
+  abi_version: "local"
+  abi_libc_version: "local"
+  tool_path {
+    name: "ar"
+    path: "/usr/bin/ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "/usr/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "/usr/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "/usr/bin/gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "/usr/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "/usr/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "/usr/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "/usr/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "/usr/bin/strip"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "/usr/bin/llvm-profdata"
+  }
+  cxx_builtin_include_directory: "/usr/lib/gcc/"
+  cxx_builtin_include_directory: "/usr/local/include"
+  cxx_builtin_include_directory: "/usr/include"
+  builtin_sysroot: "/test/"
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-U_FORTIFY_SOURCE"
+        flag: "-D_FORTIFY_SOURCE=1"
+        flag: "-fstack-protector"
+        flag: "-Wall"
+        flag: "-Wunused-but-set-parameter"
+        flag: "-Wno-free-nonheap-object"
+        flag: "-fno-omit-frame-pointer"
+      }
+    }
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-g"
+      }
+      with_feature {
+        feature: "dbg"
+      }
+    }
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-g0"
+        flag: "-O2"
+        flag: "-DNDEBUG"
+        flag: "-ffunction-sections"
+        flag: "-fdata-sections"
+      }
+      with_feature {
+        feature: "opt"
+      }
+    }
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=c++0x"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "default_link_flags"
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-lstdc++"
+        flag: "-Wl,-z,relro,-z,now"
+        flag: "-no-canonical-prefixes"
+        flag: "-pass-exit-codes"
+      }
+    }
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-Wl,--gc-sections"
+      }
+      with_feature {
+        feature: "opt"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "supports_dynamic_linker"
+    enabled: true
+  }
+  feature {
+    name: "supports_pic"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "opt"
+  }
+  feature {
+    name: "dbg"
+  }
+  feature {
+    name: "user_compile_flags"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "%{user_compile_flags}"
+        iterate_over: "user_compile_flags"
+        expand_if_all_available: "user_compile_flags"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "sysroot"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "--sysroot=%{sysroot}"
+        expand_if_all_available: "sysroot"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "unfiltered_compile_flags"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-no-canonical-prefixes"
+        flag: "-fno-canonical-system-headers"
+        flag: "-Wno-builtin-macro-redefined"
+        flag: "-D__DATE__=\"redacted\""
+        flag: "-D__TIMESTAMP__=\"redacted\""
+        flag: "-D__TIME__=\"redacted\""
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "/usr/bin/objcopy"
+    }
+    enabled: true
+  }
+}
 toolchain {
   toolchain_identifier: "toolchain-identifier-k8"
-
   host_system_name: "local"
   target_system_name: "local"
   target_cpu: "k8"
   target_libc: "local"
   compiler: "compiler"
-  linking_mode_flags { mode: DYNAMIC }
-
   abi_version: "local"
   abi_libc_version: "local"
-
-  tool_path { name: "ar" path: "/usr/bin/ar" }
-  tool_path { name: "compat-ld" path: "/usr/bin/ld" }
-  tool_path { name: "cpp" path: "/usr/bin/cpp" }
-  tool_path { name: "dwp" path: "/usr/bin/dwp" }
-  tool_path { name: "gcc" path: "/usr/bin/gcc" }
-  tool_path { name: "gcov" path: "/usr/bin/gcov" }
-  tool_path { name: "ld" path: "/usr/bin/ld" }
-  tool_path { name: "nm" path: "/usr/bin/nm" }
-  tool_path { name: "objcopy" path: "/usr/bin/objcopy" }
-  tool_path { name: "objdump" path: "/usr/bin/objdump" }
-  tool_path { name: "strip" path: "/usr/bin/strip" }
-  tool_path { name: "llvm-profdata" path: "/usr/bin/llvm-profdata" }
-
-  needsPic: true
-  supports_fission: true
-
-  builtin_sysroot: "/usr/grte/v1"
-  cxx_flag: "-std=c++0x"
-  linker_flag: "-lstdc++"
+  tool_path {
+    name: "ar"
+    path: "/usr/bin/ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "/usr/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "/usr/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "/usr/bin/gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "/usr/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "/usr/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "/usr/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "/usr/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "/usr/bin/strip"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "/usr/bin/llvm-profdata"
+  }
   cxx_builtin_include_directory: "/usr/lib/gcc/"
   cxx_builtin_include_directory: "/usr/local/include"
   cxx_builtin_include_directory: "/usr/include"
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  supports_interface_shared_objects: true
+  builtin_sysroot: "/usr/grte/v1"
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=c++0x"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "default_link_flags"
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-lstdc++"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "supports_dynamic_linker"
+    enabled: true
+  }
+  feature {
+    name: "supports_interface_shared_libraries"
+    enabled: true
+  }
+  feature {
+    name: "supports_pic"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "/usr/bin/objcopy"
+    }
+    enabled: true
+  }
 }
-
 toolchain {
   toolchain_identifier: "k8-no-dyn-linker"
-
   host_system_name: "local"
   target_system_name: "local"
   target_cpu: "k8"
   target_libc: "local"
   compiler: "compiler_no_dyn_linker"
-  # No linking_mode_flags here
-
   abi_version: "local"
   abi_libc_version: "local"
-
-  tool_path { name: "ar" path: "/usr/bin/ar" }
-  tool_path { name: "compat-ld" path: "/usr/bin/ld" }
-  tool_path { name: "cpp" path: "/usr/bin/cpp" }
-  tool_path { name: "dwp" path: "/usr/bin/dwp" }
-  tool_path { name: "gcc" path: "/usr/bin/gcc" }
-  tool_path { name: "gcov" path: "/usr/bin/gcov" }
-  tool_path { name: "ld" path: "/usr/bin/ld" }
-  tool_path { name: "nm" path: "/usr/bin/nm" }
-  tool_path { name: "objcopy" path: "/usr/bin/objcopy" }
-  tool_path { name: "objdump" path: "/usr/bin/objdump" }
-  tool_path { name: "strip" path: "/usr/bin/strip" }
-  tool_path { name: "llvm-profdata" path: "/usr/bin/llvm-profdata" }
-
-  needsPic: true
-  supports_fission: true
-
-  builtin_sysroot: ""
-  cxx_flag: "-std=c++0x"
-  linker_flag: "-lstdc++"
+  tool_path {
+    name: "ar"
+    path: "/usr/bin/ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "/usr/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "/usr/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "/usr/bin/gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "/usr/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "/usr/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "/usr/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "/usr/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "/usr/bin/strip"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "/usr/bin/llvm-profdata"
+  }
   cxx_builtin_include_directory: "/usr/lib/gcc/"
   cxx_builtin_include_directory: "/usr/local/include"
   cxx_builtin_include_directory: "/usr/include"
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  supports_interface_shared_objects: true
+  builtin_sysroot: ""
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=c++0x"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "default_link_flags"
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-lstdc++"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "supports_interface_shared_libraries"
+    enabled: true
+  }
+  feature {
+    name: "supports_pic"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "/usr/bin/objcopy"
+    }
+    enabled: true
+  }
 }
-
 toolchain {
   toolchain_identifier: "piii"
-
   host_system_name: "local"
   target_system_name: "local"
   target_cpu: "piii"
   target_libc: "local"
   compiler: "compiler"
-  linking_mode_flags { mode: DYNAMIC }
-
   abi_version: "local"
   abi_libc_version: "local"
-
-  tool_path { name: "ar" path: "/usr/bin/ar" }
-  tool_path { name: "compat-ld" path: "/usr/bin/ld" }
-  tool_path { name: "cpp" path: "/usr/bin/cpp" }
-  tool_path { name: "dwp" path: "/usr/bin/dwp" }
-  tool_path { name: "gcc" path: "/usr/bin/gcc" }
-  tool_path { name: "gcov" path: "/usr/bin/gcov" }
-  tool_path { name: "ld" path: "/usr/bin/ld" }
-  tool_path { name: "nm" path: "/usr/bin/nm" }
-  tool_path { name: "objcopy" path: "/usr/bin/objcopy" }
-  tool_path { name: "objdump" path: "/usr/bin/objdump" }
-  tool_path { name: "strip" path: "/usr/bin/strip" }
-  tool_path { name: "llvm-profdata" path: "/usr/bin/llvm-profdata" }
-
-  needsPic: false
-
-  builtin_sysroot: ""
-  cxx_flag: "-std=c++0x"
-  linker_flag: "-lstdc++"
+  tool_path {
+    name: "ar"
+    path: "/usr/bin/ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "/usr/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "/usr/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "/usr/bin/gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "/usr/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "/usr/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "/usr/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "/usr/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "/usr/bin/strip"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "/usr/bin/llvm-profdata"
+  }
   cxx_builtin_include_directory: "/usr/lib/gcc/"
   cxx_builtin_include_directory: "/usr/local/include"
   cxx_builtin_include_directory: "/usr/include"
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  supports_interface_shared_objects: true
+  builtin_sysroot: ""
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=c++0x"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "default_link_flags"
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-lstdc++"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "supports_dynamic_linker"
+    enabled: true
+  }
+  feature {
+    name: "supports_interface_shared_libraries"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "/usr/bin/objcopy"
+    }
+    enabled: true
+  }
 }
-
 toolchain {
   toolchain_identifier: "local_darwin"
-
   host_system_name: "local"
   target_system_name: "local"
   target_cpu: "darwin"
   target_libc: "macosx"
   compiler: "compiler"
-  linking_mode_flags { mode: DYNAMIC }
-
   abi_version: "local"
   abi_libc_version: "local"
-
-  tool_path { name: "ar" path: "/usr/bin/libtool" }
-  tool_path { name: "compat-ld" path: "/usr/bin/ld" }
-  tool_path { name: "cpp" path: "/usr/bin/cpp" }
-  tool_path { name: "dwp" path: "/usr/bin/dwp" }
-  tool_path { name: "gcc" path: "/usr/bin/gcc" }
-  tool_path { name: "gcov" path: "/usr/bin/gcov" }
-  tool_path { name: "ld" path: "/usr/bin/ld" }
-  tool_path { name: "nm" path: "/usr/bin/nm" }
-  tool_path { name: "objcopy" path: "/usr/bin/objcopy" }
-  tool_path { name: "objdump" path: "/usr/bin/objdump" }
-  tool_path { name: "strip" path: "/usr/bin/strip" }
-  tool_path { name: "llvm-profdata" path: "/usr/bin/llvm-profdata" }
-
-  needsPic: false
-
-  builtin_sysroot: "/usr/grte/v1"
-  cxx_flag: "-std=c++0x"
-  linker_flag: "-lstdc++"
+  tool_path {
+    name: "ar"
+    path: "/usr/bin/libtool"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "/usr/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "/usr/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "/usr/bin/gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "/usr/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "/usr/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "/usr/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "/usr/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "/usr/bin/strip"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "/usr/bin/llvm-profdata"
+  }
   cxx_builtin_include_directory: "/usr/include"
   cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain"
   cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs"
   cxx_builtin_include_directory: "/opt/local/include"
   cxx_builtin_include_directory: "/Library/Developer/CommandLineTools"
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  supports_interface_shared_objects: true
+  builtin_sysroot: "/usr/grte/v1"
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=c++0x"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "default_link_flags"
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-lstdc++"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "supports_dynamic_linker"
+    enabled: true
+  }
+  feature {
+    name: "supports_interface_shared_libraries"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "/usr/bin/objcopy"
+    }
+    enabled: true
+  }
 }
-
 toolchain {
   toolchain_identifier: "darwin-no-dyn-linker"
   host_system_name: "local"
@@ -410,295 +1011,837 @@
   target_cpu: "darwin"
   target_libc: "macosx"
   compiler: "compiler_no_dyn_linker"
-  # No linking_mode_flags here
-
   abi_version: "local"
   abi_libc_version: "local"
-
-  tool_path { name: "ar" path: "/usr/bin/libtool" }
-  tool_path { name: "compat-ld" path: "/usr/bin/ld" }
-  tool_path { name: "cpp" path: "/usr/bin/cpp" }
-  tool_path { name: "dwp" path: "/usr/bin/dwp" }
-  tool_path { name: "gcc" path: "/usr/bin/gcc" }
-  tool_path { name: "gcov" path: "/usr/bin/gcov" }
-  tool_path { name: "ld" path: "/usr/bin/ld" }
-  tool_path { name: "nm" path: "/usr/bin/nm" }
-  tool_path { name: "objcopy" path: "/usr/bin/objcopy" }
-  tool_path { name: "objdump" path: "/usr/bin/objdump" }
-  tool_path { name: "strip" path: "/usr/bin/strip" }
-  tool_path { name: "llvm-profdata" path: "/usr/bin/llvm-profdata" }
-
-  needsPic: false
-
-  builtin_sysroot: ""
-  cxx_flag: "-std=c++0x"
-  linker_flag: "-lstdc++"
+  tool_path {
+    name: "ar"
+    path: "/usr/bin/libtool"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "/usr/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "/usr/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "/usr/bin/gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "/usr/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "/usr/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "/usr/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "/usr/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "/usr/bin/strip"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "/usr/bin/llvm-profdata"
+  }
   cxx_builtin_include_directory: "/usr/include"
   cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain"
   cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs"
   cxx_builtin_include_directory: "/opt/local/include"
   cxx_builtin_include_directory: "/Library/Developer/CommandLineTools"
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  supports_interface_shared_objects: true
+  builtin_sysroot: ""
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=c++0x"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "default_link_flags"
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-lstdc++"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "supports_interface_shared_libraries"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "/usr/bin/objcopy"
+    }
+    enabled: true
+  }
 }
-
 toolchain {
   toolchain_identifier: "local_ios"
-
   host_system_name: "local"
   target_system_name: "local"
   target_cpu: "ios_x86_64"
   target_libc: "ios"
   compiler: "compiler"
-  linking_mode_flags { mode: DYNAMIC }
-
   abi_version: "local"
   abi_libc_version: "local"
-
-  tool_path { name: "ar" path: "/usr/bin/libtool" }
-  tool_path { name: "compat-ld" path: "/usr/bin/ld" }
-  tool_path { name: "cpp" path: "/usr/bin/cpp" }
-  tool_path { name: "dwp" path: "/usr/bin/dwp" }
-  tool_path { name: "gcc" path: "/usr/bin/gcc" }
-  tool_path { name: "gcov" path: "/usr/bin/gcov" }
-  tool_path { name: "ld" path: "/usr/bin/ld" }
-  tool_path { name: "nm" path: "/usr/bin/nm" }
-  tool_path { name: "objcopy" path: "/usr/bin/objcopy" }
-  tool_path { name: "objdump" path: "/usr/bin/objdump" }
-  tool_path { name: "strip" path: "/usr/bin/strip" }
-  tool_path { name: "llvm-profdata" path: "/usr/bin/llvm-profdata" }
-
-  needsPic: false
-
-  builtin_sysroot: ""
-  cxx_flag: "-std=c++0x"
-  linker_flag: "-lstdc++"
+  tool_path {
+    name: "ar"
+    path: "/usr/bin/libtool"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "/usr/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "/usr/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "/usr/bin/gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "/usr/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "/usr/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "/usr/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "/usr/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "/usr/bin/strip"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "/usr/bin/llvm-profdata"
+  }
   cxx_builtin_include_directory: "/usr/include"
   cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain"
   cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs"
   cxx_builtin_include_directory: "/opt/local/include"
   cxx_builtin_include_directory: "/Library/Developer/CommandLineTools"
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  supports_interface_shared_objects: true
+  builtin_sysroot: ""
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=c++0x"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "default_link_flags"
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-lstdc++"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "supports_dynamic_linker"
+    enabled: true
+  }
+  feature {
+    name: "supports_interface_shared_libraries"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "/usr/bin/objcopy"
+    }
+    enabled: true
+  }
 }
-
 toolchain {
   toolchain_identifier: "local_windows_mingw"
-
   host_system_name: "local"
   target_system_name: "local"
   target_cpu: "k8"
   target_libc: "local"
   compiler: "windows_mingw"
-  linking_mode_flags { mode: DYNAMIC }
-
   abi_version: "local"
   abi_libc_version: "local"
-
-  tool_path { name: "ar" path: "C:/mingw/bin/ar" }
-  tool_path { name: "compat-ld" path: "C:/mingw/bin/ld" }
-  tool_path { name: "cpp" path: "C:/mingw/bin/cpp" }
-  tool_path { name: "dwp" path: "C:/mingw/bin/dwp" }
-  tool_path { name: "gcc" path: "C:/mingw/bin/gcc" }
-  tool_path { name: "gcov" path: "C:/mingw/bin/gcov" }
-  tool_path { name: "ld" path: "C:/mingw/bin/ld" }
-  tool_path { name: "nm" path: "C:/mingw/bin/nm" }
-  tool_path { name: "objcopy" path: "C:/mingw/bin/objcopy" }
-  tool_path { name: "objdump" path: "C:/mingw/bin/objdump" }
-  tool_path { name: "strip" path: "C:/mingw/bin/strip" }
-  tool_path { name: "llvm-profdata" path: "C:/mingw/bin/llvm-profdata" }
-
-  builtin_sysroot: ""
-  cxx_flag: "-std=c++0x"
+  tool_path {
+    name: "ar"
+    path: "C:/mingw/bin/ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "C:/mingw/bin/ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "C:/mingw/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "C:/mingw/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "C:/mingw/bin/gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "C:/mingw/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "C:/mingw/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "C:/mingw/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "C:/mingw/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "C:/mingw/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "C:/mingw/bin/strip"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "C:/mingw/bin/llvm-profdata"
+  }
   cxx_builtin_include_directory: "C:/mingw/include"
   cxx_builtin_include_directory: "C:/mingw/lib/gcc"
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  supports_interface_shared_objects: true
+  builtin_sysroot: ""
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=c++0x"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "supports_dynamic_linker"
+    enabled: true
+  }
+  feature {
+    name: "supports_interface_shared_libraries"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "C:/mingw/bin/objcopy"
+    }
+    enabled: true
+  }
 }
-
 toolchain {
   toolchain_identifier: "local_windows_msys64_mingw64"
-
   host_system_name: "local"
   target_system_name: "local"
   target_cpu: "k8"
   target_libc: "local"
   compiler: "windows_msys64_mingw64"
-  linking_mode_flags { mode: DYNAMIC }
-
   abi_version: "local"
   abi_libc_version: "local"
-
-  tool_path { name: "ar" path: "C:/msys64/mingw64/bin/ar" }
-  tool_path { name: "compat-ld" path: "C:/msys64/mingw64/bin/ld" }
-  tool_path { name: "cpp" path: "C:/msys64/mingw64/bin/cpp" }
-  tool_path { name: "dwp" path: "C:/msys64/mingw64/bin/dwp" }
-  tool_path { name: "gcc" path: "C:/msys64/mingw64/bin/gcc" }
-  tool_path { name: "gcov" path: "C:/msys64/mingw64/bin/gcov" }
-  tool_path { name: "ld" path: "C:/msys64/mingw64/bin/ld" }
-  tool_path { name: "nm" path: "C:/msys64/mingw64/bin/nm" }
-  tool_path { name: "objcopy" path: "C:/msys64/mingw64/bin/objcopy" }
-  tool_path { name: "objdump" path: "C:/msys64/mingw64/bin/objdump" }
-  tool_path { name: "strip" path: "C:/msys64/mingw64/bin/strip" }
-  tool_path { name: "llvm-profdata" path: "C:/msys64/mingw64/bin/llvm-profdata" }
-
-  builtin_sysroot: "/usr/grte/v1"
-  cxx_flag: "-std=c++0x"
+  tool_path {
+    name: "ar"
+    path: "C:/msys64/mingw64/bin/ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "C:/msys64/mingw64/bin/ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "C:/msys64/mingw64/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "C:/msys64/mingw64/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "C:/msys64/mingw64/bin/gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "C:/msys64/mingw64/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "C:/msys64/mingw64/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "C:/msys64/mingw64/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "C:/msys64/mingw64/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "C:/msys64/mingw64/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "C:/msys64/mingw64/bin/strip"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "C:/msys64/mingw64/bin/llvm-profdata"
+  }
   cxx_builtin_include_directory: "C:/msys64/mingw64/x86_64-w64-mingw32/include"
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  supports_interface_shared_objects: true
+  builtin_sysroot: "/usr/grte/v1"
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=c++0x"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "supports_dynamic_linker"
+    enabled: true
+  }
+  feature {
+    name: "supports_interface_shared_libraries"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "C:/msys64/mingw64/bin/objcopy"
+    }
+    enabled: true
+  }
 }
-
 toolchain {
   toolchain_identifier: "local_windows_clang"
-
   host_system_name: "local"
   target_system_name: "local"
   target_cpu: "k8"
   target_libc: "local"
   compiler: "windows_clang"
-  linking_mode_flags { mode: DYNAMIC }
-
   abi_version: "local"
   abi_libc_version: "local"
-
-  tool_path { name: "ar" path: "C:/mingw/bin/ar" }
-  tool_path { name: "compat-ld" path: "C:/Program Files (x86)/LLVM/bin/ld" }
-  tool_path { name: "cpp" path: "C:/Program Files (x86)/LLVM/bin/cpp" }
-  tool_path { name: "dwp" path: "C:/Program Files (x86)/LLVM/bin/dwp" }
-  tool_path { name: "gcc" path: "C:/Program Files (x86)/LLVM/bin/clang" }
-  tool_path { name: "gcov" path: "C:/Program Files (x86)/LLVM/bin/gcov" }
-  tool_path { name: "ld" path: "C:/Program Files (x86)/LLVM/bin/ld" }
-  tool_path { name: "nm" path: "C:/Program Files (x86)/LLVM/bin/nm" }
-  tool_path { name: "objcopy" path: "C:/Program Files (x86)/LLVM/bin/objcopy" }
-  tool_path { name: "objdump" path: "C:/Program Files (x86)/LLVM/bin/objdump" }
-  tool_path { name: "strip" path: "C:/Program Files (x86)/LLVM/bin/strip" }
-  tool_path { name: "llvm-profdata" path: "C:/Program Files (x86)/LLVM/bin/llvm-profdata" }
-
-  cxx_flag: "-std=c++0x"
+  tool_path {
+    name: "ar"
+    path: "C:/mingw/bin/ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "C:/Program Files (x86)/LLVM/bin/ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "C:/Program Files (x86)/LLVM/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "C:/Program Files (x86)/LLVM/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "C:/Program Files (x86)/LLVM/bin/clang"
+  }
+  tool_path {
+    name: "gcov"
+    path: "C:/Program Files (x86)/LLVM/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "C:/Program Files (x86)/LLVM/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "C:/Program Files (x86)/LLVM/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "C:/Program Files (x86)/LLVM/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "C:/Program Files (x86)/LLVM/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "C:/Program Files (x86)/LLVM/bin/strip"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "C:/Program Files (x86)/LLVM/bin/llvm-profdata"
+  }
   cxx_builtin_include_directory: "/usr/lib/gcc/"
   cxx_builtin_include_directory: "/usr/local/include"
   cxx_builtin_include_directory: "/usr/include"
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
   builtin_sysroot: ""
-
-  supports_interface_shared_objects: true
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=c++0x"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "supports_dynamic_linker"
+    enabled: true
+  }
+  feature {
+    name: "supports_interface_shared_libraries"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "C:/Program Files (x86)/LLVM/bin/objcopy"
+    }
+    enabled: true
+  }
 }
-
 toolchain {
+  toolchain_identifier: "stub_armeabi-v7a"
+  host_system_name: "armeabi-v7a"
+  target_system_name: "armeabi-v7a"
+  target_cpu: "armeabi-v7a"
+  target_libc: "armeabi-v7a"
+  compiler: "compiler"
   abi_version: "armeabi-v7a"
   abi_libc_version: "armeabi-v7a"
+  tool_path {
+    name: "ar"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "cpp"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "dwp"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "gcc"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "gcov"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "ld"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "nm"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "objdump"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "strip"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "/bin/false"
+  }
   builtin_sysroot: ""
-  compiler: "compiler"
-  linking_mode_flags { mode: DYNAMIC }
-  host_system_name: "armeabi-v7a"
-  needsPic: true
-  supports_incremental_linker: false
-  supports_fission: false
-  supports_interface_shared_objects: false
-  supports_normalizing_ar: false
-  supports_start_end_lib: false
-  target_libc: "armeabi-v7a"
-  target_cpu: "armeabi-v7a"
-  target_system_name: "armeabi-v7a"
-  toolchain_identifier: "stub_armeabi-v7a"
-
-  tool_path { name: "ar" path: "/bin/false" }
-  tool_path { name: "compat-ld" path: "/bin/false" }
-  tool_path { name: "cpp" path: "/bin/false" }
-  tool_path { name: "dwp" path: "/bin/false" }
-  tool_path { name: "gcc" path: "/bin/false" }
-  tool_path { name: "gcov" path: "/bin/false" }
-  tool_path { name: "ld" path: "/bin/false" }
-
-  tool_path { name: "nm" path: "/bin/false" }
-  tool_path { name: "objcopy" path: "/bin/false" }
-  tool_path { name: "objdump" path: "/bin/false" }
-  tool_path { name: "strip" path: "/bin/false" }
-  tool_path { name: "llvm-profdata" path: "/bin/false" }
-
-  supports_interface_shared_objects: true
+  feature {
+    name: "supports_dynamic_linker"
+    enabled: true
+  }
+  feature {
+    name: "supports_interface_shared_libraries"
+    enabled: true
+  }
+  feature {
+    name: "supports_pic"
+    enabled: true
+  }
 }
-
 toolchain {
-   abi_version: "local"
-   abi_libc_version: "local"
-   builtin_sysroot: "/usr/grte/v1"
-   compiler: "windows_msys64"
-   host_system_name: "local"
-   needsPic: false
-   target_libc: "local"
-   target_cpu: "x64_windows"
-   target_system_name: "local"
-   toolchain_identifier: "local_windows_msys64"
-
-   tool_path { name: "ar" path: "C:/tools/msys64/usr/bin/ar" }
-   tool_path { name: "compat-ld" path: "C:/tools/msys64/usr/bin/ld" }
-   tool_path { name: "cpp" path: "C:/tools/msys64/usr/bin/cpp" }
-   tool_path { name: "dwp" path: "C:/tools/msys64/usr/bin/dwp" }
-   # Use gcc instead of g++ so that C will compile correctly.
-   tool_path { name: "gcc" path: "C:/tools/msys64/usr/bin/gcc" }
-   cxx_flag: "-std=gnu++0x"
-   linker_flag: "-lstdc++"
-   # TODO(bazel-team): In theory, the path here ought to exactly match the path
-   # used by gcc. That works because bazel currently doesn't track files at
-   # absolute locations and has no remote execution, yet. However, this will need
-   # to be fixed, maybe with auto-detection?
-   cxx_builtin_include_directory: "C:/tools/msys64/"
-   cxx_builtin_include_directory: "/usr/"
-   tool_path { name: "gcov" path: "C:/tools/msys64/usr/bin/gcov" }
-   tool_path { name: "ld" path: "C:/tools/msys64/usr/bin/ld" }
-   tool_path { name: "nm" path: "C:/tools/msys64/usr/bin/nm" }
-   tool_path { name: "objcopy" path: "C:/tools/msys64/usr/bin/objcopy" }
-   objcopy_embed_flag: "-I"
-   objcopy_embed_flag: "binary"
-   tool_path { name: "objdump" path: "C:/tools/msys64/usr/bin/objdump" }
-   tool_path { name: "strip" path: "C:/tools/msys64/usr/bin/strip" }
-   tool_path { name: "llvm-profdata" path: "C:/tools/msys64/usr/bin/llvm-profdata" }
-   linking_mode_flags { mode: DYNAMIC }
-
-   supports_interface_shared_objects: true
+  toolchain_identifier: "local_windows_msys64"
+  host_system_name: "local"
+  target_system_name: "local"
+  target_cpu: "x64_windows"
+  target_libc: "local"
+  compiler: "windows_msys64"
+  abi_version: "local"
+  abi_libc_version: "local"
+  tool_path {
+    name: "ar"
+    path: "C:/tools/msys64/usr/bin/ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "C:/tools/msys64/usr/bin/ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "C:/tools/msys64/usr/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "C:/tools/msys64/usr/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "C:/tools/msys64/usr/bin/gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "C:/tools/msys64/usr/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "C:/tools/msys64/usr/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "C:/tools/msys64/usr/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "C:/tools/msys64/usr/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "C:/tools/msys64/usr/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "C:/tools/msys64/usr/bin/strip"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "C:/tools/msys64/usr/bin/llvm-profdata"
+  }
+  cxx_builtin_include_directory: "C:/tools/msys64/"
+  cxx_builtin_include_directory: "/usr/"
+  builtin_sysroot: "/usr/grte/v1"
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=gnu++0x"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "default_link_flags"
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-lstdc++"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "supports_dynamic_linker"
+    enabled: true
+  }
+  feature {
+    name: "supports_interface_shared_libraries"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "C:/tools/msys64/usr/bin/objcopy"
+    }
+    enabled: true
+  }
 }
-
 toolchain {
-   toolchain_identifier: "windows_msys64-no-dyn-linker"
-   abi_version: "local"
-   abi_libc_version: "local"
-   builtin_sysroot: ""
-   compiler: "compiler_no_dyn_linker"
-   host_system_name: "local"
-   needsPic: false
-   target_libc: "local"
-   target_cpu: "x64_windows"
-   target_system_name: "local"
-
-   tool_path { name: "ar" path: "C:/tools/msys64/usr/bin/ar" }
-   tool_path { name: "compat-ld" path: "C:/tools/msys64/usr/bin/ld" }
-   tool_path { name: "cpp" path: "C:/tools/msys64/usr/bin/cpp" }
-   tool_path { name: "dwp" path: "C:/tools/msys64/usr/bin/dwp" }
-   # Use gcc instead of g++ so that C will compile correctly.
-   tool_path { name: "gcc" path: "C:/tools/msys64/usr/bin/gcc" }
-   cxx_flag: "-std=gnu++0x"
-   linker_flag: "-lstdc++"
-   # TODO(bazel-team): In theory, the path here ought to exactly match the path
-   # used by gcc. That works because bazel currently doesn't track files at
-   # absolute locations and has no remote execution, yet. However, this will need
-   # to be fixed, maybe with auto-detection?
-   cxx_builtin_include_directory: "C:/tools/msys64/"
-   cxx_builtin_include_directory: "/usr/"
-   tool_path { name: "gcov" path: "C:/tools/msys64/usr/bin/gcov" }
-   tool_path { name: "ld" path: "C:/tools/msys64/usr/bin/ld" }
-   tool_path { name: "nm" path: "C:/tools/msys64/usr/bin/nm" }
-   tool_path { name: "objcopy" path: "C:/tools/msys64/usr/bin/objcopy" }
-   objcopy_embed_flag: "-I"
-   objcopy_embed_flag: "binary"
-   tool_path { name: "objdump" path: "C:/tools/msys64/usr/bin/objdump" }
-   tool_path { name: "strip" path: "C:/tools/msys64/usr/bin/strip" }
-   tool_path { name: "llvm-profdata" path: "C:/tools/msys64/usr/bin/llvm-profdata" }
-   # No linking_mode_flags here
+  toolchain_identifier: "windows_msys64-no-dyn-linker"
+  host_system_name: "local"
+  target_system_name: "local"
+  target_cpu: "x64_windows"
+  target_libc: "local"
+  compiler: "compiler_no_dyn_linker"
+  abi_version: "local"
+  abi_libc_version: "local"
+  tool_path {
+    name: "ar"
+    path: "C:/tools/msys64/usr/bin/ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "C:/tools/msys64/usr/bin/ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "C:/tools/msys64/usr/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "C:/tools/msys64/usr/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "C:/tools/msys64/usr/bin/gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "C:/tools/msys64/usr/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "C:/tools/msys64/usr/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "C:/tools/msys64/usr/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "C:/tools/msys64/usr/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "C:/tools/msys64/usr/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "C:/tools/msys64/usr/bin/strip"
+  }
+  tool_path {
+    name: "llvm-profdata"
+    path: "C:/tools/msys64/usr/bin/llvm-profdata"
+  }
+  cxx_builtin_include_directory: "C:/tools/msys64/"
+  cxx_builtin_include_directory: "/usr/"
+  builtin_sysroot: ""
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=gnu++0x"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "default_link_flags"
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-lstdc++"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "C:/tools/msys64/usr/bin/objcopy"
+    }
+    enabled: true
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
index 57a22f8..c633106 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
@@ -284,9 +284,7 @@
 
   @Test
   public void testStartEndLibThroughFeature() throws Exception {
-    AnalysisMock.get()
-        .ccSupport()
-        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_START_END_LIB_FEATURE);
+    AnalysisMock.get().ccSupport().setupCrosstool(mockToolsConfig);
     useConfiguration("--start_end_lib");
     scratch.file(
         "test/BUILD",
@@ -528,7 +526,9 @@
   public void testCcTestBuiltWithFissionHasDwp() throws Exception {
     // Tests that cc_tests built statically and with Fission will have the .dwp file
     // in their runfiles.
-
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.PER_OBJECT_DEBUG_INFO_CONFIGURATION);
     useConfiguration("--cpu=k8", "--build_test_dwp", "--dynamic_mode=off", "--fission=yes");
     ConfiguredTarget target =
         scratchConfiguredTarget(
@@ -965,10 +965,8 @@
             MockCcSupport.NO_LEGACY_FEATURES_FEATURE,
             MockCcSupport.EMPTY_STATIC_LIBRARY_ACTION_CONFIG,
             MockCcSupport.EMPTY_COMPILE_ACTION_CONFIG,
-            MockCcSupport.EMPTY_DYNAMIC_LIBRARY_ACTION_CONFIG,
-            "needsPic: false",
-            "feature { name: 'supports_pic' enabled: true }");
-    useConfiguration();
+            MockCcSupport.EMPTY_DYNAMIC_LIBRARY_ACTION_CONFIG);
+    useConfiguration("--cpu=k8");
 
     scratch.file("x/BUILD", "cc_library(name = 'foo', srcs = ['a.cc'])");
     scratch.file("x/a.cc");
@@ -992,10 +990,8 @@
             MockCcSupport.NO_LEGACY_FEATURES_FEATURE,
             MockCcSupport.EMPTY_STATIC_LIBRARY_ACTION_CONFIG,
             MockCcSupport.EMPTY_COMPILE_ACTION_CONFIG,
-            MockCcSupport.EMPTY_DYNAMIC_LIBRARY_ACTION_CONFIG,
-            "needsPic: false",
-            "feature { name: 'supports_pic' }");
-    useConfiguration();
+            MockCcSupport.EMPTY_DYNAMIC_LIBRARY_ACTION_CONFIG);
+    useConfiguration("--features=-supports_pic");
 
     scratch.file("x/BUILD", "cc_library(name = 'foo', srcs = ['a.cc'])");
     scratch.file("x/a.cc");
@@ -1019,10 +1015,8 @@
             MockCcSupport.NO_LEGACY_FEATURES_FEATURE,
             MockCcSupport.EMPTY_STATIC_LIBRARY_ACTION_CONFIG,
             MockCcSupport.EMPTY_COMPILE_ACTION_CONFIG,
-            MockCcSupport.EMPTY_DYNAMIC_LIBRARY_ACTION_CONFIG,
-            "needsPic: false",
-            "feature { name: 'supports_pic' }");
-    useConfiguration("--force_pic");
+            MockCcSupport.EMPTY_DYNAMIC_LIBRARY_ACTION_CONFIG);
+    useConfiguration("--force_pic", "--cpu=k8");
 
     scratch.file("x/BUILD", "cc_library(name = 'foo', srcs = ['a.cc'])");
     scratch.file("x/a.cc");
@@ -1047,9 +1041,8 @@
             MockCcSupport.NO_LEGACY_FEATURES_FEATURE,
             MockCcSupport.EMPTY_STATIC_LIBRARY_ACTION_CONFIG,
             MockCcSupport.EMPTY_DYNAMIC_LIBRARY_ACTION_CONFIG,
-            MockCcSupport.EMPTY_COMPILE_ACTION_CONFIG,
-            "needsPic: false");
-    useConfiguration("--force_pic");
+            MockCcSupport.EMPTY_COMPILE_ACTION_CONFIG);
+    useConfiguration("--force_pic", "--features=-supports_pic");
 
     scratch.file("x/BUILD", "cc_library(name = 'foo', srcs = ['a.cc'])");
     scratch.file("x/a.cc");
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
index b219d81..0a77570 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
@@ -422,8 +422,6 @@
             mockToolsConfig,
             MockCcSupport.COPY_DYNAMIC_LIBRARIES_TO_BINARY_CONFIGURATION,
             MockCcSupport.TARGETS_WINDOWS_CONFIGURATION,
-            "needsPic: false",
-            "supports_interface_shared_objects: true",
             "artifact_name_pattern {"
                 + "   category_name: 'object_file'"
                 + "   prefix: ''"
@@ -455,7 +453,7 @@
                 + "   extension: '.if.lib'"
                 + "}");
 
-    useConfiguration();
+    useConfiguration("--features=-supports_pic");
 
     ConfiguredTarget hello = getConfiguredTarget("//hello:hello");
     Artifact helloObj =
@@ -943,22 +941,6 @@
   }
 
   @Test
-  public void testPicNotAvailableError() throws Exception {
-    AnalysisMock.get()
-        .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            MockCcSupport.EMPTY_STATIC_LIBRARY_ACTION_CONFIG,
-            MockCcSupport.EMPTY_COMPILE_ACTION_CONFIG,
-            MockCcSupport.NO_LEGACY_FEATURES_FEATURE);
-    useConfiguration("--cpu=k8");
-    writeSimpleCcLibrary();
-    reporter.removeHandler(failFastHandler);
-    getConfiguredTarget("//module:map");
-    assertContainsEvent("PIC compilation is requested but the toolchain does not support it");
-  }
-
-  @Test
   public void testToolchainWithoutPicForNoPicCompilation() throws Exception {
     AnalysisMock.get()
         .ccSupport()
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
index 3392bfb..b5a0d06 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
@@ -95,6 +95,19 @@
 
   private final FeatureConfiguration getMockFeatureConfiguration(RuleContext ruleContext)
       throws Exception {
+    CToolchain.FlagGroup flagGroup =
+        CToolchain.FlagGroup.newBuilder().addFlag("-lcpp_standard_library").build();
+    CToolchain.FlagSet flagSet =
+        CToolchain.FlagSet.newBuilder()
+            .addAction("c++-link-executable")
+            .addFlagGroup(flagGroup)
+            .build();
+    CToolchain.Feature linkCppStandardLibrary =
+        CToolchain.Feature.newBuilder()
+            .setName("link_cpp_standard_library")
+            .setEnabled(true)
+            .addFlagSet(flagSet)
+            .build();
     ImmutableList<CToolchain.Feature> features =
         new ImmutableList.Builder<CToolchain.Feature>()
             .addAll(
@@ -105,6 +118,7 @@
                     /* supportsEmbeddedRuntimes= */ true,
                     /* supportsInterfaceSharedLibraries= */ false))
             .addAll(CppActionConfigs.getFeaturesToAppearLastInFeaturesList(ImmutableSet.of()))
+            .add(linkCppStandardLibrary)
             .build();
 
     ImmutableList<CToolchain.ActionConfig> actionConfigs =
@@ -118,6 +132,7 @@
     return CcToolchainFeaturesTest.buildFeatures(ruleContext, features, actionConfigs)
         .getFeatureConfiguration(
             ImmutableSet.of(
+                "link_cpp_standard_library",
                 Link.LinkTargetType.EXECUTABLE.getActionName(),
                 Link.LinkTargetType.NODEPS_DYNAMIC_LIBRARY.getActionName(),
                 Link.LinkTargetType.DYNAMIC_LIBRARY.getActionName(),
@@ -658,12 +673,7 @@
 
   @Test
   public void testInterfaceOutputForDynamicLibrary() throws Exception {
-    AnalysisMock.get()
-        .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES,
-            "supports_interface_shared_objects: false");
+    AnalysisMock.get().ccSupport().setupCrosstool(mockToolsConfig);
     useConfiguration();
 
     scratch.file("foo/BUILD", "cc_library(name = 'foo', srcs = ['foo.cc'])");
@@ -1065,6 +1075,6 @@
     assertThat(linkCommandLine).contains("output/path.a");
     assertThat(linkCommandLine).contains("path.a-2.params");
 
-    assertThat(result.second).contains("-lstdc++");
+    assertThat(result.second).contains("-lcpp_standard_library");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariablesTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariablesTest.java
index e41b96c..7a66525 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariablesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariablesTest.java
@@ -141,9 +141,7 @@
   public void testInterfaceLibraryBuildingVariablesWhenGenerationPossible() throws Exception {
     // Make sure the interface shared object generation is enabled in the configuration
     // (which it is not by default for some windows toolchains)
-    AnalysisMock.get()
-        .ccSupport()
-        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES);
+    AnalysisMock.get().ccSupport().setupCrosstool(mockToolsConfig);
     useConfiguration();
 
     verifyIfsoVariables();
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
index e364bb6..5dd6459 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
@@ -595,20 +595,7 @@
   public void testEmptyLinkVariablesContainSysroot() throws Exception {
     AnalysisMock.get()
         .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            "builtin_sysroot: '/foo/bar/sysroot'",
-            "feature {",
-            "  name: 'sysroot'",
-            "  enabled: true",
-            "  flag_set {",
-            "    action: 'c++-link-executable'",
-            "    flag_group {",
-            "      expand_if_all_available: 'sysroot'",
-            "      flag: '--yolo_sysroot_flag=%{sysroot}'",
-            "    }",
-            "  }",
-            "}");
+        .setupCrosstool(mockToolsConfig, "builtin_sysroot: '/foo/bar/sysroot'");
     useConfiguration();
     assertThat(
             commandLineForVariables(
@@ -617,7 +604,7 @@
                 "feature_configuration = feature_configuration,",
                 "cc_toolchain = toolchain,",
                 ")"))
-        .contains("--yolo_sysroot_flag=/foo/bar/sysroot");
+        .contains("--sysroot=/foo/bar/sysroot");
   }
 
   @Test
@@ -1179,13 +1166,12 @@
         .setupCrosstool(
             mockToolsConfig,
             MockCcSupport.COPY_DYNAMIC_LIBRARIES_TO_BINARY_CONFIGURATION,
-            MockCcSupport.TARGETS_WINDOWS_CONFIGURATION,
-            "supports_interface_shared_objects: false",
-            "needsPic: false");
+            MockCcSupport.TARGETS_WINDOWS_CONFIGURATION);
     doTestCcLinkingContext(
         ImmutableList.of("a.a", "libdep2.a", "b.a", "c.a", "d.a", "libdep1.a"),
         ImmutableList.of("a.pic.a", "b.pic.a", "c.pic.a", "e.pic.a"),
-        ImmutableList.of("a.so", "libdep2.so", "b.so", "e.so", "libdep1.so"));
+        ImmutableList.of("a.so", "libdep2.so", "b.so", "e.so", "libdep1.so"),
+        /* disableSupportsPic= */ true);
   }
 
   @Test
@@ -1195,20 +1181,23 @@
         .setupCrosstool(
             mockToolsConfig,
             MockCcSupport.PIC_FEATURE,
-            "supports_interface_shared_objects: false",
             "needsPic: true");
     doTestCcLinkingContext(
         ImmutableList.of("a.a", "b.a", "c.a", "d.a"),
         ImmutableList.of("a.pic.a", "libdep2.a", "b.pic.a", "c.pic.a", "e.pic.a", "libdep1.a"),
-        ImmutableList.of("a.so", "liba_Slibdep2.so", "b.so", "e.so", "liba_Slibdep1.so"));
+        ImmutableList.of("a.so", "liba_Slibdep2.so", "b.so", "e.so", "liba_Slibdep1.so"),
+        /* disableSupportsPic= */ false);
   }
 
   private void doTestCcLinkingContext(
       List<String> staticLibraryList,
       List<String> picStaticLibraryList,
-      List<String> dynamicLibraryList)
+      List<String> dynamicLibraryList,
+      boolean disableSupportsPic)
       throws Exception {
-    useConfiguration();
+    useConfiguration(
+        "--features=-supports_interface_shared_libraries",
+        disableSupportsPic ? "--features=-supports_pic" : "--features=supports_pic");
     setUpCcLinkingContextTest();
     ConfiguredTarget a = getConfiguredTarget("//a:a");
 
diff --git a/src/test/shell/bazel/testdata/bazel_toolchain_test_data/tools/arm_compiler/CROSSTOOL b/src/test/shell/bazel/testdata/bazel_toolchain_test_data/tools/arm_compiler/CROSSTOOL
index 0ede68a..2a19204 100644
--- a/src/test/shell/bazel/testdata/bazel_toolchain_test_data/tools/arm_compiler/CROSSTOOL
+++ b/src/test/shell/bazel/testdata/bazel_toolchain_test_data/tools/arm_compiler/CROSSTOOL
@@ -1,61 +1,58 @@
 major_version: "local"
 minor_version: ""
-
 toolchain {
+  toolchain_identifier: "armeabi-v7a"
+  host_system_name: "armeabi-v7a"
+  target_system_name: "arm_a15"
+  target_cpu: "armeabi-v7a"
+  target_libc: "glibc_2.19"
+  compiler: "gcc"
   abi_version: "gcc"
   abi_libc_version: "glibc_2.19"
-  builtin_sysroot: ""
-  compiler: "gcc"
-  host_system_name: "armeabi-v7a"
-  needsPic: true
-  supports_incremental_linker: false
-  supports_fission: false
-  supports_interface_shared_objects: false
-  supports_normalizing_ar: true
-  supports_start_end_lib: false
-  supports_thin_archives: true
-  target_libc: "glibc_2.19"
-  target_cpu: "armeabi-v7a"
-  target_system_name: "arm_a15"
-  toolchain_identifier: "armeabi-v7a"
-
-  tool_path { name: "ar" path: "linaro_linux_gcc/arm-linux-gnueabihf-ar" }
-  tool_path { name: "compat-ld" path: "linaro_linux_gcc/arm-linux-gnueabihf-ld" }
-  tool_path { name: "cpp" path: "linaro_linux_gcc/arm-linux-gnueabihf-gcc" }
-  tool_path { name: "dwp" path: "linaro_linux_gcc/arm-linux-gnueabihf-dwp" }
-  tool_path { name: "gcc" path: "linaro_linux_gcc/arm-linux-gnueabihf-gcc" }
-  tool_path { name: "gcov" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcov-4.9" }
-  # C(++) compiles invoke the compiler (as that is the one knowing where
-  # to find libraries), but we provide LD so other rules can invoke the linker.
-  tool_path { name: "ld" path: "linaro_linux_gcc/arm-linux-gnueabihf-ld" }
-  tool_path { name: "nm" path: "linaro_linux_gcc/arm-linux-gnueabihf-nm" }
-  tool_path { name: "objcopy" path: "linaro_linux_gcc/arm-linux-gnueabihf-objcopy" }
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  tool_path { name: "objdump" path: "linaro_linux_gcc/arm-linux-gnueabihf-objdump" }
-  tool_path { name: "strip" path: "linaro_linux_gcc/arm-linux-gnueabihf-strip" }
-
-  compiler_flag: "--sysroot=external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc"
-  compiler_flag: "-mfloat-abi=hard"
-
-  compiler_flag: "-nostdinc"
-  compiler_flag: "-isystem"
-  compiler_flag: "external/org_linaro_components_toolchain_gcc_5_3_1/lib/gcc/arm-linux-gnueabihf/5.3.1/include"
-  compiler_flag: "-isystem"
-  compiler_flag: "external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc/usr/include"
-  compiler_flag: "-isystem"
-  compiler_flag: "external/org_linaro_components_toolchain_gcc_5_3_1/lib/gcc/arm-linux-gnueabihf/5.3.1/include-fixed"
-  compiler_flag: "-isystem"
-  compiler_flag: "external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc/usr/include"
-  cxx_flag: "-isystem"
-  cxx_flag: "external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/include/c++/5.3.1/arm-linux-gnueabihf"
-  cxx_flag: "-isystem"
-  cxx_flag: "external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/include/c++/5.3.1"
-  cxx_flag: "-isystem"
-  cxx_flag: "external/org_linaro_components_toolchain_gcc_5_3_1/include/c++/5.3.1/arm-linux-gnueabihf"
-  cxx_flag: "-isystem"
-  cxx_flag: "external/org_linaro_components_toolchain_gcc_5_3_1/include/c++/5.3.1"
-
+  tool_path {
+    name: "ar"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-gcc"
+  }
+  tool_path {
+    name: "dwp"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcov-4.9"
+  }
+  tool_path {
+    name: "ld"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-strip"
+  }
   cxx_builtin_include_directory: "%package(@org_linaro_components_toolchain_gcc_5_3_1//include)%"
   cxx_builtin_include_directory: "%package(@org_linaro_components_toolchain_gcc_5_3_1//arm-linux-gnueabihf/libc/usr/include)%"
   cxx_builtin_include_directory: "%package(@org_linaro_components_toolchain_gcc_5_3_1//arm-linux-gnueabihf/libc/usr/lib/include)%"
@@ -66,97 +63,284 @@
   cxx_builtin_include_directory: "%package(@org_linaro_components_toolchain_gcc_5_3_1//lib/gcc/arm-linux-gnueabihf/5.3.1/include)%"
   cxx_builtin_include_directory: "%package(@org_linaro_components_toolchain_gcc_5_3_1//lib/gcc/arm-linux-gnueabihf/5.3.1/include-fixed)%"
   cxx_builtin_include_directory: "%package(@org_linaro_components_toolchain_gcc_5_3_1//arm-linux-gnueabihf/include)%/c++/5.3.1"
-
-  linker_flag: "--sysroot=external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc"
-  linker_flag: "-lstdc++"
-  linker_flag: "-latomic"
-  linker_flag: "-lm"
-  linker_flag: "-lpthread"
-  linker_flag: "-Ltools/arm_compiler/linaro_linux_gcc/clang_more_libs"
-  linker_flag: "-Lexternal/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/lib"
-  linker_flag: "-Lexternal/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc/lib"
-  linker_flag: "-Lexternal/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc/usr/lib"
-  linker_flag: "-Bexternal/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/bin"
-  linker_flag: "-Wl,--dynamic-linker=/lib/ld-linux-armhf.so.3"
-
-  # Anticipated future default.
-  # This makes GCC and Clang do what we want when called through symlinks.
-  unfiltered_cxx_flag: "-no-canonical-prefixes"
-  linker_flag: "-no-canonical-prefixes"
-
-  # Make C++ compilation deterministic. Use linkstamping instead of these
-  # compiler symbols.
-  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
-  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
-
-  # Security hardening on by default.
-  # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
-  # We need to undef it before redefining it as some distributions now have
-  # it enabled by default.
-  compiler_flag: "-U_FORTIFY_SOURCE"
-  compiler_flag: "-fstack-protector"
-  compiler_flag: "-fPIE"
-  linker_flag: "-pie"
-  linker_flag: "-Wl,-z,relro,-z,now"
-
-  # Enable coloring even if there's no attached terminal. Bazel removes the
-  # escape sequences if --nocolor is specified.
-  compiler_flag: "-fdiagnostics-color=always"
-
-  # All warnings are enabled. Maybe enable -Werror as well?
-  compiler_flag: "-Wall"
-  # Enable a few more warnings that aren't part of -Wall.
-  compiler_flag: "-Wunused-but-set-parameter"
-  # But disable some that are problematic.
-  compiler_flag: "-Wno-free-nonheap-object" # has false positives
-
-  # Keep stack frames for debugging, even in opt mode.
-  compiler_flag: "-fno-omit-frame-pointer"
-
-  compilation_mode_flags {
-    mode: DBG
-    # Enable debug symbols.
-    compiler_flag: "-g"
+  builtin_sysroot: ""
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "--sysroot=external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc"
+        flag: "-mfloat-abi=hard"
+        flag: "-nostdinc"
+        flag: "-isystem"
+        flag: "external/org_linaro_components_toolchain_gcc_5_3_1/lib/gcc/arm-linux-gnueabihf/5.3.1/include"
+        flag: "-isystem"
+        flag: "external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc/usr/include"
+        flag: "-isystem"
+        flag: "external/org_linaro_components_toolchain_gcc_5_3_1/lib/gcc/arm-linux-gnueabihf/5.3.1/include-fixed"
+        flag: "-isystem"
+        flag: "external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc/usr/include"
+        flag: "-U_FORTIFY_SOURCE"
+        flag: "-fstack-protector"
+        flag: "-fPIE"
+        flag: "-fdiagnostics-color=always"
+        flag: "-Wall"
+        flag: "-Wunused-but-set-parameter"
+        flag: "-Wno-free-nonheap-object"
+        flag: "-fno-omit-frame-pointer"
+      }
+    }
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-g"
+      }
+      with_feature {
+        feature: "dbg"
+      }
+    }
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-g0"
+        flag: "-O2"
+        flag: "-DNDEBUG"
+        flag: "-ffunction-sections"
+        flag: "-fdata-sections"
+      }
+      with_feature {
+        feature: "opt"
+      }
+    }
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-isystem"
+        flag: "external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/include/c++/5.3.1/arm-linux-gnueabihf"
+        flag: "-isystem"
+        flag: "external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/include/c++/5.3.1"
+        flag: "-isystem"
+        flag: "external/org_linaro_components_toolchain_gcc_5_3_1/include/c++/5.3.1/arm-linux-gnueabihf"
+        flag: "-isystem"
+        flag: "external/org_linaro_components_toolchain_gcc_5_3_1/include/c++/5.3.1"
+      }
+    }
+    enabled: true
   }
-  compilation_mode_flags {
-    mode: OPT
-    # No debug symbols.
-    # Maybe we should enable https://gcc.gnu.org/wiki/DebugFission for opt or
-    # even generally? However, that can't happen here, as it requires special
-    # handling in Bazel.
-    compiler_flag: "-g0"
-
-    # Conservative choice for -O
-    # -O3 can increase binary size and even slow down the resulting binaries.
-    # Profile first and / or use FDO if you need better performance than this.
-    compiler_flag: "-O2"
-
-    # Disable assertions
-    compiler_flag: "-DNDEBUG"
-
-    # Removal of unused code and data at link time (can this increase binary size in some cases?).
-    compiler_flag: "-ffunction-sections"
-    compiler_flag: "-fdata-sections"
-    linker_flag: "-Wl,--gc-sections"
+  feature {
+    name: "default_link_flags"
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "--sysroot=external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc"
+        flag: "-lstdc++"
+        flag: "-latomic"
+        flag: "-lm"
+        flag: "-lpthread"
+        flag: "-Ltools/arm_compiler/linaro_linux_gcc/clang_more_libs"
+        flag: "-Lexternal/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/lib"
+        flag: "-Lexternal/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc/lib"
+        flag: "-Lexternal/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc/usr/lib"
+        flag: "-Bexternal/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/bin"
+        flag: "-Wl,--dynamic-linker=/lib/ld-linux-armhf.so.3"
+        flag: "-no-canonical-prefixes"
+        flag: "-pie"
+        flag: "-Wl,-z,relro,-z,now"
+      }
+    }
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-Wl,--gc-sections"
+      }
+      with_feature {
+        feature: "opt"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "supports_pic"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "opt"
+  }
+  feature {
+    name: "dbg"
+  }
+  feature {
+    name: "user_compile_flags"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "%{user_compile_flags}"
+        iterate_over: "user_compile_flags"
+        expand_if_all_available: "user_compile_flags"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "sysroot"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "--sysroot=%{sysroot}"
+        expand_if_all_available: "sysroot"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "unfiltered_compile_flags"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-no-canonical-prefixes"
+        flag: "-Wno-builtin-macro-redefined"
+        flag: "-D__DATE__=\"redacted\""
+        flag: "-D__TIMESTAMP__=\"redacted\""
+        flag: "-D__TIME__=\"redacted\""
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "linaro_linux_gcc/arm-linux-gnueabihf-objcopy"
+    }
+    enabled: true
   }
 }
-
 toolchain {
   toolchain_identifier: "local"
-  abi_libc_version: "local"
-  abi_version: "local"
-  builtin_sysroot: ""
+  host_system_name: "local"
+  target_system_name: "local"
+  target_cpu: "k8"
+  target_libc: "local"
   compiler: "compiler"
-  compiler_flag: "-U_FORTIFY_SOURCE"
-  compiler_flag: "-D_FORTIFY_SOURCE=2"
-  compiler_flag: "-fstack-protector"
-  compiler_flag: "-Wall"
-  compiler_flag: "-Wl,-z,-relro,-z,now"
-  compiler_flag: "-Wunused-but-set-parameter"
-  compiler_flag: "-Wno-free-nonheap-object"
-  compiler_flag: "-fno-omit-frame-pointer"
+  abi_version: "local"
+  abi_libc_version: "local"
+  tool_path {
+    name: "ar"
+    path: "/usr/bin/ar"
+  }
+  tool_path {
+    name: "cpp"
+    path: "/usr/bin/cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "/usr/bin/dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "/usr/bin/gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "/usr/bin/gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "/usr/bin/ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "/usr/bin/nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "/usr/bin/objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "/usr/bin/objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "/usr/bin/strip"
+  }
   cxx_builtin_include_directory: "/usr/include/c++/4.8"
   cxx_builtin_include_directory: "/usr/include/x86_64-linux-gnu/c++/4.8"
   cxx_builtin_include_directory: "/usr/include/c++/4.8/backward"
@@ -165,52 +349,208 @@
   cxx_builtin_include_directory: "/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed"
   cxx_builtin_include_directory: "/usr/include/x86_64-linux-gnu"
   cxx_builtin_include_directory: "/usr/include"
-  cxx_flag: "-std=c++0x"
-  host_system_name: "local"
-  linker_flag: "-lstdc++"
-  linker_flag: "-lm"
-  linker_flag: "-Wl,-no-as-needed"
-  linker_flag: "-pass-exit-codes"
-  needsPic: true
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  supports_fission: false
-  supports_incremental_linker: false
-  supports_interface_shared_objects: false
-  supports_normalizing_ar: false
-  supports_start_end_lib: false
-  supports_thin_archives: false
-  target_cpu: "k8"
-  target_libc: "local"
-  target_system_name: "local"
-  unfiltered_cxx_flag: "-fno-canonical-system-headers"
-  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
-  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
-  tool_path {name: "ar" path: "/usr/bin/ar" }
-  tool_path {name: "cpp" path: "/usr/bin/cpp" }
-  tool_path {name: "dwp" path: "/usr/bin/dwp" }
-  tool_path {name: "gcc" path: "/usr/bin/gcc" }
-  tool_path {name: "gcov" path: "/usr/bin/gcov" }
-  tool_path {name: "ld" path: "/usr/bin/ld" }
-  tool_path {name: "nm" path: "/usr/bin/nm" }
-  tool_path {name: "objcopy" path: "/usr/bin/objcopy" }
-  tool_path {name: "objdump" path: "/usr/bin/objdump" }
-  tool_path {name: "strip" path: "/usr/bin/strip" }
-
-  compilation_mode_flags {
-    mode: DBG
-    compiler_flag: "-g"
+  builtin_sysroot: ""
+  feature {
+    name: "default_compile_flags"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-U_FORTIFY_SOURCE"
+        flag: "-D_FORTIFY_SOURCE=2"
+        flag: "-fstack-protector"
+        flag: "-Wall"
+        flag: "-Wl,-z,-relro,-z,now"
+        flag: "-Wunused-but-set-parameter"
+        flag: "-Wno-free-nonheap-object"
+        flag: "-fno-omit-frame-pointer"
+      }
+    }
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-g"
+      }
+      with_feature {
+        feature: "dbg"
+      }
+    }
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-g0"
+        flag: "-O2"
+        flag: "-DNDEBUG"
+        flag: "-ffunction-sections"
+        flag: "-fdata-sections"
+      }
+      with_feature {
+        feature: "opt"
+      }
+    }
+    flag_set {
+      action: "linkstamp-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-std=c++0x"
+      }
+    }
+    enabled: true
   }
-  compilation_mode_flags {
-    mode: OPT
-    compiler_flag: "-g0"
-    compiler_flag: "-O2"
-    compiler_flag: "-DNDEBUG"
-    compiler_flag: "-ffunction-sections"
-    compiler_flag: "-fdata-sections"
-    linker_flag: "-Wl,--gc-sections"
+  feature {
+    name: "default_link_flags"
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-lstdc++"
+        flag: "-lm"
+        flag: "-Wl,-no-as-needed"
+        flag: "-pass-exit-codes"
+      }
+    }
+    flag_set {
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "-Wl,--gc-sections"
+      }
+      with_feature {
+        feature: "opt"
+      }
+    }
+    enabled: true
   }
-  linking_mode_flags { mode: DYNAMIC }
+  feature {
+    name: "supports_dynamic_linker"
+    enabled: true
+  }
+  feature {
+    name: "supports_pic"
+    enabled: true
+  }
+  feature {
+    name: "objcopy_embed_flags"
+    flag_set {
+      action: "objcopy_embed_data"
+      flag_group {
+        flag: "-I"
+        flag: "binary"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "opt"
+  }
+  feature {
+    name: "dbg"
+  }
+  feature {
+    name: "user_compile_flags"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "%{user_compile_flags}"
+        iterate_over: "user_compile_flags"
+        expand_if_all_available: "user_compile_flags"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "sysroot"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      action: "c++-link-executable"
+      action: "c++-link-dynamic-library"
+      action: "c++-link-nodeps-dynamic-library"
+      flag_group {
+        flag: "--sysroot=%{sysroot}"
+        expand_if_all_available: "sysroot"
+      }
+    }
+    enabled: true
+  }
+  feature {
+    name: "unfiltered_compile_flags"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "linkstamp-compile"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-fno-canonical-system-headers"
+        flag: "-Wno-builtin-macro-redefined"
+        flag: "-D__DATE__=\"redacted\""
+        flag: "-D__TIMESTAMP__=\"redacted\""
+        flag: "-D__TIME__=\"redacted\""
+      }
+    }
+    enabled: true
+  }
+  action_config {
+    config_name: "objcopy_embed_data"
+    action_name: "objcopy_embed_data"
+    tool {
+      tool_path: "/usr/bin/objcopy"
+    }
+    enabled: true
+  }
 }