C++: Get linker inputs for cc_fake_binary from CcLinkParams

If we get them from CcLinkParams we can avoid having an extra parameter in
CcLinkingOutputs.

RELNOTES:none
PiperOrigin-RevId: 215189634
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
index 2a370a3..8e172ff 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
@@ -56,6 +56,7 @@
 import com.google.devtools.build.lib.rules.apple.ApplePlatform;
 import com.google.devtools.build.lib.rules.cpp.CcCommon.CcFlagsSupplier;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationHelper.CompilationInfo;
+import com.google.devtools.build.lib.rules.cpp.CcLinkParams.Linkstamp;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.DynamicMode;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool;
@@ -127,7 +128,10 @@
     private void checkRestrictedUsage(RuleContext ruleContext) {
       Rule rule = ruleContext.getRule();
       if (rule.getRuleClassObject().isSkylark()
-          || (!rule.getRuleClass().equals("java_binary")
+          || (!rule.getRuleClass().equals("cc_binary")
+              && !rule.getRuleClass().equals("cc_test")
+              && !rule.getRuleClass().equals("cc_fake_binary")
+              && !rule.getRuleClass().equals("java_binary")
               && !rule.getRuleClass().equals("java_test")
               && !rule.getRuleClass().equals("py_binary")
               && !rule.getRuleClass().equals("py_test"))) {
@@ -342,11 +346,13 @@
     }
 
     CcLinkParams linkParams =
-        collectCcLinkParams(
+        CcLinkParams.buildFinalExtraLinkTimeLibraries(
             ruleContext,
-            linkingMode != Link.LinkingMode.DYNAMIC,
-            isLinkShared(ruleContext),
-            common.getLinkopts());
+            collectCcLinkParams(
+                ruleContext,
+                linkingMode != Link.LinkingMode.DYNAMIC,
+                isLinkShared(ruleContext),
+                common.getLinkopts()));
 
     Artifact generatedDefFile = null;
     Artifact customDefFile = null;
@@ -419,7 +425,11 @@
       outputLibrary = dynamicLibrariesForRuntime.get(0);
     }
     Iterable<Artifact> fakeLinkerInputs =
-        fake ? ccLinkingOutputsBinary.getLinkActionInputs() : ImmutableList.<Artifact>of();
+        fake
+            ? getFakeLinkerInputs(
+                ccLinkingOutputsAndCcLinkingInfo.second.first,
+                ccLauncherInfo.getCcCompilationOutputs(ruleContext))
+            : ImmutableList.of();
     CcLinkingOutputs.Builder linkingOutputsBuilder = new CcLinkingOutputs.Builder();
     if (isLinkShared(ruleContext)) {
       linkingOutputsBuilder.addDynamicLibraryForLinking(outputLibrary);
@@ -550,6 +560,35 @@
         .build();
   }
 
+  private static Iterable<Artifact> getFakeLinkerInputs(
+      CcLinkingInfo ccLinkingInfo, CcCompilationOutputs ccCompilationOutputs) {
+    Preconditions.checkState(
+        ccLinkingInfo.getStaticModeParamsForExecutable()
+            == ccLinkingInfo.getStaticModeParamsForDynamicLibrary());
+    Preconditions.checkState(
+        ccLinkingInfo.getStaticModeParamsForDynamicLibrary()
+            == ccLinkingInfo.getDynamicModeParamsForExecutable());
+    Preconditions.checkState(
+        ccLinkingInfo.getDynamicModeParamsForExecutable()
+            == ccLinkingInfo.getDynamicModeParamsForDynamicLibrary());
+    CcLinkParams ccLinkParams = ccLinkingInfo.getStaticModeParamsForExecutable();
+    ImmutableList.Builder<Artifact> linkstamps = ImmutableList.builder();
+    for (Linkstamp linkstamp : ccLinkParams.getLinkstamps().toList()) {
+      linkstamps.add(linkstamp.getArtifact()).addAll(linkstamp.getDeclaredIncludeSrcs());
+    }
+    return ImmutableList.<Artifact>builder()
+        .addAll(
+            ccLinkParams.getLibraries().toList().stream()
+                .filter(LinkerInput::isFake)
+                .map(LinkerInput::getArtifact)
+                .collect(ImmutableList.toImmutableList()))
+        .addAll(linkstamps.build())
+        .addAll(ccLinkParams.getNonCodeInputs())
+        .addAll(ccCompilationOutputs.getObjectFiles(/* usePic= */ true))
+        .addAll(ccCompilationOutputs.getObjectFiles(/* usePic= */ false))
+        .build();
+  }
+
   public static Pair<CcLinkingOutputs, Pair<CcLinkingInfo, CcCompilationOutputs>>
       createTransitiveLinkingActions(
           RuleContext ruleContext,
@@ -891,7 +930,6 @@
   private static CcLinkParams collectCcLinkParams(RuleContext context,
       boolean linkingStatically, boolean linkShared, List<String> linkopts) {
     CcLinkParams.Builder builder = CcLinkParams.builder(linkingStatically, linkShared);
-
     builder.addCcLibrary(context);
     if (!isLinkShared(context)) {
       builder.addTransitiveTarget(CppHelper.mallocForTarget(context));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java
index 4b8d4f9..3074fea 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java
@@ -26,6 +26,7 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
@@ -162,6 +163,30 @@
     return new Builder(linkingStatically, linkShared);
   }
 
+  /**
+   * {@link CcLinkParams} objects contain {@link ExtraLinkTimeLibraries} used for Go linking. These
+   * are actually callbacks that get called at the end. With this method we build a new CcLinkParams
+   * in which we have called every callback and put the result into the list of libraries. The list
+   * of {@link ExtraLinkTimeLibraries} then gets nullified.
+   */
+  public static CcLinkParams buildFinalExtraLinkTimeLibraries(
+      RuleContext ruleContext, CcLinkParams ccLinkParams)
+      throws InterruptedException, RuleErrorException {
+    ExtraLinkTimeLibraries extraLinkTimeLibraries = ccLinkParams.getExtraLinkTimeLibraries();
+    NestedSetBuilder<LibraryToLink> builtExtraLinkTimeLibrariesBuilder =
+        NestedSetBuilder.linkOrder();
+    if (extraLinkTimeLibraries != null) {
+      for (ExtraLinkTimeLibrary extraLibrary : extraLinkTimeLibraries.getExtraLibraries()) {
+        builtExtraLinkTimeLibrariesBuilder.addTransitive(extraLibrary.buildLibraries(ruleContext));
+      }
+    }
+    CcLinkParams.Builder ccLinkParamsBuilder = CcLinkParams.builder();
+    ccLinkParamsBuilder.addTransitiveArgs(ccLinkParams);
+    ccLinkParamsBuilder.addLibraries(builtExtraLinkTimeLibrariesBuilder.build());
+    ccLinkParamsBuilder.extraLinkTimeLibrariesBuilder = null;
+    return ccLinkParamsBuilder.build();
+  }
+
   public static final Builder builder() {
     return new Builder();
   }
@@ -258,16 +283,6 @@
     }
 
     /**
-     * Includes link parameters from a collection of dependency targets.
-     */
-    public Builder addTransitiveTargets(Iterable<? extends TransitiveInfoCollection> targets) {
-      for (TransitiveInfoCollection target : targets) {
-        addTransitiveTarget(target);
-      }
-      return this;
-    }
-
-    /**
      * Includes link parameters from a dependency target.
      *
      * <p>The target should implement {@link CcLinkingInfo}. If it does not, the method does not do
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
index c255478..e9c731d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
@@ -742,7 +742,6 @@
       result.addAllLtoArtifacts(dynamicLinkActionBuilder.getAllLtoBackendArtifacts());
     }
     CppLinkAction dynamicLinkAction = dynamicLinkActionBuilder.build();
-    result.addLinkActionInputs(dynamicLinkAction.getInputs());
     env.registerAction(dynamicLinkAction);
 
     LibraryToLink dynamicLibrary = dynamicLinkAction.getOutputLibrary();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java
index 5c37a21..c0fb563 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java
@@ -57,21 +57,18 @@
   private final ImmutableList<LibraryToLink> dynamicLibrariesForRuntime;
 
   private final ImmutableList<LtoBackendArtifacts> allLtoArtifacts;
-  private final ImmutableList<Artifact> linkActionInputs;
 
   private CcLinkingOutputs(
       ImmutableList<LibraryToLink> staticLibraries,
       ImmutableList<LibraryToLink> picStaticLibraries,
       ImmutableList<LibraryToLink> dynamicLibrariesForLinking,
       ImmutableList<LibraryToLink> dynamicLibrariesForRuntime,
-      ImmutableList<LtoBackendArtifacts> allLtoArtifacts,
-      ImmutableList<Artifact> linkActionInputs) {
+      ImmutableList<LtoBackendArtifacts> allLtoArtifacts) {
     this.staticLibraries = staticLibraries;
     this.picStaticLibraries = picStaticLibraries;
     this.dynamicLibrariesForLinking = dynamicLibrariesForLinking;
     this.dynamicLibrariesForRuntime = dynamicLibrariesForRuntime;
     this.allLtoArtifacts = allLtoArtifacts;
-    this.linkActionInputs = linkActionInputs;
   }
 
   @Override
@@ -109,10 +106,6 @@
     return allLtoArtifacts;
   }
 
-  public ImmutableList<Artifact> getLinkActionInputs() {
-    return linkActionInputs;
-  }
-
   public boolean isEmpty() {
     return staticLibraries.isEmpty()
         && picStaticLibraries.isEmpty()
@@ -269,7 +262,6 @@
     // same list return the .pdb file for Windows.
     private final ImmutableList.Builder<LtoBackendArtifacts> allLtoArtifacts =
         ImmutableList.builder();
-    private final ImmutableList.Builder<Artifact> linkActionInputs = ImmutableList.builder();
 
     public CcLinkingOutputs build() {
       return new CcLinkingOutputs(
@@ -277,8 +269,7 @@
           ImmutableList.copyOf(picStaticLibraries),
           ImmutableList.copyOf(dynamicLibrariesForLinking),
           ImmutableList.copyOf(dynamicLibrariesForRuntime),
-          allLtoArtifacts.build(),
-          linkActionInputs.build());
+          allLtoArtifacts.build());
     }
 
     public Builder merge(CcLinkingOutputs outputs) {
@@ -287,7 +278,6 @@
       dynamicLibrariesForLinking.addAll(outputs.getDynamicLibrariesForLinking());
       dynamicLibrariesForRuntime.addAll(outputs.getDynamicLibrariesForRuntime());
       allLtoArtifacts.addAll(outputs.getAllLtoArtifacts());
-      linkActionInputs.addAll(outputs.getLinkActionInputs());
       return this;
     }
 
@@ -335,10 +325,5 @@
       this.allLtoArtifacts.addAll(allLtoArtifacts);
       return this;
     }
-
-    public Builder addLinkActionInputs(Iterable<Artifact> linkActionInputs) {
-      this.linkActionInputs.addAll(linkActionInputs);
-      return this;
-    }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
index 2d21d7d..a370cf3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
@@ -39,7 +39,6 @@
 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;
-import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 import com.google.devtools.build.lib.packages.RuleErrorConsumer;
 import com.google.devtools.build.lib.rules.cpp.CcLinkParams.Linkstamp;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
@@ -1393,19 +1392,12 @@
    * #addLibraries}, and {@link #addLinkstamps}.
    */
   public CppLinkActionBuilder addLinkParams(
-      CcLinkParams linkParams, RuleErrorConsumer errorListener)
-      throws InterruptedException, RuleErrorException {
+      CcLinkParams linkParams, RuleErrorConsumer errorListener) {
     addLinkopts(linkParams.flattenedLinkopts());
     addLibraries(linkParams.getLibraries());
     if (linkParams.getNonCodeInputs() != null) {
       addNonCodeInputs(linkParams.getNonCodeInputs());
     }
-    ExtraLinkTimeLibraries extraLinkTimeLibraries = linkParams.getExtraLinkTimeLibraries();
-    if (extraLinkTimeLibraries != null) {
-      for (ExtraLinkTimeLibrary extraLibrary : extraLinkTimeLibraries.getExtraLibraries()) {
-        addLibraries(extraLibrary.buildLibraries(ruleContext));
-      }
-    }
     CppHelper.checkLinkstampsUnique(errorListener, linkParams);
     addLinkstamps(linkParams.getLinkstamps());
     return this;