Mark classpath and library virtual method overrides as reachable
Change-Id: I5b8f15fe6124e18170ae82b7d9179a8a1763ff5e
diff --git a/src/main/java/com/android/tools/r8/graph/ClassHierarchyTraversal.java b/src/main/java/com/android/tools/r8/graph/ClassHierarchyTraversal.java
index 2988016..550a96c 100644
--- a/src/main/java/com/android/tools/r8/graph/ClassHierarchyTraversal.java
+++ b/src/main/java/com/android/tools/r8/graph/ClassHierarchyTraversal.java
@@ -18,6 +18,7 @@
enum Scope {
ALL_CLASSES,
ONLY_LIBRARY_CLASSES,
+ ONLY_LIBRARY_AND_CLASSPATH_CLASSES,
ONLY_PROGRAM_CLASSES;
public boolean shouldBePassedToVisitor(DexClass clazz) {
@@ -28,6 +29,9 @@
case ONLY_LIBRARY_CLASSES:
return clazz.isLibraryClass();
+ case ONLY_LIBRARY_AND_CLASSPATH_CLASSES:
+ return clazz.isLibraryClass() || clazz.isClasspathClass();
+
case ONLY_PROGRAM_CLASSES:
return clazz.isProgramClass();
diff --git a/src/main/java/com/android/tools/r8/graph/TopDownClassHierarchyTraversal.java b/src/main/java/com/android/tools/r8/graph/TopDownClassHierarchyTraversal.java
index 79029b9..72e07e1 100644
--- a/src/main/java/com/android/tools/r8/graph/TopDownClassHierarchyTraversal.java
+++ b/src/main/java/com/android/tools/r8/graph/TopDownClassHierarchyTraversal.java
@@ -24,7 +24,7 @@
}
/**
- * Returns a visitor that can be used to visit all the program classes that are reachable from a
+ * Returns a visitor that can be used to visit all the library classes that are reachable from a
* given set of sources.
*/
public static TopDownClassHierarchyTraversal<DexLibraryClass> forLibraryClasses(
@@ -33,6 +33,15 @@
}
/**
+ * Returns a visitor that can be used to visit all the library and classpath classes that are
+ * reachable from a given set of sources.
+ */
+ public static TopDownClassHierarchyTraversal<DexClass> forLibraryAndClasspathClasses(
+ AppView<? extends AppInfoWithSubtyping> appView) {
+ return new TopDownClassHierarchyTraversal<>(appView, Scope.ONLY_LIBRARY_AND_CLASSPATH_CLASSES);
+ }
+
+ /**
* Returns a visitor that can be used to visit all the program classes that are reachable from a
* given set of sources.
*/
@@ -86,8 +95,8 @@
switch (scope) {
case ALL_CLASSES:
case ONLY_LIBRARY_CLASSES:
+ case ONLY_LIBRARY_AND_CLASSPATH_CLASSES:
return true;
-
case ONLY_PROGRAM_CLASSES:
return clazz.isProgramClass();
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 093adaa..9a297b2 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -36,7 +36,6 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItem;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexLibraryClass;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexMethodHandle;
import com.android.tools.r8.graph.DexProgramClass;
@@ -1727,9 +1726,10 @@
this.dontWarnPatterns = dontWarnPatterns;
// Translate the result of root-set computation into enqueuer actions.
enqueueRootItems(rootSet.noShrinking);
- TopDownClassHierarchyTraversal.forLibraryClasses(appView)
+ TopDownClassHierarchyTraversal.forLibraryAndClasspathClasses(appView)
// TODO(b/131813793): Would be beneficial to have `appView.appInfo().rootClasses()`.
- .visit(appView.appInfo().classes(), this::markAllLibraryVirtualMethodsReachable);
+ .visit(
+ appView.appInfo().classes(), this::markAllLibraryAndClasspathVirtualMethodsReachable);
trace(executorService, timing);
options.reporter.failIfPendingErrors();
analyses.forEach(EnqueuerAnalysis::done);
@@ -1980,7 +1980,7 @@
}
}
- private void markAllLibraryVirtualMethodsReachable(DexLibraryClass clazz) {
+ private void markAllLibraryAndClasspathVirtualMethodsReachable(DexClass clazz) {
if (Log.ENABLED) {
Log.verbose(
getClass(), "Marking all methods of library class `%s` as reachable.", clazz.type);