Optimize TransitiveInfoMap memory consumption.

Instead of using ImmutableMap, we share the keys between all provider maps with an identical key set.

PiperOrigin-RevId: 155432135
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java
index 10f5cae..a9079ad 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java
@@ -17,7 +17,6 @@
 import com.google.common.collect.Iterables;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 /**
  * A single dependency with its configured target and aspects merged together.
@@ -90,9 +89,9 @@
     }
 
     for (ConfiguredAspect aspect : aspects) {
-      for (Map.Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> entry :
-          aspect.getProviders().entries()) {
-        Class<? extends TransitiveInfoProvider> providerClass = entry.getKey();
+      TransitiveInfoProviderMap providers = aspect.getProviders();
+      for (int i = 0; i < providers.getProviderCount(); ++i) {
+        Class<? extends TransitiveInfoProvider> providerClass = providers.getProviderClassAt(i);
         if (OutputGroupProvider.class.equals(providerClass)
             || SkylarkProviders.class.equals(providerClass)
             || ExtraActionArtifactsProvider.class.equals(providerClass)) {
@@ -103,7 +102,7 @@
           throw new IllegalStateException("Provider " + providerClass + " provided twice");
         }
 
-        aspectProviders.add(entry.getValue());
+        aspectProviders.add(providers.getProviderAt(i));
       }
     }
     return new MergedConfiguredTarget(base, aspectProviders.build());