Assign api level to methods rewritten with configuration debugging
Bug: b/298965633
Change-Id: I89745aa8b041fd00c48a449b3dae94896ae61e71
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index d8a8834..e1e8b82 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -867,8 +867,7 @@
private static boolean allReferencesAssignedApiLevel(
AppView<? extends AppInfoWithClassHierarchy> appView) {
- if (!appView.options().apiModelingOptions().isCheckAllApiReferencesAreSet()
- || appView.options().configurationDebugging) {
+ if (!appView.options().apiModelingOptions().isCheckAllApiReferencesAreSet()) {
return true;
}
// This will assert false if we find anything in the library which is not modeled.
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 4811185..d4db53d 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -1004,7 +1004,9 @@
: toDexCodeThatLogsError(appView.dexItemFactory()))
.setIsLibraryMethodOverrideIf(
belongsToVirtualPool() && !isLibraryMethodOverride().isUnknown(),
- isLibraryMethodOverride());
+ isLibraryMethodOverride())
+ .setApiLevelForCode(appView.computedMinApiLevel())
+ .setApiLevelForDefinition(ComputedApiLevel.unknown());
setObsolete();
return builder.build();
}
diff --git a/src/main/java/com/android/tools/r8/shaking/TreePruner.java b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
index 0c0da4e..d813a668 100644
--- a/src/main/java/com/android/tools/r8/shaking/TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
@@ -5,6 +5,7 @@
import static com.google.common.base.Predicates.alwaysFalse;
+import com.android.tools.r8.androidapi.ComputedApiLevel;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DefaultInstanceInitializerCode;
import com.android.tools.r8.graph.DexClass;
@@ -362,10 +363,12 @@
reachableMethods.add(method);
} else if (options.configurationDebugging) {
// Keep the method but rewrite its body, if it has one.
- reachableMethods.add(
- method.shouldNotHaveCode() && !method.hasCode()
- ? method
- : method.toMethodThatLogsError(appView));
+ if (method.shouldNotHaveCode() && !method.hasCode()) {
+ method.setApiLevelForDefinition(ComputedApiLevel.unknown());
+ reachableMethods.add(method);
+ } else {
+ reachableMethods.add(method.toMethodThatLogsError(appView));
+ }
methodsToKeepForConfigurationDebugging.add(method.getReference());
} else if (appInfo.isTargetedMethod(method.getReference())) {
// If the method is already abstract, and doesn't have code, let it be.
diff --git a/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingWithInliningTest.java b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingWithInliningTest.java
index 6256a35..edd31ba 100644
--- a/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingWithInliningTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingWithInliningTest.java
@@ -5,9 +5,7 @@
package com.android.tools.r8.shaking.addconfigurationdebugging;
import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertThrows;
-import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
@@ -31,20 +29,26 @@
@Test
public void testForR8() throws Exception {
- assertThrows(
- CompilationFailedException.class,
- () ->
- testForR8(parameters.getBackend())
- .addProgramClasses(Main.class, Bar.class)
- .addKeepRules("-addconfigurationdebugging")
- .addKeepMainRule(Main.class)
- .setMinApi(parameters)
- .enableInliningAnnotations()
- // TODO(b/298965633): We should not fail.
- .compileWithExpectedDiagnostics(
- diagnostics ->
- diagnostics.assertErrorMessageThatMatches(
- containsString("Cannot compute relationship for not set"))));
+ testForR8(parameters.getBackend())
+ .addProgramClasses(Main.class, Bar.class)
+ .addKeepRules("-addconfigurationdebugging")
+ .addKeepMainRule(Main.class)
+ .setMinApi(parameters)
+ .enableInliningAnnotations()
+ .compile()
+ .run(parameters.getRuntime(), Main.class)
+ // AddConfigurationDebugging will insert a call to android.util.log.
+ .applyIf(
+ parameters.isDexRuntime(),
+ result ->
+ result
+ .assertFailureWithErrorThatThrows(NoClassDefFoundError.class)
+ .assertFailureWithErrorThatMatches(containsString("Landroid/util/Log;")))
+ .applyIf(
+ parameters.isCfRuntime(),
+ result ->
+ result.assertFailureWithErrorThatMatches(
+ containsString("Missing method in " + typeName(Bar.class))));
}
public static class Main {