Don't compute sharing of synthetics in intermediate builds.
Bug: 169095082
Bug: 169183194
Change-Id: I9b3f8b8be2bcd148ed80faf73f1327fdd58162e4
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
index 31a4afd..9dd8bee 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
@@ -16,6 +16,7 @@
import com.android.tools.r8.shaking.MainDexClasses;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.ListUtils;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -96,8 +97,11 @@
List<SyntheticMethodDefinition> methodDefinitions =
lookupSyntheticMethodDefinitions(application);
- Map<HashCode, List<SyntheticMethodDefinition>> potentialEquivalences =
- computePotentialEquivalences(methodDefinitions);
+ Collection<List<SyntheticMethodDefinition>> potentialEquivalences =
+ // Don't share synthetics in intermediate mode builds.
+ options.intermediate
+ ? ListUtils.map(methodDefinitions, Collections::singletonList)
+ : computePotentialEquivalences(methodDefinitions);
Map<DexType, EquivalenceGroup<SyntheticMethodDefinition>> equivalences =
computeActualEquivalences(potentialEquivalences, options.itemFactory);
@@ -328,10 +332,10 @@
private static <T extends SyntheticDefinition & Comparable<T>>
Map<DexType, EquivalenceGroup<T>> computeActualEquivalences(
- Map<HashCode, List<T>> potentialEquivalences, DexItemFactory factory) {
+ Collection<List<T>> potentialEquivalences, DexItemFactory factory) {
Map<DexType, List<EquivalenceGroup<T>>> groupsPerContext = new IdentityHashMap<>();
potentialEquivalences.forEach(
- (hash, members) -> {
+ members -> {
// Get a representative member and add to its group.
T representative = findDeterministicRepresentative(members);
List<T> group = new ArrayList<>(members.size());
@@ -391,14 +395,14 @@
+ nextContextId));
}
- private static <T extends SyntheticDefinition>
- Map<HashCode, List<T>> computePotentialEquivalences(List<T> definitions) {
+ private static <T extends SyntheticDefinition> Collection<List<T>> computePotentialEquivalences(
+ List<T> definitions) {
Map<HashCode, List<T>> equivalences = new HashMap<>(definitions.size());
for (T definition : definitions) {
HashCode hash = definition.computeHash();
equivalences.computeIfAbsent(hash, k -> new ArrayList<>()).add(definition);
}
- return equivalences;
+ return equivalences.values();
}
private List<SyntheticMethodDefinition> lookupSyntheticMethodDefinitions(
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java b/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
index c805af6..d4346cc 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
@@ -7,9 +7,7 @@
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
@@ -158,10 +156,9 @@
});
}
- @Test(expected = CompilationFailedException.class)
+ @Test
public void testD8FilePerClassFile() throws Exception {
runD8FilePerMode(OutputMode.DexFilePerClassFile);
- fail("b/169095082");
}
@Test
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/BackportMainDexTest.java b/src/test/java/com/android/tools/r8/desugar/backports/BackportMainDexTest.java
index 4db43fe..4a2e645 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/BackportMainDexTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/BackportMainDexTest.java
@@ -9,11 +9,9 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.ByteDataView;
-import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.DexIndexedConsumer;
import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.GenerateMainDexListRunResult;
@@ -122,9 +120,6 @@
Path out =
testForD8()
.addProgramClasses(CLASSES)
- // Setting intermediate will annotate synthetics, which should not cause types in those
- // to become main-dex included.
- .setIntermediate(true)
.setMinApi(parameters.getApiLevel())
.compile()
.writeToZip();
@@ -139,6 +134,24 @@
}
@Test
+ public void testMainDexTracingDexIntermediates() throws Exception {
+ assumeTrue(parameters.isDexRuntime());
+ Path out =
+ testForD8()
+ .addProgramClasses(CLASSES)
+ // Setting intermediate will annotate synthetics, which should not cause types in those
+ // to become main-dex included.
+ .setIntermediate(true)
+ .setMinApi(parameters.getApiLevel())
+ .compile()
+ .writeToZip();
+ GenerateMainDexListRunResult mainDexListFromDex =
+ traceMainDex(Collections.emptyList(), Collections.singleton(out));
+ // Compiling in intermediate will not share the synthetics so there is one per call site.
+ assertEquals(MAIN_DEX_LIST_CLASSES.size() + 6, mainDexListFromDex.getMainDexList().size());
+ }
+
+ @Test
public void testD8() throws Exception {
assumeTrue(parameters.isDexRuntime());
MainDexConsumer mainDexConsumer = new MainDexConsumer();
@@ -154,10 +167,9 @@
checkMainDex(mainDexConsumer);
}
- @Test(expected = CompilationFailedException.class)
+ @Test
public void testD8FilePerClassFile() throws Exception {
runD8FilePerMode(OutputMode.DexFilePerClassFile);
- fail("b/169095082");
}
@Test