Revert "Only visit super types of live library classes"
This reverts commit f2beae6390153d39155196de10abc9f5fac914b1.
Reason for revert: Seems to fail internal bot on third_party/gmscore/gmscore_v10/GmsCore_prod_alldpi_release_all_locales_proguard.jar
Change-Id: I094a44b7193050e951cf92037270f94e52902975
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index ad8d7b9..e521c9c 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -318,8 +318,6 @@
*/
private final Set<ClasspathOrLibraryClass> liveNonProgramTypes = Sets.newIdentityHashSet();
- private final Set<ClasspathOrLibraryClass> referencedNonProgramTypes = Sets.newIdentityHashSet();
-
/** Set of reachable proto types that will be dead code eliminated. */
private final Set<DexProgramClass> deadProtoTypeCandidates = Sets.newIdentityHashSet();
@@ -605,7 +603,7 @@
ignoreMissingClass(type);
} else if (clazz.isNotProgramClass()) {
addLiveNonProgramType(
- clazz.asClasspathOrLibraryClass(), true, this::ignoreMissingClasspathOrLibraryClass);
+ clazz.asClasspathOrLibraryClass(), this::ignoreMissingClasspathOrLibraryClass);
}
}
@@ -700,62 +698,51 @@
private void addLiveNonProgramType(
ClasspathOrLibraryClass clazz,
- // TODO(b/216576191): Remove when tracking live library members.
- boolean visitMembers,
BiConsumer<DexType, ClasspathOrLibraryDefinition> missingClassConsumer) {
WorkList<ClasspathOrLibraryClass> worklist =
WorkList.newIdentityWorkList(clazz, liveNonProgramTypes);
while (worklist.hasNext()) {
ClasspathOrLibraryClass definition = worklist.next();
- processNewLiveNonProgramType(definition, worklist, missingClassConsumer, visitMembers);
+ processNewLiveNonProgramType(definition, worklist, missingClassConsumer);
}
}
private void processNewLiveNonProgramType(
ClasspathOrLibraryClass clazz,
WorkList<ClasspathOrLibraryClass> worklist,
- BiConsumer<DexType, ClasspathOrLibraryDefinition> missingClassConsumer,
- boolean visitMembers) {
- ensureMethodsContinueToWidenAccess(clazz);
+ BiConsumer<DexType, ClasspathOrLibraryDefinition> missingClassConsumer) {
if (clazz.isLibraryClass()) {
+ // TODO(b/149201735): This likely needs to apply to classpath too.
+ ensureMethodsContinueToWidenAccess(clazz);
// Only libraries must not derive program. Classpath classes can, assuming correct keep rules.
warnIfLibraryTypeInheritsFromProgramType(clazz.asLibraryClass());
}
- if (visitMembers) {
- clazz.forEachClassField(
- field ->
- addNonProgramClassToWorklist(
- field.getType(),
- field.asClasspathOrLibraryDefinition(),
- referencedNonProgramTypes::add,
- missingClassConsumer));
- clazz.forEachClassMethod(
- method -> {
- ClasspathOrLibraryDefinition derivedContext = method.asClasspathOrLibraryDefinition();
+ clazz.forEachClassField(
+ field ->
addNonProgramClassToWorklist(
- method.getReturnType(),
- derivedContext,
- referencedNonProgramTypes::add,
- missingClassConsumer);
- for (DexType parameter : method.getParameters()) {
- addNonProgramClassToWorklist(
- parameter, derivedContext, referencedNonProgramTypes::add, missingClassConsumer);
- }
- });
- }
+ field.getType(),
+ field.asClasspathOrLibraryDefinition(),
+ worklist,
+ missingClassConsumer));
+ clazz.forEachClassMethod(
+ method -> {
+ ClasspathOrLibraryDefinition derivedContext = method.asClasspathOrLibraryDefinition();
+ addNonProgramClassToWorklist(
+ method.getReturnType(), derivedContext, worklist, missingClassConsumer);
+ for (DexType parameter : method.getParameters()) {
+ addNonProgramClassToWorklist(parameter, derivedContext, worklist, missingClassConsumer);
+ }
+ });
for (DexType supertype : clazz.allImmediateSupertypes()) {
addNonProgramClassToWorklist(
- supertype,
- clazz.asClasspathOrLibraryDefinition(),
- worklist::addIfNotSeen,
- missingClassConsumer);
+ supertype, clazz.asClasspathOrLibraryDefinition(), worklist, missingClassConsumer);
}
}
private void addNonProgramClassToWorklist(
DexType type,
ClasspathOrLibraryDefinition context,
- Consumer<ClasspathOrLibraryClass> classAdder,
+ WorkList<ClasspathOrLibraryClass> worklist,
BiConsumer<DexType, ClasspathOrLibraryDefinition> missingClassConsumer) {
if (type.isArrayType()) {
type = type.toBaseType(appView.dexItemFactory());
@@ -767,7 +754,7 @@
if (clazz == null) {
missingClassConsumer.accept(type, context);
} else if (!clazz.isProgramClass()) {
- classAdder.accept(clazz.asClasspathOrLibraryClass());
+ worklist.addIfNotSeen(clazz.asClasspathOrLibraryClass());
}
}
@@ -2366,7 +2353,6 @@
if (!clazz.isProgramClass()) {
addLiveNonProgramType(
clazz.asClasspathOrLibraryClass(),
- true,
(missingType, derivedContext) ->
reportMissingClass(missingType, derivedContext.asProgramDerivedContext(context)));
}
@@ -3775,9 +3761,6 @@
// Rebuild a new app only containing referenced types.
Set<DexLibraryClass> libraryClasses = Sets.newIdentityHashSet();
Set<DexClasspathClass> classpathClasses = Sets.newIdentityHashSet();
- // Ensure all referenced non program types have their hierarchy built as live.
- referencedNonProgramTypes.forEach(
- clazz -> addLiveNonProgramType(clazz, false, this::ignoreMissingClasspathOrLibraryClass));
for (ClasspathOrLibraryClass clazz : liveNonProgramTypes) {
if (clazz.isLibraryClass()) {
libraryClasses.add(clazz.asLibraryClass());
@@ -3938,16 +3921,14 @@
}
assert clazz.isProgramClass() || liveNonProgramTypes.contains(clazz)
: "Expected type to be in live non-program types: " + clazz;
- if (clazz.isProgramClass()) {
- for (DexEncodedField field : clazz.fields()) {
- if (isFieldReferenced(field)) {
- assert verifyReferencedType(field.getReference().type, worklist, app);
- }
+ for (DexEncodedField field : clazz.fields()) {
+ if (clazz.isNotProgramClass() || isFieldReferenced(field)) {
+ assert verifyReferencedType(field.getReference().type, worklist, app);
}
- for (DexEncodedMethod method : clazz.methods()) {
- if (isMethodTargeted(method)) {
- assert verifyReferencedMethod(method, worklist, app);
- }
+ }
+ for (DexEncodedMethod method : clazz.methods()) {
+ if (clazz.isNotProgramClass() || isMethodTargeted(method)) {
+ assert verifyReferencedMethod(method, worklist, app);
}
}
return true;