Ensure DEX monitor instructions in R8 partial
Fixes: b/414598986
Change-Id: I9c2d2b27ee376ed6ff4ea659277334217179ea5e
Bug: b/b/414965524
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java
index 39fee28..59640a5 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java
@@ -70,6 +70,13 @@
method -> method.hasCode() && !appView.isCfByteCodePassThrough(method),
method -> {
assert !method.getDefinition().getCode().hasExplicitCodeLens();
+ // TODO(b/414965524): Remove the need for checking processed and move the handling
+ // synchronized methods in DEX to a "CodeRewriterPass" as IR rewriting.
+ if (method.getDefinition().isProcessed()) {
+ assert appView.options().partialSubCompilationConfiguration != null
+ && appView.options().partialSubCompilationConfiguration.isR8();
+ method.getDefinition().markNotProcessed();
+ }
IRCode code = method.buildIR(appView, MethodConversionOptions.forLirPhase(appView));
codeRewriterPassCollection.run(
code, null, null, Timing.empty(), null, appView.options());
diff --git a/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodTest.java b/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodExcludedTest.java
similarity index 83%
copy from src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodTest.java
copy to src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodExcludedTest.java
index 6b263be..ebbd0f0 100644
--- a/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodExcludedTest.java
@@ -17,7 +17,7 @@
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
-public class PartialCompilationSynchronizedMethodTest extends TestBase {
+public class PartialCompilationSynchronizedMethodExcludedTest extends TestBase {
@Parameter(0)
public TestParameters parameters;
@@ -55,10 +55,6 @@
checkMonitorEnterAndExit(inspector, 3);
}
- private void unexpectedMonitorEnterAndExit(CodeInspector inspector) {
- checkMonitorEnterAndExit(inspector, 0);
- }
-
@Test
public void testD8() throws Exception {
parameters.assumeDexRuntime();
@@ -75,15 +71,14 @@
public void testR8Partial() throws Exception {
parameters.assumeCanUseR8Partial();
testForR8Partial(parameters.getBackend())
- .addR8IncludedClasses(ClassWithSynchronizedMethod.class)
- .addR8ExcludedClasses(TestClass.class)
- .addKeepClassAndMembersRules(ClassWithSynchronizedMethod.class)
+ .addR8IncludedClasses(TestClass.class)
+ .addR8ExcludedClasses(ClassWithSynchronizedMethod.class)
+ .addKeepMainRule(TestClass.class)
.setMinApi(parameters)
.compile()
- // TODO(b/414598986): Should not happen.
- .inspect(this::unexpectedMonitorEnterAndExit)
+ .inspect(this::expectedMonitorEnterAndExit)
.run(parameters.getRuntime(), TestClass.class)
- .assertFailureWithErrorThatThrows(IllegalMonitorStateException.class);
+ .assertSuccessWithOutput(EXPECTED_OUTPUT);
}
static class ClassWithSynchronizedMethod {
diff --git a/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodTest.java b/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodIncludedTest.java
similarity index 88%
rename from src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodTest.java
rename to src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodIncludedTest.java
index 6b263be..e3404b7 100644
--- a/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodIncludedTest.java
@@ -17,7 +17,7 @@
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
-public class PartialCompilationSynchronizedMethodTest extends TestBase {
+public class PartialCompilationSynchronizedMethodIncludedTest extends TestBase {
@Parameter(0)
public TestParameters parameters;
@@ -55,10 +55,6 @@
checkMonitorEnterAndExit(inspector, 3);
}
- private void unexpectedMonitorEnterAndExit(CodeInspector inspector) {
- checkMonitorEnterAndExit(inspector, 0);
- }
-
@Test
public void testD8() throws Exception {
parameters.assumeDexRuntime();
@@ -80,10 +76,9 @@
.addKeepClassAndMembersRules(ClassWithSynchronizedMethod.class)
.setMinApi(parameters)
.compile()
- // TODO(b/414598986): Should not happen.
- .inspect(this::unexpectedMonitorEnterAndExit)
+ .inspect(this::expectedMonitorEnterAndExit)
.run(parameters.getRuntime(), TestClass.class)
- .assertFailureWithErrorThatThrows(IllegalMonitorStateException.class);
+ .assertSuccessWithOutput(EXPECTED_OUTPUT);
}
static class ClassWithSynchronizedMethod {