Allow specifying crosstool flags based on the build mode.

The build mode ('dbg', 'opt', 'fastbuild') is specified as a feature. The
crosstool can use that feature to switch between different flag configurations.

As one of these is always provided, the crosstool can hang default
configurations off of those features (via implies).

--
MOS_MIGRATED_REVID=89035231
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 f98ebaa..377da77 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
@@ -672,7 +672,9 @@
     }
     Set<String> unsupportedFeatures = unsupportedFeaturesBuilder.build();
     ImmutableSet.Builder<String> requestedFeatures = ImmutableSet.builder();
-    for (String feature : Iterables.concat(DEFAULT_FEATURES, ruleContext.getFeatures())) {
+    for (String feature : Iterables.concat(
+        ImmutableSet.of(toolchain.getCompilationMode().toString()), DEFAULT_FEATURES,
+        ruleContext.getFeatures())) {
       if (!unsupportedFeatures.contains(feature)) {
         requestedFeatures.add(feature);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
index e1940a5..43bd366 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
@@ -16,6 +16,7 @@
 import com.google.common.base.Preconditions;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.config.CompilationMode;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -223,4 +224,11 @@
   public CcToolchainFeatures getFeatures() {
     return cppConfiguration.getFeatures();
   }
+  
+  /**
+   * Returns the compilation mode.
+   */
+  public CompilationMode getCompilationMode() {
+    return cppConfiguration.getCompilationMode();
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
index fbef38e..1fca0b4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
@@ -978,6 +978,14 @@
   public CcToolchainFeatures getFeatures() {
     return toolchainFeatures;
   }
+  
+  /**
+   * Returns the configured current compilation mode. Rules should not call this directly, but
+   * instead use {@code CcToolchainProvider.getCompilationMode}.
+   */
+  public CompilationMode getCompilationMode() {
+    return compilationMode;
+  }
 
   /**
    * Returns whether the toolchain supports the gold linker.