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());