Reland "Clear generic signatures for horizontally merged targets"
This also relands "Add enableTestAssertions to compiledump when running with assertions"
This reverts commit 10667af56ee2e77dea0732b043063248ac1bdb87.
Bug: 191349005
Bug: 191327911
Change-Id: Id8c79257b6d32f1bcba66911fbc79806f7a8b791
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index ceef6c2..2143c36 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -812,16 +812,6 @@
options.syntheticProguardRulesConsumer.accept(synthesizedProguardRules);
}
- assert appView.checkForTesting(
- () ->
- !options.isShrinking()
- || GenericSignatureCorrectnessHelper.createForVerification(
- appView,
- GenericSignatureContextBuilder.create(appView.appInfo().classes()))
- .run(appView.appInfo().classes())
- .isValid())
- : "Could not validate generic signatures";
-
NamingLens prefixRewritingNamingLens =
PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView, namingLens);
@@ -832,6 +822,16 @@
new GenericSignatureRewriter(appView, prefixRewritingNamingLens)
.run(appView.appInfo().classes(), executorService);
+ assert appView.checkForTesting(
+ () ->
+ !options.isShrinking()
+ || GenericSignatureCorrectnessHelper.createForVerification(
+ appView,
+ GenericSignatureContextBuilder.create(appView.appInfo().classes()))
+ .run(appView.appInfo().classes())
+ .isValid())
+ : "Could not validate generic signatures";
+
new DesugaredLibraryKeepRuleGenerator(appView, prefixRewritingNamingLens)
.runIfNecessary(timing);
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java
index d3a67a2..a965c76 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java
@@ -268,7 +268,7 @@
}
}
- public boolean hasGenericTypeVariables(
+ public static boolean hasGenericTypeVariables(
AppView<?> appView, DexType type, Predicate<DexType> wasPruned) {
if (wasPruned.test(type)) {
return false;
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
index 332aa8d..27f26b9 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
@@ -29,26 +29,31 @@
private final DexProgramClass context;
private final ClassTypeSignature objectTypeSignature;
+ private final Predicate<DexType> hasGenericTypeVariables;
- public GenericSignatureTypeRewriter(AppView<?> appView, DexProgramClass context) {
+ public GenericSignatureTypeRewriter(
+ AppView<?> appView, DexProgramClass context, Predicate<DexType> hasGenericTypeVariables) {
this(
appView.dexItemFactory(),
appView.appInfo().hasLiveness()
? appView.appInfo().withLiveness()::wasPruned
: alwaysFalse(),
appView.graphLens()::lookupType,
- context);
+ context,
+ hasGenericTypeVariables);
}
public GenericSignatureTypeRewriter(
DexItemFactory factory,
Predicate<DexType> wasPruned,
Function<DexType, DexType> lookupType,
- DexProgramClass context) {
+ DexProgramClass context,
+ Predicate<DexType> hasGenericTypeVariables) {
this.factory = factory;
this.wasPruned = wasPruned;
this.lookupType = lookupType;
this.context = context;
+ this.hasGenericTypeVariables = hasGenericTypeVariables;
objectTypeSignature = new ClassTypeSignature(factory.objectType, getEmptyTypeArguments());
}
@@ -138,10 +143,11 @@
@Override
public ClassTypeSignature visitSuperClass(ClassTypeSignature classTypeSignature) {
+ if (context.superType == factory.objectType) {
+ return objectTypeSignature;
+ }
ClassTypeSignature rewritten = classTypeSignature.visit(this);
- return rewritten == null || rewritten.type() == context.type
- ? objectTypeSignature
- : rewritten;
+ return rewritten == null ? objectTypeSignature : rewritten;
}
@Override
@@ -243,6 +249,9 @@
if (typeArguments.isEmpty()) {
return typeArguments;
}
+ if (!hasGenericTypeVariables.test(type)) {
+ return getEmptyTypeArguments();
+ }
return ListUtils.mapOrElse(
typeArguments,
fieldTypeSignature -> {
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
index fc4e3e9..f833fed 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
@@ -24,6 +24,7 @@
import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.ParameterAnnotationsList;
+import com.android.tools.r8.graph.ProgramMember;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
import com.android.tools.r8.horizontalclassmerging.code.ClassInitializerMerger;
@@ -325,6 +326,8 @@
mergeInterfaces();
mergeFields();
mergeMethods(syntheticArgumentClass, syntheticInitializerConverterBuilder);
+ group.getTarget().clearClassSignature();
+ group.getTarget().forEachProgramMember(ProgramMember::clearGenericSignature);
}
public static class Builder {
diff --git a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
index 16b6508..99067fe 100644
--- a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
+++ b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
@@ -50,11 +50,11 @@
// ClassNameMinifier.
Predicate<DexType> wasPruned =
appView.hasLiveness() ? appView.withLiveness().appInfo()::wasPruned : alwaysFalse();
+ Predicate<DexType> hasGenericTypeVariables =
+ type -> GenericSignatureContextBuilder.hasGenericTypeVariables(appView, type, wasPruned);
BiPredicate<DexType, DexType> hasPrunedRelationship =
(enclosing, enclosed) ->
contextBuilder.hasPrunedRelationship(appView, enclosing, enclosed, wasPruned);
- Predicate<DexType> hasGenericTypeVariables =
- type -> contextBuilder.hasGenericTypeVariables(appView, type, wasPruned);
ThreadUtils.processItems(
classes,
clazz -> {
@@ -68,7 +68,7 @@
hasGenericTypeVariables)
: null;
GenericSignatureTypeRewriter genericSignatureTypeRewriter =
- new GenericSignatureTypeRewriter(appView, clazz);
+ new GenericSignatureTypeRewriter(appView, clazz, hasGenericTypeVariables);
clazz.setClassSignature(
genericSignatureTypeRewriter.rewrite(
classArgumentApplier != null
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java
index 75306f7..dd835a2 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java
@@ -6,6 +6,7 @@
import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
import static com.google.common.base.Predicates.alwaysFalse;
+import static com.google.common.base.Predicates.alwaysTrue;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -179,7 +180,8 @@
factory,
dexType -> dexType.toDescriptorString().equals("Lj$/util/Spliterator$OfPrimitive;"),
Function.identity(),
- null);
+ null,
+ alwaysTrue());
MethodTypeSignature rewritten = rewriter.rewrite(parsedMethodSignature);
assertNotNull(rewritten);
assertTrue(rewritten.hasSignature());
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/FieldSignatureTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/FieldSignatureTest.java
index c17ea6b..aafeadf 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/FieldSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/FieldSignatureTest.java
@@ -122,7 +122,8 @@
"A", "Lfoo/bar/Baz;", Origin.unknown(), factory, new Reporter());
assertTrue(parsed.hasSignature());
GenericSignatureTypeRewriter rewriter =
- new GenericSignatureTypeRewriter(factory, alwaysTrue(), Function.identity(), null);
+ new GenericSignatureTypeRewriter(
+ factory, alwaysTrue(), Function.identity(), null, alwaysTrue());
FieldTypeSignature rewrittenType = rewriter.rewrite(parsed);
assertNotNull(rewrittenType);
assertTrue(rewrittenType.hasNoSignature());
diff --git a/tools/compiledump.py b/tools/compiledump.py
index 46b09b8..83bc2aa 100755
--- a/tools/compiledump.py
+++ b/tools/compiledump.py
@@ -300,6 +300,7 @@
cmd.append('-Xmx' + args.xmx)
if args.ea:
cmd.append('-ea')
+ cmd.append('-Dcom.android.tools.r8.enableTestAssertions=1')
if args.print_times:
cmd.append('-Dcom.android.tools.r8.printtimes=1')
if hasattr(args, 'properties'):