Do not compute global synthetics for all tests
Fixes: b/306104021
Change-Id: I88713bfde91898217235e4928b3d21f547672ba3
diff --git a/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java b/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
index fc2188f..41f4db1 100644
--- a/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
+++ b/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
@@ -127,6 +127,8 @@
createGlobalSynthetics(appView, timing, executorService);
timing.end();
+ assert GlobalSyntheticsGeneratorVerifier.verifyExpectedClassesArePresent(appView);
+
ApplicationWriter.create(appView, options.getMarker()).write(executorService, app);
} catch (ExecutionException e) {
throw unwrapExecutionException(e);
diff --git a/src/main/java/com/android/tools/r8/GlobalSyntheticsGeneratorVerifier.java b/src/main/java/com/android/tools/r8/GlobalSyntheticsGeneratorVerifier.java
new file mode 100644
index 0000000..c0197ae
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/GlobalSyntheticsGeneratorVerifier.java
@@ -0,0 +1,30 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexType;
+import java.util.function.Consumer;
+
+public class GlobalSyntheticsGeneratorVerifier {
+
+ public static void forEachExpectedClass(
+ DexItemFactory dexItemFactory, int minApi, Consumer<DexType> consumer) {
+ consumer.accept(dexItemFactory.methodHandlesType);
+ consumer.accept(dexItemFactory.methodHandlesLookupType);
+ consumer.accept(dexItemFactory.recordType);
+ consumer.accept(dexItemFactory.varHandleType);
+ }
+
+ public static boolean verifyExpectedClassesArePresent(AppView<?> appView) {
+ forEachExpectedClass(
+ appView.dexItemFactory(),
+ appView.options().getMinApiLevel().getLevel(),
+ type -> {
+ assert appView.hasDefinitionFor(type);
+ });
+ return true;
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
index 3e17faf..7db5069 100644
--- a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -27,6 +27,7 @@
import com.android.tools.r8.utils.codeinspector.HorizontallyMergedClassesInspector;
import com.android.tools.r8.utils.codeinspector.VerticallyMergedClassesInspector;
import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableSet;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
@@ -93,7 +94,9 @@
private Optional<Integer> isAndroidBuildVersionAdded = null;
- private static final Map<Integer, Set<String>> allowedGlobalSynthetics =
+ private static final Map<Integer, Set<String>> allGlobalSynthetics = new ConcurrentHashMap<>();
+
+ private static final Map<Integer, Set<String>> definiteGlobalSynthetics =
new ConcurrentHashMap<>();
LibraryDesugaringTestConfiguration libraryDesugaringTestConfiguration =
@@ -270,17 +273,22 @@
&& (isD8TestBuilder() || isR8TestBuilder())
&& !isBenchmarkRunner) {
int minApiLevel = builder.getMinApiLevel();
- allowedGlobalSynthetics.computeIfAbsent(
- minApiLevel, TestCompilerBuilder::computeAllGlobalSynthetics);
Consumer<InternalOptions> previousConsumer = optionsConsumer;
optionsConsumer =
options -> {
options.testing.globalSyntheticCreatedCallback =
programClass -> {
- assertTrue(
- allowedGlobalSynthetics
- .get(minApiLevel)
- .contains(programClass.getType().toDescriptorString()));
+ String descriptor = programClass.getType().toDescriptorString();
+ boolean isGlobalSynthetic =
+ definiteGlobalSynthetics
+ .computeIfAbsent(
+ minApiLevel, computeDefiniteGlobalSynthetics(options))
+ .contains(descriptor)
+ || allGlobalSynthetics
+ .computeIfAbsent(
+ minApiLevel, TestCompilerBuilder::computeAllGlobalSynthetics)
+ .contains(descriptor);
+ assertTrue(isGlobalSynthetic);
};
if (previousConsumer != null) {
previousConsumer.accept(options);
@@ -604,6 +612,16 @@
}
}
+ private static Function<Integer, Set<String>> computeDefiniteGlobalSynthetics(
+ InternalOptions options) {
+ return minApiLevel -> {
+ ImmutableSet.Builder<String> builder = ImmutableSet.builder();
+ GlobalSyntheticsGeneratorVerifier.forEachExpectedClass(
+ options.dexItemFactory(), minApiLevel, type -> builder.add(type.toDescriptorString()));
+ return builder.build();
+ };
+ }
+
private static class ChainedStringConsumer implements StringConsumer {
private final List<StringConsumer> consumers;