RELNOTES: Use the correct build configuration for shared native deps during Android split transitions.

--
MOS_MIGRATED_REVID=126378169
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
index dd96b3a..fcdc3ec 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.actions.MiddlemanFactory;
 import com.google.devtools.build.lib.actions.Root;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.SkyFunction;
@@ -137,10 +138,11 @@
   /**
    * Returns the Artifacts that contain the workspace status for the current build request.
    *
-   * @param ruleContext the rule to use for error reporting and to determine the
-   *        configuration
+   * @param ruleContext the rule to use for error reporting.
+   * @param config the current build configuration.
    */
-  ImmutableList<Artifact> getBuildInfo(RuleContext ruleContext, BuildInfoKey key);
+  ImmutableList<Artifact> getBuildInfo(
+      RuleContext ruleContext, BuildInfoKey key, BuildConfiguration config);
 
   /**
    * Returns the set of orphan Artifacts (i.e. Artifacts without generating action). Should only be
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
index 40fdf9b..3c137f9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
@@ -44,8 +44,7 @@
    * host configuration. Otherwise it returns the value of the stamp attribute,
    * or of the stamp option if the attribute value is -1.
    */
-  public static boolean isStampingEnabled(RuleContext ruleContext) {
-    BuildConfiguration config = ruleContext.getConfiguration();
+  public static boolean isStampingEnabled(RuleContext ruleContext, BuildConfiguration config) {
     if (config.isHostConfiguration()
         || !ruleContext.attributes().has("stamp", BuildType.TRISTATE)) {
       return false;
@@ -54,6 +53,10 @@
     return stamp == TriState.YES || (stamp == TriState.AUTO && config.stampBinaries());
   }
 
+  public static boolean isStampingEnabled(RuleContext ruleContext) {
+    return isStampingEnabled(ruleContext, ruleContext.getConfiguration());
+  }
+
   // TODO(bazel-team): These need Iterable<? extends TransitiveInfoCollection> because they need to
   // be called with Iterable<ConfiguredTarget>. Once the configured target lockdown is complete, we
   // can eliminate the "extends" clauses.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
index 2f8762d..5fd3d43 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
@@ -313,14 +313,14 @@
   }
 
   @Override
-  public ImmutableList<Artifact> getBuildInfo(RuleContext ruleContext, BuildInfoKey key) {
-    boolean stamp = AnalysisUtils.isStampingEnabled(ruleContext);
+  public ImmutableList<Artifact> getBuildInfo(
+      RuleContext ruleContext, BuildInfoKey key, BuildConfiguration config) {
+    boolean stamp = AnalysisUtils.isStampingEnabled(ruleContext, config);
     BuildInfoCollectionValue collectionValue =
         (BuildInfoCollectionValue) skyframeEnv.getValue(BuildInfoCollectionValue.key(
-            new BuildInfoCollectionValue.BuildInfoKeyAndConfig(
-                key, ruleContext.getConfiguration())));
+            new BuildInfoCollectionValue.BuildInfoKeyAndConfig(key, config)));
     if (collectionValue == null) {
-      throw collectDebugInfoAndCrash(key, ruleContext.getConfiguration());
+      throw collectDebugInfoAndCrash(key, config);
     }
     BuildInfoCollection collection = collectionValue.getCollection();
    return stamp ? collection.getStampedBuildInfo() : collection.getRedactedBuildInfo();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 5025906..d946aae 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -390,7 +390,7 @@
   }
 
   public ImmutableList<Artifact> getBuildInfo(BuildInfoKey key) {
-    return getAnalysisEnvironment().getBuildInfo(this, key);
+    return getAnalysisEnvironment().getBuildInfo(this, key, getConfiguration());
   }
 
   @VisibleForTesting
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java
index 3e17a83..6d240bb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java
@@ -91,7 +91,8 @@
     /**
      * Create an artifact at the specified root-relative path in the bin directory.
      */
-    Artifact create(RuleContext ruleContext, PathFragment rootRelativePath);
+    Artifact create(RuleContext ruleContext, BuildConfiguration configuration,
+                    PathFragment rootRelativePath);
   }
 
   /**
@@ -100,9 +101,9 @@
    */
   public static final LinkArtifactFactory DEFAULT_ARTIFACT_FACTORY = new LinkArtifactFactory() {
     @Override
-    public Artifact create(RuleContext ruleContext, PathFragment rootRelativePath) {
-      return ruleContext.getDerivedArtifact(rootRelativePath,
-          ruleContext.getConfiguration().getBinDirectory());
+    public Artifact create(RuleContext ruleContext, BuildConfiguration configuration,
+                           PathFragment rootRelativePath) {
+      return ruleContext.getDerivedArtifact(rootRelativePath, configuration.getBinDirectory());
     }
   };
 
@@ -693,7 +694,7 @@
       ImmutableList.Builder<LTOBackendArtifacts> ltoOutputs = ImmutableList.builder();
       for (Artifact a : allBitcode.values()) {
         LTOBackendArtifacts ltoArtifacts = new LTOBackendArtifacts(
-            ltoOutputRootPrefix, a, allBitcode, ruleContext, linkArtifactFactory);
+            ltoOutputRootPrefix, a, allBitcode, ruleContext, configuration, linkArtifactFactory);
         ltoOutputs.add(ltoArtifacts);
       }
       return ltoOutputs.build();
@@ -732,7 +733,7 @@
       }
 
       final ImmutableList<Artifact> buildInfoHeaderArtifacts = !linkstamps.isEmpty()
-          ? ruleContext.getBuildInfo(CppBuildInfo.KEY)
+          ? analysisEnvironment.getBuildInfo(ruleContext, CppBuildInfo.KEY, configuration)
           : ImmutableList.<Artifact>of();
 
       boolean needWholeArchive = wholeArchive || needWholeArchive(
@@ -762,7 +763,8 @@
                   interfaceOutput, filteredNonLibraryArtifacts, this.ltoBitcodeFiles);
 
       final ImmutableMap<Artifact, Artifact> linkstampMap =
-          mapLinkstampsToOutputs(linkstamps, ruleContext, output, linkArtifactFactory);
+          mapLinkstampsToOutputs(linkstamps, ruleContext, configuration, output,
+                                 linkArtifactFactory);
 
       PathFragment ltoOutputRootPrefix = null;
       if (isLTOIndexing && allLTOArtifacts == null) {
@@ -795,7 +797,7 @@
       @Nullable
       final Artifact paramFile =
           canSplitCommandLine()
-              ? linkArtifactFactory.create(ruleContext, paramRootPath)
+              ? linkArtifactFactory.create(ruleContext, configuration, paramRootPath)
               : null;
 
       LinkCommandLine.Builder linkCommandLineBuilder =
@@ -990,8 +992,8 @@
      *         corresponding object file that should be fed into the link
      */
     public static ImmutableMap<Artifact, Artifact> mapLinkstampsToOutputs(
-        Collection<Artifact> linkstamps, RuleContext ruleContext, Artifact outputBinary,
-        LinkArtifactFactory linkArtifactFactory) {
+        Collection<Artifact> linkstamps, RuleContext ruleContext, BuildConfiguration configuration,
+        Artifact outputBinary, LinkArtifactFactory linkArtifactFactory) {
       ImmutableMap.Builder<Artifact, Artifact> mapBuilder = ImmutableMap.builder();
 
       PathFragment outputBinaryPath = outputBinary.getRootRelativePath();
@@ -1004,7 +1006,7 @@
         mapBuilder.put(linkstamp,
             // Note that link stamp actions can be shared between link actions that output shared
             // native dep libraries.
-            linkArtifactFactory.create(ruleContext, stampOutputPath));
+            linkArtifactFactory.create(ruleContext, configuration, stampOutputPath));
       }
       return mapBuilder.build();    }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LTOBackendArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LTOBackendArtifacts.java
index f5765f0..6eeadae 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LTOBackendArtifacts.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LTOBackendArtifacts.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.actions.LTOBackendAction;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
 
@@ -73,16 +74,16 @@
       Artifact bitcodeFile,
       Map<PathFragment, Artifact> allBitCodeFiles,
       RuleContext ruleContext,
+      BuildConfiguration configuration,
       CppLinkAction.LinkArtifactFactory linkArtifactFactory) {
     this.bitcodeFile = bitcodeFile;
     PathFragment obj = ltoOutputRootPrefix.getRelative(bitcodeFile.getRootRelativePath());
 
-    objectFile = linkArtifactFactory.create(ruleContext, obj);
-    imports =
-        linkArtifactFactory.create(ruleContext, FileSystemUtils.appendExtension(obj, ".imports"));
-    index =
-        linkArtifactFactory.create(
-            ruleContext, FileSystemUtils.appendExtension(obj, ".thinlto.bc"));
+    objectFile = linkArtifactFactory.create(ruleContext, configuration, obj);
+    imports = linkArtifactFactory.create(
+        ruleContext, configuration, FileSystemUtils.appendExtension(obj, ".imports"));
+    index = linkArtifactFactory.create(
+        ruleContext, configuration, FileSystemUtils.appendExtension(obj, ".thinlto.bc"));
 
     bitcodeFiles = allBitCodeFiles;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
index ed1bdbb..0b36ed6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
@@ -35,6 +35,7 @@
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.lib.vfs.PathFragment;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedList;
@@ -61,9 +62,10 @@
   private static final CppLinkAction.LinkArtifactFactory SHAREABLE_LINK_ARTIFACT_FACTORY =
       new CppLinkAction.LinkArtifactFactory() {
         @Override
-        public Artifact create(RuleContext ruleContext, PathFragment rootRelativePath) {
+        public Artifact create(RuleContext ruleContext, BuildConfiguration configuration,
+            PathFragment rootRelativePath) {
           return ruleContext.getShareableArtifact(rootRelativePath,
-              ruleContext.getConfiguration().getBinDirectory());
+              configuration.getBinDirectory());
         }
       };
 
@@ -169,7 +171,8 @@
         CppHelper.resolveLinkstamps(ruleContext, linkParams);
     List<Artifact> buildInfoArtifacts = linkstamps.isEmpty()
         ? ImmutableList.<Artifact>of()
-        : ruleContext.getBuildInfo(CppBuildInfo.KEY);
+        : ruleContext.getAnalysisEnvironment().getBuildInfo(
+            ruleContext, CppBuildInfo.KEY, configuration);
 
     boolean shareNativeDeps = configuration.getFragment(CppConfiguration.class).shareNativeDeps();
     NestedSet<LibraryToLink> linkerInputs = linkParams.getLibraries();
@@ -178,7 +181,7 @@
             LinkerInputs.toLibraryArtifacts(linkerInputs),
                 linkopts, linkstamps.keySet(), buildInfoArtifacts,
                 ruleContext.getFeatures()),
-            ruleContext.getConfiguration().getBinDirectory())
+            configuration.getBinDirectory())
         : nativeDeps;
     CppLinkAction.Builder builder = new CppLinkAction.Builder(
         ruleContext, sharedLibrary, configuration, toolchain);
@@ -285,7 +288,6 @@
     for (String feature : features) {
       fp.addStrings(feature);
     }
-    return new PathFragment(
-        "_nativedeps/" + fp.hexDigestAndReset() + ".so");
+    return new PathFragment("_nativedeps/" + fp.hexDigestAndReset() + ".so");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
index 5c4b3a1..1087e8c 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
@@ -174,8 +174,9 @@
     }
 
     @Override
-    public ImmutableList<Artifact> getBuildInfo(RuleContext ruleContext, BuildInfoKey key) {
-      return original.getBuildInfo(ruleContext, key);
+    public ImmutableList<Artifact> getBuildInfo(RuleContext ruleContext, BuildInfoKey key,
+        BuildConfiguration config) {
+      return original.getBuildInfo(ruleContext, key, config);
     }
 
     @Override
@@ -373,7 +374,8 @@
     }
 
     @Override
-    public ImmutableList<Artifact> getBuildInfo(RuleContext ruleContext, BuildInfoKey key) {
+    public ImmutableList<Artifact> getBuildInfo(RuleContext ruleContext, BuildInfoKey key,
+        BuildConfiguration config) {
       return ImmutableList.of();
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index d552c20..ce4b46a 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -1678,7 +1678,8 @@
     }
 
     @Override
-    public ImmutableList<Artifact> getBuildInfo(RuleContext ruleContext, BuildInfoKey key) {
+    public ImmutableList<Artifact> getBuildInfo(RuleContext ruleContext, BuildInfoKey key,
+        BuildConfiguration config) {
       throw new UnsupportedOperationException();
     }