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/TransitiveInfoProviderMapBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java
index ac68e3b..06a7726 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java
@@ -55,7 +55,10 @@
}
public TransitiveInfoProviderMapBuilder addAll(TransitiveInfoProviderMap providers) {
- return addAll(providers.values());
+ for (int i = 0; i < providers.getProviderCount(); ++i) {
+ add(providers.getProviderAt(i));
+ }
+ return this;
}
public TransitiveInfoProviderMapBuilder addAll(Iterable<TransitiveInfoProvider> providers) {
@@ -71,6 +74,6 @@
}
public TransitiveInfoProviderMap build() {
- return new TransitiveInfoProviderMapImmutableMapBased(ImmutableMap.copyOf(providers));
+ return new TransitiveInfoProviderMapOffsetBased(ImmutableMap.copyOf(providers));
}
}