Don't inline catch handlers with an unkonwn API level
Bug: b/342961827
Change-Id: I471ef3dea9bd975af41db884b07530ec462aa968
diff --git a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
index 4a2dc9a..f663fd4 100644
--- a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
+++ b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
@@ -182,10 +182,6 @@
}
}
- public static boolean isAlwaysStubbedType(DexType type, DexItemFactory factory) {
- return !isNeverStubbedType(type, factory);
- }
-
public static boolean isNeverStubbedType(DexType type, DexItemFactory factory) {
return isJavaType(type, factory);
}
diff --git a/src/main/java/com/android/tools/r8/shaking/ComputeApiLevelUseRegistry.java b/src/main/java/com/android/tools/r8/shaking/ComputeApiLevelUseRegistry.java
index 76c8ee5..b996483 100644
--- a/src/main/java/com/android/tools/r8/shaking/ComputeApiLevelUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/shaking/ComputeApiLevelUseRegistry.java
@@ -175,12 +175,9 @@
private void setMaxApiReferenceLevelForGuard(DexType type) {
if (isEnabled) {
- if (ApiReferenceStubber.isAlwaysStubbedType(type, appInfoWithClassHierarchy.dexItemFactory())
- && !appInfoWithClassHierarchy.options().canHaveDalvikCatchHandlerVerificationBug()) {
- return;
- }
ComputedApiLevel computedApiLevel = apiLevelCompute.computeApiLevelForLibraryReference(type);
if (ApiReferenceStubber.isNeverStubbedType(type, appInfoWithClassHierarchy.dexItemFactory())
+ || appInfoWithClassHierarchy.options().canHaveDalvikCatchHandlerVerificationBug()
|| computedApiLevel.isUnknownApiLevel()) {
maxApiReferenceLevel = maxApiReferenceLevel.max(computedApiLevel);
}
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfTryCatchReferenceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfTryCatchReferenceTest.java
index 6f52939..6074c6e 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfTryCatchReferenceTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfTryCatchReferenceTest.java
@@ -24,7 +24,7 @@
@RunWith(Parameterized.class)
public class ApiModelNoInliningOfTryCatchReferenceTest extends TestBase {
- private final AndroidApiLevel exceptionApiLevel = AndroidApiLevel.L_MR1;
+ private final AndroidApiLevel exceptionApiLevel = AndroidApiLevel.M;
@Parameter() public TestParameters parameters;
@@ -50,16 +50,28 @@
.apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.enableInliningAnnotations()
.addHorizontallyMergedClassesInspector(
- horizontallyMergedClassesInspector ->
+ horizontallyMergedClassesInspector -> {
+ // Dalvik verifier error present up to and not including L.
+ if (parameters.isDexRuntime()
+ && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.L)) {
horizontallyMergedClassesInspector.assertIsCompleteMergeGroup(
- TestClass.class, Caller.class))
+ TestClass.class, Caller.class);
+ } else {
+ horizontallyMergedClassesInspector.assertNoClassesMerged();
+ }
+ })
.apply(
ApiModelingTestHelper.addTracedApiReferenceLevelCallBack(
(reference, apiLevel) -> {
if (reference.equals(Reference.methodFromMethod(tryCatch))) {
- // The exception catch guard does not contribute to the modelled API level.
+ // Dalvik verifier error present up to and not including L.
assertEquals(
- parameters.isCfRuntime() ? AndroidApiLevel.B : parameters.getApiLevel(),
+ parameters.isDexRuntime()
+ && parameters
+ .getApiLevel()
+ .isGreaterThanOrEqualTo(AndroidApiLevel.L)
+ ? parameters.getApiLevel()
+ : exceptionApiLevel,
apiLevel);
}
}))
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineCatchHandlerWithLibraryTypeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineCatchHandlerWithLibraryTypeTest.java
index e8df112..4ff3f4f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineCatchHandlerWithLibraryTypeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineCatchHandlerWithLibraryTypeTest.java
@@ -136,6 +136,7 @@
assertFalse(mainHasInlinedCatchHandler);
} else {
assertEquals(
+ // Dalvik verifier error present up to and not including L.
parameters.getApiLevel().isLessThanOrEqualTo(AndroidApiLevel.L)
? parameters.getApiLevel().getLevel() >= EXCEPTIONS.get(exception)
: isPresentInRuntime() || isStubbed(),