C++: Simplify code that used old LibraryToLink

RELNOTES:none
PiperOrigin-RevId: 234100718
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index ad6bba3..4a5b1e6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -50,7 +50,6 @@
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
-import com.google.devtools.build.lib.rules.cpp.LinkerInputs.SolibLibraryToLink;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.util.FileTypeSet;
@@ -326,52 +325,6 @@
       ccLinkingOutputs = linkingHelper.link(ccCompilationOutputs);
     }
 
-    /*
-     * Add the libraries from srcs, if any. For static/mostly static
-     * linking we setup the dynamic libraries if there are no static libraries
-     * to choose from. Path to the libraries will be mangled to avoid using
-     * absolute path names on the -rpath, but library filenames will be
-     * preserved (since some libraries might have SONAME tag) - symlink will
-     * be created to the parent directory instead.
-     *
-     * For compatibility with existing BUILD files, any ".a" or ".lo" files listed in
-     * srcs are assumed to be position-independent code, or at least suitable for
-     * inclusion in shared libraries, unless they end with ".nopic.a" or ".nopic.lo".
-     *
-     * Note that some target platforms do not require shared library code to be PIC.
-     */
-    ImmutableList<LinkerInputs.LibraryToLink> precompiledStaticLibraries =
-        ImmutableList.<LinkerInputs.LibraryToLink>builder()
-            .addAll(
-                LinkerInputs.opaqueLibrariesToLink(
-                    ArtifactCategory.STATIC_LIBRARY, precompiledFiles.getStaticLibraries()))
-            .addAll(
-                LinkerInputs.opaqueLibrariesToLink(
-                    ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY,
-                    precompiledFiles.getAlwayslinkStaticLibraries()))
-            .build();
-
-    ImmutableList<LinkerInputs.LibraryToLink> precompiledPicStaticLibraries =
-        ImmutableList.<LinkerInputs.LibraryToLink>builder()
-            .addAll(
-                LinkerInputs.opaqueLibrariesToLink(
-                    ArtifactCategory.STATIC_LIBRARY, precompiledFiles.getPicStaticLibraries()))
-            .addAll(
-                LinkerInputs.opaqueLibrariesToLink(
-                    ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY,
-                    precompiledFiles.getPicAlwayslinkLibraries()))
-            .build();
-
-    List<LinkerInputs.LibraryToLink> dynamicLibraries =
-        ImmutableList.copyOf(
-            Iterables.transform(
-                precompiledFiles.getSharedLibraries(),
-                library ->
-                    LinkerInputs.solibLibraryToLink(
-                        common.getDynamicLibrarySymlink(library, true),
-                        library,
-                        CcLinkingOutputs.libraryIdentifierOf(library))));
-
     ImmutableSortedMap.Builder<String, NestedSet<Artifact>> outputGroups =
         ImmutableSortedMap.naturalOrder();
     if (!ccLinkingOutputs.isEmpty()) {
@@ -385,10 +338,7 @@
     }
     List<LibraryToLink> precompiledLibraries =
         convertPrecompiledLibrariesToLibraryToLink(
-            ruleContext.getFragment(CppConfiguration.class).forcePic(),
-            precompiledStaticLibraries,
-            precompiledPicStaticLibraries,
-            dynamicLibraries);
+            common, ruleContext.getFragment(CppConfiguration.class).forcePic(), precompiledFiles);
 
     if (!ccCompilationOutputs.isEmpty()) {
       checkIfLinkOutputsCollidingWithPrecompiledFiles(
@@ -708,94 +658,112 @@
     return ccCompilationOutputsIsEmpty && !ccLinkingOutputsIsEmpty;
   }
 
+  private static Map<String, Artifact> buildMapIdentifierToArtifact(Iterable<Artifact> artifacts) {
+    ImmutableMap.Builder<String, Artifact> libraries = ImmutableMap.builder();
+    for (Artifact artifact : artifacts) {
+      libraries.put(CcLinkingOutputs.libraryIdentifierOf(artifact), artifact);
+    }
+    return libraries.build();
+  }
+
+  /*
+   * Add the libraries from srcs, if any. For static/mostly static
+   * linking we setup the dynamic libraries if there are no static libraries
+   * to choose from. Path to the libraries will be mangled to avoid using
+   * absolute path names on the -rpath, but library filenames will be
+   * preserved (since some libraries might have SONAME tag) - symlink will
+   * be created to the parent directory instead.
+   *
+   * For compatibility with existing BUILD files, any ".a" or ".lo" files listed in
+   * srcs are assumed to be position-independent code, or at least suitable for
+   * inclusion in shared libraries, unless they end with ".nopic.a" or ".nopic.lo".
+   *
+   * Note that some target platforms do not require shared library code to be PIC.
+   */
   private static List<LibraryToLink> convertPrecompiledLibrariesToLibraryToLink(
-      boolean forcePic,
-      List<LinkerInputs.LibraryToLink> staticLibraries,
-      List<LinkerInputs.LibraryToLink> picStaticLibraries,
-      List<LinkerInputs.LibraryToLink> dynamicLibrariesForRuntime) {
+      CcCommon common, boolean forcePic, PrecompiledFiles precompiledFiles) {
     ImmutableList.Builder<LibraryToLink> librariesToLink = ImmutableList.builder();
 
+    Map<String, Artifact> staticLibraries =
+        buildMapIdentifierToArtifact(precompiledFiles.getStaticLibraries());
+    Map<String, Artifact> picStaticLibraries =
+        buildMapIdentifierToArtifact(precompiledFiles.getPicStaticLibraries());
+    Map<String, Artifact> alwayslinkStaticLibraries =
+        buildMapIdentifierToArtifact(precompiledFiles.getAlwayslinkStaticLibraries());
+    Map<String, Artifact> alwayslinkPicStaticLibraries =
+        buildMapIdentifierToArtifact(precompiledFiles.getPicAlwayslinkLibraries());
+    Map<String, Artifact> dynamicLibraries =
+        buildMapIdentifierToArtifact(precompiledFiles.getSharedLibraries());
+
     Set<String> identifiersUsed = new HashSet<>();
-    // Here we hae an O(n^2) algorithm, the size of the inputs is never big though, we only work
-    // here with the local libraries, none of the libraries of the transitive closure.
-    for (LinkerInputs.LibraryToLink staticLibrary : staticLibraries) {
+    for (Map.Entry<String, Artifact> staticLibraryEntry :
+        Iterables.concat(staticLibraries.entrySet(), alwayslinkStaticLibraries.entrySet())) {
       LibraryToLink.Builder libraryToLinkBuilder = LibraryToLink.builder();
-      String identifier = staticLibrary.getLibraryIdentifier();
+      String identifier = staticLibraryEntry.getKey();
       libraryToLinkBuilder.setLibraryIdentifier(identifier);
-      List<LinkerInputs.LibraryToLink> sameIdentifierPicStaticLibraries =
-          picStaticLibraries.stream()
-              .filter(x -> x.getLibraryIdentifier().equals(identifier))
-              .collect(ImmutableList.toImmutableList());
-      boolean hadPic = false;
-      if (!sameIdentifierPicStaticLibraries.isEmpty()) {
-        hadPic = true;
-        libraryToLinkBuilder.setPicStaticLibrary(
-            sameIdentifierPicStaticLibraries.get(0).getArtifact());
-      }
-      if (!forcePic || !hadPic) {
-        libraryToLinkBuilder.setStaticLibrary(staticLibrary.getArtifact());
-      }
-      List<LinkerInputs.LibraryToLink> sameIdentifierDynamicLibraries =
-          dynamicLibrariesForRuntime.stream()
-              .filter(x -> x.getLibraryIdentifier().equals(identifier))
-              .collect(ImmutableList.toImmutableList());
-      if (!sameIdentifierDynamicLibraries.isEmpty()) {
-        LinkerInputs.LibraryToLink dynamicLibrary = sameIdentifierDynamicLibraries.get(0);
-        libraryToLinkBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
-        if (dynamicLibrary instanceof SolibLibraryToLink) {
-          libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
-              dynamicLibrary.getOriginalLibraryArtifact());
+      boolean hasPic = picStaticLibraries.containsKey(identifier);
+      boolean hasAlwaysPic = alwayslinkPicStaticLibraries.containsKey(identifier);
+      if (hasPic || hasAlwaysPic) {
+        Artifact picStaticLibrary = null;
+        if (hasPic) {
+          picStaticLibrary = picStaticLibraries.get(identifier);
+        } else {
+          picStaticLibrary = alwayslinkPicStaticLibraries.get(identifier);
         }
+        libraryToLinkBuilder.setPicStaticLibrary(picStaticLibrary);
       }
-      libraryToLinkBuilder.setAlwayslink(
-          staticLibrary.getArtifactCategory() == ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY);
+      if (!forcePic || !(hasPic || hasAlwaysPic)) {
+        libraryToLinkBuilder.setStaticLibrary(staticLibraryEntry.getValue());
+      }
+      if (dynamicLibraries.containsKey(identifier)) {
+        Artifact library = dynamicLibraries.get(identifier);
+        Artifact symlink = common.getDynamicLibrarySymlink(library, true);
+        libraryToLinkBuilder.setDynamicLibrary(symlink);
+        libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(library);
+      }
+      libraryToLinkBuilder.setAlwayslink(alwayslinkStaticLibraries.containsKey(identifier));
       identifiersUsed.add(identifier);
       librariesToLink.add(libraryToLinkBuilder.build());
     }
 
-    for (LinkerInputs.LibraryToLink picStaticLibrary : picStaticLibraries) {
-      String identifier = picStaticLibrary.getLibraryIdentifier();
+    for (Map.Entry<String, Artifact> picStaticLibraryEntry :
+        Iterables.concat(picStaticLibraries.entrySet(), alwayslinkPicStaticLibraries.entrySet())) {
+      String identifier = picStaticLibraryEntry.getKey();
       if (identifiersUsed.contains(identifier)) {
         continue;
       }
       LibraryToLink.Builder libraryToLinkBuilder = LibraryToLink.builder();
-      libraryToLinkBuilder.setPicStaticLibrary(picStaticLibrary.getArtifact());
       libraryToLinkBuilder.setLibraryIdentifier(identifier);
-      List<LinkerInputs.LibraryToLink> sameIdentifierDynamicLibraries =
-          dynamicLibrariesForRuntime.stream()
-              .filter(x -> x.getLibraryIdentifier().equals(identifier))
-              .collect(ImmutableList.toImmutableList());
-      if (!sameIdentifierDynamicLibraries.isEmpty()) {
-        LinkerInputs.LibraryToLink dynamicLibrary = sameIdentifierDynamicLibraries.get(0);
-        libraryToLinkBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
-        if (dynamicLibrary instanceof SolibLibraryToLink) {
-          libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
-              dynamicLibrary.getOriginalLibraryArtifact());
-        }
+      libraryToLinkBuilder.setPicStaticLibrary(picStaticLibraryEntry.getValue());
+      if (dynamicLibraries.containsKey(identifier)) {
+        Artifact library = dynamicLibraries.get(identifier);
+        Artifact symlink = common.getDynamicLibrarySymlink(library, true);
+        libraryToLinkBuilder.setDynamicLibrary(symlink);
+        libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(library);
       }
-      libraryToLinkBuilder.setAlwayslink(
-          picStaticLibrary.getArtifactCategory() == ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY);
+      libraryToLinkBuilder.setAlwayslink(alwayslinkPicStaticLibraries.containsKey(identifier));
       identifiersUsed.add(identifier);
       librariesToLink.add(libraryToLinkBuilder.build());
     }
 
-    for (LinkerInputs.LibraryToLink dynamicLibrary : dynamicLibrariesForRuntime) {
-      String identifier = dynamicLibrary.getLibraryIdentifier();
+    for (Map.Entry<String, Artifact> dynamicLibraryEntry : dynamicLibraries.entrySet()) {
+      String identifier = dynamicLibraryEntry.getKey();
       if (identifiersUsed.contains(identifier)) {
         continue;
       }
       LibraryToLink.Builder libraryToLinkBuilder = LibraryToLink.builder();
-      libraryToLinkBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
       libraryToLinkBuilder.setLibraryIdentifier(identifier);
-      if (dynamicLibrary instanceof SolibLibraryToLink) {
-        libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
-            dynamicLibrary.getOriginalLibraryArtifact());
-      }
+      Artifact library = dynamicLibraryEntry.getValue();
+      Artifact symlink = common.getDynamicLibrarySymlink(library, true);
+      libraryToLinkBuilder.setDynamicLibrary(symlink);
+      libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(library);
       librariesToLink.add(libraryToLinkBuilder.build());
     }
     return librariesToLink.build();
   }
 
+
+
   private static void checkIfLinkOutputsCollidingWithPrecompiledFiles(
       RuleContext ruleContext,
       CcLinkingOutputs ccLinkingOutputs,
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 47086bd..67db9ed 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
@@ -29,6 +29,7 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.cmdline.Label;
+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;
@@ -668,7 +669,7 @@
     if (shouldLinkTransitively) {
       CcLinkingContext ccLinkingContext = CcLinkingContext.merge(ccLinkingContexts);
       List<LinkerInputs.LibraryToLink> libraries =
-          LibraryToLink.convertLibraryToLinkListToLibraryToLinkList(
+          convertLibraryToLinkListToLinkerInputList(
               ccLinkingContext.getLibraries(),
               linkingMode != LinkingMode.DYNAMIC,
               dynamicLinkType.isDynamicLibrary());
@@ -820,4 +821,65 @@
 
     return result;
   }
+
+  private static List<LinkerInputs.LibraryToLink> convertLibraryToLinkListToLinkerInputList(
+      NestedSet<LibraryToLink> librariesToLink, boolean staticMode, boolean forDynamicLibrary) {
+    ImmutableList.Builder<LinkerInputs.LibraryToLink> librariesToLinkBuilder =
+        ImmutableList.builder();
+    for (LibraryToLink libraryToLink : librariesToLink) {
+      LinkerInputs.LibraryToLink staticLibraryToLink =
+          libraryToLink.getStaticLibrary() == null ? null : libraryToLink.getStaticLibraryToLink();
+      LinkerInputs.LibraryToLink picStaticLibraryToLink =
+          libraryToLink.getPicStaticLibrary() == null
+              ? null
+              : libraryToLink.getPicStaticLibraryToLink();
+      LinkerInputs.LibraryToLink libraryToLinkToUse = null;
+      if (staticMode) {
+        if (forDynamicLibrary) {
+          if (picStaticLibraryToLink != null) {
+            libraryToLinkToUse = picStaticLibraryToLink;
+          } else if (staticLibraryToLink != null) {
+            libraryToLinkToUse = staticLibraryToLink;
+          }
+        } else {
+          if (staticLibraryToLink != null) {
+            libraryToLinkToUse = staticLibraryToLink;
+          } else if (picStaticLibraryToLink != null) {
+            libraryToLinkToUse = picStaticLibraryToLink;
+          }
+        }
+        if (libraryToLinkToUse == null) {
+          if (libraryToLink.getInterfaceLibrary() != null) {
+            libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
+          } else if (libraryToLink.getDynamicLibrary() != null) {
+            libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
+          }
+        }
+      } else {
+        if (libraryToLink.getInterfaceLibrary() != null) {
+          libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
+        } else if (libraryToLink.getDynamicLibrary() != null) {
+          libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
+        }
+        if (libraryToLinkToUse == null) {
+          if (forDynamicLibrary) {
+            if (picStaticLibraryToLink != null) {
+              libraryToLinkToUse = picStaticLibraryToLink;
+            } else if (staticLibraryToLink != null) {
+              libraryToLinkToUse = staticLibraryToLink;
+            }
+          } else {
+            if (staticLibraryToLink != null) {
+              libraryToLinkToUse = staticLibraryToLink;
+            } else if (picStaticLibraryToLink != null) {
+              libraryToLinkToUse = picStaticLibraryToLink;
+            }
+          }
+        }
+      }
+      Preconditions.checkNotNull(libraryToLinkToUse);
+      librariesToLinkBuilder.add(libraryToLinkToUse);
+    }
+    return librariesToLinkBuilder.build();
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
index fba355e..5811cd9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
@@ -29,16 +29,13 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.rules.cpp.LinkerInputs.SolibLibraryToLink;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcLinkingContextApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.LibraryToLinkApi;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.util.Fingerprint;
-import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
-import java.util.ListIterator;
 import javax.annotation.Nullable;
 
 /**
@@ -52,67 +49,6 @@
 @AutoValue
 public abstract class LibraryToLink implements LibraryToLinkApi<Artifact> {
 
-  public static List<LinkerInputs.LibraryToLink> convertLibraryToLinkListToLibraryToLinkList(
-      NestedSet<LibraryToLink> librariesToLink, boolean staticMode, boolean forDynamicLibrary) {
-    ImmutableList.Builder<LinkerInputs.LibraryToLink> librariesToLinkBuilder =
-        ImmutableList.builder();
-    for (LibraryToLink libraryToLink : librariesToLink) {
-      LinkerInputs.LibraryToLink staticLibraryToLink =
-          libraryToLink.getStaticLibrary() == null ? null : libraryToLink.getStaticLibraryToLink();
-      LinkerInputs.LibraryToLink picStaticLibraryToLink =
-          libraryToLink.getPicStaticLibrary() == null
-              ? null
-              : libraryToLink.getPicStaticLibraryToLink();
-      LinkerInputs.LibraryToLink libraryToLinkToUse = null;
-      if (staticMode) {
-        if (forDynamicLibrary) {
-          if (picStaticLibraryToLink != null) {
-            libraryToLinkToUse = picStaticLibraryToLink;
-          } else if (staticLibraryToLink != null) {
-            libraryToLinkToUse = staticLibraryToLink;
-          }
-        } else {
-          if (staticLibraryToLink != null) {
-            libraryToLinkToUse = staticLibraryToLink;
-          } else if (picStaticLibraryToLink != null) {
-            libraryToLinkToUse = picStaticLibraryToLink;
-          }
-        }
-        if (libraryToLinkToUse == null) {
-          if (libraryToLink.getInterfaceLibrary() != null) {
-            libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
-          } else if (libraryToLink.getDynamicLibrary() != null) {
-            libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
-          }
-        }
-      } else {
-        if (libraryToLink.getInterfaceLibrary() != null) {
-          libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
-        } else if (libraryToLink.getDynamicLibrary() != null) {
-          libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
-        }
-        if (libraryToLinkToUse == null) {
-          if (forDynamicLibrary) {
-            if (picStaticLibraryToLink != null) {
-              libraryToLinkToUse = picStaticLibraryToLink;
-            } else if (staticLibraryToLink != null) {
-              libraryToLinkToUse = staticLibraryToLink;
-            }
-          } else {
-            if (staticLibraryToLink != null) {
-              libraryToLinkToUse = staticLibraryToLink;
-            } else if (picStaticLibraryToLink != null) {
-              libraryToLinkToUse = picStaticLibraryToLink;
-            }
-          }
-        }
-      }
-      Preconditions.checkNotNull(libraryToLinkToUse);
-      librariesToLinkBuilder.add(libraryToLinkToUse);
-    }
-    return librariesToLinkBuilder.build();
-  }
-
   public Artifact getDynamicLibraryForRuntimeOrNull(boolean linkingStatically) {
     if (getDynamicLibrary() == null) {
       return null;
@@ -522,100 +458,6 @@
     return new AutoValue_LibraryToLink.Builder().setMustKeepDebug(false).setAlwayslink(false);
   }
 
-  @Nullable
-  @SuppressWarnings("ReferenceEquality")
-  static String setDynamicArtifactsAndReturnIdentifier(
-      LibraryToLink.Builder libraryToLinkBuilder,
-      LinkerInputs.LibraryToLink dynamicModeParamsForExecutableEntry,
-      LinkerInputs.LibraryToLink dynamicModeParamsForDynamicLibraryEntry,
-      ListIterator<Artifact> runtimeLibraryIterator) {
-    Preconditions.checkNotNull(runtimeLibraryIterator);
-    Artifact artifact = dynamicModeParamsForExecutableEntry.getArtifact();
-    String libraryIdentifier = null;
-    Artifact runtimeArtifact = null;
-    if (dynamicModeParamsForExecutableEntry.getArtifactCategory()
-            == ArtifactCategory.DYNAMIC_LIBRARY
-        || dynamicModeParamsForExecutableEntry.getArtifactCategory()
-            == ArtifactCategory.INTERFACE_LIBRARY) {
-      Preconditions.checkState(
-          dynamicModeParamsForExecutableEntry == dynamicModeParamsForDynamicLibraryEntry);
-      libraryIdentifier = dynamicModeParamsForExecutableEntry.getLibraryIdentifier();
-
-      // Not every library to link has a corresponding runtime artifact, for example this is the
-      // case when it is provided by the system. Here we check if the next runtime artifact has the
-      // same basename as the current library to link, if it is, then we match them together. If
-      // isn't, then we must rewind the iterator since every call to next() advances it.
-      if (runtimeLibraryIterator.hasNext()) {
-        runtimeArtifact = runtimeLibraryIterator.next();
-        if (!doArtifactsHaveSameBasename(artifact, runtimeArtifact)) {
-          runtimeArtifact = null;
-          runtimeLibraryIterator.previous();
-        }
-      }
-    }
-
-    if (dynamicModeParamsForExecutableEntry.getArtifactCategory()
-        == ArtifactCategory.DYNAMIC_LIBRARY) {
-      // The SolibLibraryToLink implementation returns ArtifactCategory.DYNAMIC_LIBRARY even if
-      // the library being symlinked is an interface library. This was probably an oversight that
-      // didn't cause any issues. In any case, here we have to figure out whether the library is
-      // an interface library or not by checking the extension if it's a symlink.
-
-      if (dynamicModeParamsForExecutableEntry instanceof SolibLibraryToLink) {
-        // Note: with the old way of doing C++ linking, we lose the information regarding the
-        // runtime library. If {@code runtimeArtifact} is a symlink we only have the symlink but
-        // not a reference to the artifact it points to. We can infer whether it's a symlink by
-        // looking at whether the interface library is a symlink, however, we can't find out what
-        // it points to. With the new API design, we won't lose this information anymore. This is
-        // the way it has been done until now, but it wasn't a problem because symlinks get
-        // automatically resolved when they are in runfiles.
-        if (ArtifactCategory.INTERFACE_LIBRARY
-            .getAllowedExtensions()
-            .contains("." + artifact.getExtension())) {
-          libraryToLinkBuilder.setInterfaceLibrary(artifact);
-          libraryToLinkBuilder.setResolvedSymlinkInterfaceLibrary(
-              dynamicModeParamsForExecutableEntry.getOriginalLibraryArtifact());
-          if (runtimeArtifact != null) {
-            libraryToLinkBuilder.setDynamicLibrary(runtimeArtifact);
-          }
-        } else {
-          Preconditions.checkState(runtimeArtifact == null || artifact == runtimeArtifact);
-          libraryToLinkBuilder.setDynamicLibrary(artifact);
-          libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
-              dynamicModeParamsForExecutableEntry.getOriginalLibraryArtifact());
-        }
-      } else {
-        libraryToLinkBuilder.setDynamicLibrary(artifact);
-        Preconditions.checkState(runtimeArtifact == null || artifact == runtimeArtifact);
-      }
-    } else if (dynamicModeParamsForExecutableEntry.getArtifactCategory()
-        == ArtifactCategory.INTERFACE_LIBRARY) {
-      Preconditions.checkState(
-          !(dynamicModeParamsForExecutableEntry instanceof SolibLibraryToLink));
-      libraryToLinkBuilder.setInterfaceLibrary(artifact);
-      if (runtimeArtifact != null) {
-        libraryToLinkBuilder.setDynamicLibrary(runtimeArtifact);
-      }
-    }
-    return libraryIdentifier;
-  }
-
-  private static boolean doArtifactsHaveSameBasename(Artifact first, Artifact second) {
-    String nameFirst = removeAllExtensions(first.getRootRelativePath().getPathString());
-    String nameSecond = removeAllExtensions(second.getRootRelativePath().getPathString());
-    return nameFirst.equals(nameSecond);
-  }
-
-  private static String removeAllExtensions(String name) {
-    String previousWithoutExtension = FileSystemUtils.removeExtension(name);
-    String currentWithoutExtension = FileSystemUtils.removeExtension(previousWithoutExtension);
-    while (!previousWithoutExtension.equals(currentWithoutExtension)) {
-      previousWithoutExtension = currentWithoutExtension;
-      currentWithoutExtension = FileSystemUtils.removeExtension(previousWithoutExtension);
-    }
-    return currentWithoutExtension;
-  }
-
   LinkerInputs.LibraryToLink getStaticLibraryToLink() {
     Preconditions.checkNotNull(getStaticLibrary(), this);
     if (staticLibraryToLink != null) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
index 0e532ed..c466bf8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
@@ -781,14 +781,9 @@
     // TODO(cpeyser): Clean up objc-cc interop.
     HashSet<PathFragment> avoidLibrariesSet = new HashSet<>();
     for (CcLinkingContext ccLinkingContext : avoidCcProviders) {
-      List<com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink> librariesToLink =
-          LibraryToLink.convertLibraryToLinkListToLibraryToLinkList(
-              ccLinkingContext.getLibraries(),
-              /* staticMode= */ true,
-              /* forDynamicLibrary= */ false);
-      for (com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink libraryToLink :
-          librariesToLink) {
-        avoidLibrariesSet.add(libraryToLink.getArtifact().getRunfilesPath());
+      List<Artifact> libraries = ccLinkingContext.getStaticModeParamsForExecutableLibraries();
+      for (Artifact library : libraries) {
+        avoidLibrariesSet.add(library.getRunfilesPath());
       }
     }
     for (ObjcProvider avoidProvider : avoidObjcProviders) {