Rewrite all R8 uses of libraryTypesAssumedToBePresent
Change-Id: I39d198ba2b66a2b82b11f5a1fbdd64f79091fc59
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
index e750ab3..7ac70e7 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
@@ -140,12 +140,7 @@
// Check if the type is guaranteed to be present.
DexClass clazz = appView.definitionFor(baseType);
- if (clazz == null) {
- return true;
- }
-
- if (clazz.isLibraryClass()
- && !appView.dexItemFactory().libraryTypesAssumedToBePresent.contains(baseType)) {
+ if (clazz == null || !clazz.isResolvable(appView)) {
return true;
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
index 9bc1728..5a3a1118 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
@@ -183,16 +183,10 @@
// Check if the type is guaranteed to be present.
DexClass clazz = appView.definitionFor(baseType);
- if (clazz == null) {
+ if (clazz == null || !clazz.isResolvable(appView)) {
return true;
}
- if (clazz.isLibraryClass()) {
- if (!appView.dexItemFactory().libraryTypesAssumedToBePresent.contains(baseType)) {
- return true;
- }
- }
-
// Check if the type is guaranteed to be accessible.
if (AccessControl.isClassAccessible(clazz, context, appViewWithClassHierarchy)
.isPossiblyFalse()) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
index d6c938d..236bd0a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
@@ -170,12 +170,7 @@
}
DexClass definition = appView.definitionFor(clazz);
- if (definition == null || definition.accessFlags.isAbstract()) {
- return true;
- }
-
- if (definition.isLibraryClass()
- && !dexItemFactory.libraryTypesAssumedToBePresent.contains(clazz)) {
+ if (definition == null || definition.isAbstract() || !definition.isResolvable(appView)) {
return true;
}
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java b/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java
index da8353b..2c3b88b 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java
@@ -114,7 +114,9 @@
LibraryDefinition definition,
AndroidApiLevelCompute androidApiLevelCompute,
InternalOptions options) {
- assert options.apiModelingOptions().enableApiCallerIdentification;
+ if (!options.apiModelingOptions().enableApiCallerIdentification) {
+ return false;
+ }
ComputedApiLevel apiLevel =
androidApiLevelCompute.computeApiLevelForLibraryReference(
definition.getReference(), ComputedApiLevel.unknown());
diff --git a/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
index 6df7b0a..5a16cf6 100644
--- a/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
@@ -10,6 +10,7 @@
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import com.android.tools.r8.R8;
import com.android.tools.r8.R8FullTestBuilder;
@@ -232,7 +233,7 @@
.apply(this::suppressZipFileAssignmentsToJavaLangAutoCloseable)
.compile()
.graphInspector();
- assertRetainedClassesEqual(referenceInspector, ifThenKeepClassMembersInspector);
+ assertRetainedClassesEqual(referenceInspector, ifThenKeepClassMembersInspector, true);
GraphInspector ifThenKeepClassesWithMembersInspector =
testForR8(Backend.CF)
@@ -251,7 +252,7 @@
.apply(this::suppressZipFileAssignmentsToJavaLangAutoCloseable)
.compile()
.graphInspector();
- assertRetainedClassesEqual(referenceInspector, ifThenKeepClassesWithMembersInspector);
+ assertRetainedClassesEqual(referenceInspector, ifThenKeepClassesWithMembersInspector, true);
GraphInspector ifHasMemberThenKeepClassInspector =
testForR8(Backend.CF)
@@ -272,7 +273,7 @@
.apply(this::suppressZipFileAssignmentsToJavaLangAutoCloseable)
.compile()
.graphInspector();
- assertRetainedClassesEqual(referenceInspector, ifHasMemberThenKeepClassInspector);
+ assertRetainedClassesEqual(referenceInspector, ifHasMemberThenKeepClassInspector, true);
}
private void configureHorizontalClassMerging(R8FullTestBuilder testBuilder) {
@@ -292,6 +293,13 @@
private void assertRetainedClassesEqual(
GraphInspector referenceResult, GraphInspector conditionalResult) {
+ assertRetainedClassesEqual(referenceResult, conditionalResult, false);
+ }
+
+ private void assertRetainedClassesEqual(
+ GraphInspector referenceResult,
+ GraphInspector conditionalResult,
+ boolean expectConditionalIsLarger) {
Set<String> referenceClasses =
new TreeSet<>(
referenceResult.codeInspector().allClasses().stream()
@@ -303,10 +311,14 @@
.collect(Collectors.toSet());
Set<String> notInReference =
new TreeSet<>(Sets.difference(conditionalClasses, referenceClasses));
- assertEquals(
- "Classes in -if rule that are not in -keepclassmembers rule",
- Collections.emptySet(),
- notInReference);
+ if (expectConditionalIsLarger) {
+ assertFalse("Expected classes in -if rule to retain more.", notInReference.isEmpty());
+ } else {
+ assertEquals(
+ "Classes in -if rule that are not in -keepclassmembers rule",
+ Collections.emptySet(),
+ notInReference);
+ }
Set<String> notInConditional =
new TreeSet<>(Sets.difference(referenceClasses, conditionalClasses));
assertEquals(
diff --git a/src/test/java/com/android/tools/r8/smali/OutlineTest.java b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
index 56435ed..da3ef50 100644
--- a/src/test/java/com/android/tools/r8/smali/OutlineTest.java
+++ b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
@@ -46,7 +46,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
-import java.util.HashSet;
import java.util.List;
import java.util.function.Consumer;
import org.junit.Assert;
@@ -1384,14 +1383,8 @@
opts.outline.minSize = 3;
opts.outline.maxSize = 3;
- // Do not allow dead code elimination of the new-instance instructions. This can be
- // achieved
- // by not assuming that StringBuilder is present.
- DexItemFactory dexItemFactory = opts.itemFactory;
- opts.itemFactory.libraryTypesAssumedToBePresent =
- new HashSet<>(dexItemFactory.libraryTypesAssumedToBePresent);
- dexItemFactory.libraryTypesAssumedToBePresent.remove(
- dexItemFactory.stringBuilderType);
+ // Do not allow dead code elimination of the new-instance instructions.
+ opts.apiModelingOptions().enableApiCallerIdentification = false;
});
AndroidApp originalApplication = buildApplicationWithAndroidJar(builder);