If the toolchain defines an action_config for each type of CppLinkAction,
hardcoded action_configs are not used.

--
MOS_MIGRATED_REVID=128695960
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 59ec2d5..9943a79 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
@@ -39,6 +39,7 @@
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.rules.cpp.CppConfigurationLoader.CppConfigurationParameters;
 import com.google.devtools.build.lib.rules.cpp.CppLinkActionConfigs.CppLinkPlatform;
+import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
@@ -47,6 +48,7 @@
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain.ActionConfig;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.LinkingModeFlags;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.LipoMode;
 import com.google.devtools.common.options.OptionsParsingException;
@@ -682,6 +684,21 @@
     return result.build();
   }
   
+  private boolean linkActionsAreConfigured(CToolchain toolchain) {
+    for (LinkTargetType type : LinkTargetType.values()) {
+      boolean typeIsConfigured = false;
+      for (ActionConfig actionConfig : toolchain.getActionConfigList()) {
+        if (actionConfig.getActionName().equals(type.getActionName())) {
+          typeIsConfigured = true;
+          break;
+        }
+      }
+      if (!typeIsConfigured) {
+        return false;
+      }
+    }
+    return true;
+  }
 
   // TODO(bazel-team): Remove this once bazel supports all crosstool flags through
   // feature configuration, and all crosstools have been converted.
@@ -697,13 +714,15 @@
       return toolchain;
     }
     try {
-      
-      if (getTargetLibc().equals("macosx")) {
-        TextFormat.merge(
-            CppLinkActionConfigs.getCppLinkActionConfigs(CppLinkPlatform.MAC), toolchainBuilder);
-      } else {
-        TextFormat.merge(
-            CppLinkActionConfigs.getCppLinkActionConfigs(CppLinkPlatform.LINUX), toolchainBuilder);
+      if (!linkActionsAreConfigured(toolchain)) {
+        if (getTargetLibc().equals("macosx")) {
+          TextFormat.merge(
+              CppLinkActionConfigs.getCppLinkActionConfigs(CppLinkPlatform.MAC), toolchainBuilder);
+        } else {
+          TextFormat.merge(
+              CppLinkActionConfigs.getCppLinkActionConfigs(CppLinkPlatform.LINUX),
+              toolchainBuilder);
+        }
       }
 
       if (!features.contains("dependency_file")) {
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
index a3c5af2..adafd77 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
@@ -22,12 +22,12 @@
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
+import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
 import com.google.protobuf.TextFormat;
-
 import java.io.IOException;
 
 /**
@@ -230,6 +230,99 @@
           + "   pattern: 'foo%{bad_variable}bar'"
           + "}";
 
+  public static final String INCOMPLETE_EXECUTABLE_ACTION_CONFIG =
+      ""
+          + "action_config {"
+          + "   config_name: '"
+          + LinkTargetType.EXECUTABLE.getActionName()
+          + "'"
+          + "   action_name: '"
+          + LinkTargetType.EXECUTABLE.getActionName()
+          + "'"
+          + "   tool {"
+          + "      tool_path: 'DUMMY_TOOL'"
+          + "   }"
+          + "}";
+
+  public static final String INCOMPLETE_DYNAMIC_LIBRARY_ACTION_CONFIG =
+      ""
+          + "action_config {"
+          + "   config_name: '"
+          + LinkTargetType.DYNAMIC_LIBRARY.getActionName()
+          + "'"
+          + "   action_name: '"
+          + LinkTargetType.DYNAMIC_LIBRARY.getActionName()
+          + "'"
+          + "   tool {"
+          + "      tool_path: 'DUMMY_TOOL'"
+          + "   }"
+          + "}";
+  public static final String INCOMPLETE_STATIC_LIBRARY_ACTION_CONFIG =
+      ""
+          + "action_config {"
+          + "   config_name: '"
+          + LinkTargetType.STATIC_LIBRARY.getActionName()
+          + "'"
+          + "   action_name: '"
+          + LinkTargetType.STATIC_LIBRARY.getActionName()
+          + "'"
+          + "   tool {"
+          + "      tool_path: 'DUMMY_TOOL'"
+          + "   }"
+          + "}";
+  public static final String INCOMPLETE_PIC_STATIC_LIBRARY_ACTION_CONFIG =
+      ""
+          + "action_config {"
+          + "   config_name: '"
+          + LinkTargetType.PIC_STATIC_LIBRARY.getActionName()
+          + "'"
+          + "   action_name: '"
+          + LinkTargetType.PIC_STATIC_LIBRARY.getActionName()
+          + "'"
+          + "   tool {"
+          + "      tool_path: 'DUMMY_TOOL'"
+          + "   }"
+          + "}";
+  public static final String INCOMPLETE_ALWAYS_LINK_STATIC_LIBRARY_ACTION_CONFIG =
+      ""
+          + "action_config {"
+          + "   config_name: '"
+          + LinkTargetType.ALWAYS_LINK_STATIC_LIBRARY.getActionName()
+          + "'"
+          + "   action_name: '"
+          + LinkTargetType.ALWAYS_LINK_STATIC_LIBRARY.getActionName()
+          + "'"
+          + "   tool {"
+          + "      tool_path: 'DUMMY_TOOL'"
+          + "   }"
+          + "}";
+  public static final String INCOMPLETE_ALWAYS_LINK_PIC_STATIC_LIBRARY_EXECUTABLE_ACTION_CONFIG =
+      ""
+          + "action_config {"
+          + "   config_name: '"
+          + LinkTargetType.ALWAYS_LINK_PIC_STATIC_LIBRARY.getActionName()
+          + "'"
+          + "   action_name: '"
+          + LinkTargetType.ALWAYS_LINK_PIC_STATIC_LIBRARY.getActionName()
+          + "'"
+          + "   tool {"
+          + "      tool_path: 'DUMMY_TOOL'"
+          + "   }"
+          + "}";
+  public static final String INCOMPLETE_INTERFACE_DYNAMIC_LIBRARY_ACTION_CONFIG =
+      ""
+          + "action_config {"
+          + "   config_name: '"
+          + LinkTargetType.INTERFACE_DYNAMIC_LIBRARY.getActionName()
+          + "'"
+          + "   action_name: '"
+          + LinkTargetType.INTERFACE_DYNAMIC_LIBRARY.getActionName()
+          + "'"
+          + "   tool {"
+          + "      tool_path: 'DUMMY_TOOL'"
+          + "   }"
+          + "}";
+
   /** Filter to remove implicit dependencies of C/C++ rules. */
   private final Predicate<Label> ccLabelFilter =
       new Predicate<Label>() {
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 a374dad..9842db8 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
@@ -24,6 +24,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import com.google.common.base.Joiner;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -43,15 +44,13 @@
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
+import java.util.ArrayList;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * "White-box" unit test of cc_library rule.
  */
@@ -242,6 +241,42 @@
         .containsExactlyElementsIn(action.getLinkCommandLine().getLinkopts());
   }
 
+  /**
+   * Tests that if a given crosstool defines action configs for all link actions, that the link
+   * action will be configured from the crosstool instead of from hard-coded action_configs in
+   * {@code CppLinkActionConfigs}.
+   */
+  @Test
+  public void testUsesCrosstoolIfLinkActionDefined() throws Exception {
+    String completeBrokenActionConfigs =
+        Joiner.on("\n")
+            .join(
+                MockCcSupport.INCOMPLETE_EXECUTABLE_ACTION_CONFIG,
+                MockCcSupport.INCOMPLETE_DYNAMIC_LIBRARY_ACTION_CONFIG,
+                MockCcSupport.INCOMPLETE_STATIC_LIBRARY_ACTION_CONFIG,
+                MockCcSupport.INCOMPLETE_PIC_STATIC_LIBRARY_ACTION_CONFIG,
+                MockCcSupport.INCOMPLETE_ALWAYS_LINK_STATIC_LIBRARY_ACTION_CONFIG,
+                MockCcSupport.INCOMPLETE_ALWAYS_LINK_PIC_STATIC_LIBRARY_EXECUTABLE_ACTION_CONFIG,
+                MockCcSupport.INCOMPLETE_INTERFACE_DYNAMIC_LIBRARY_ACTION_CONFIG);
+    AnalysisMock.get().ccSupport().setupCrosstool(mockToolsConfig, completeBrokenActionConfigs);
+
+    useConfiguration(
+        "--features=" + Link.LinkTargetType.EXECUTABLE.getActionName(),
+        "--features=" + Link.LinkTargetType.DYNAMIC_LIBRARY.getActionName(),
+        "--features=" + Link.LinkTargetType.STATIC_LIBRARY.getActionName(),
+        "--features=" + Link.LinkTargetType.PIC_STATIC_LIBRARY.getActionName(),
+        "--features=" + Link.LinkTargetType.ALWAYS_LINK_STATIC_LIBRARY.getActionName(),
+        "--features=" + Link.LinkTargetType.ALWAYS_LINK_PIC_STATIC_LIBRARY.getActionName(),
+        "--features=" + Link.LinkTargetType.INTERFACE_DYNAMIC_LIBRARY.getActionName());
+
+    ConfiguredTarget hello = getConfiguredTarget("//hello:hello_static");
+    Artifact archive =
+        FileType.filter(getFilesToBuild(hello), CppFileTypes.ARCHIVE).iterator().next();
+    CppLinkAction action = (CppLinkAction) getGeneratingAction(archive);
+
+    assertThat(Joiner.on(" ").join(action.getArgv())).doesNotContain("hello.pic.o");
+  }
+
   @Test
   public void testLinkActionCanConsumeArtifactExtensions() throws Exception {
     AnalysisMock.get()