Merge commit 'af4270bf5a70bf147f3344f25d4d8714b97df87a' into dev-release Change-Id: I8fce2fd2b346f3ed7559646ec088731f71be59b1
diff --git a/README.md b/README.md index a152891..487df6d 100644 --- a/README.md +++ b/README.md
@@ -68,6 +68,18 @@ a version of gradle to use for building on the first run. This will produce a jar file: `build/libs/r8.jar` which contains both R8 and D8. +## Setting up IntelliJ + +Follow the instructions in the above section. + +1. Open the project `r8/d8_r8` in IntelliJ +2. Navigate to "Settings" > "Build, Execution, Deployment" > "Build Tools" > "Gradle" + 1. Select `r8/third_party/gradle` as "Local installation" in "Distribution" + 2. Select `r8/third_party/openjdk/jdk-11/linux` as "Gradle JVM" +3. Sync the project using Gradle + +In order to run tests it may currently be necessary to run `tools/test.py` from the command line first. + ## <a name="running-d8"></a>Running D8 The D8 dexer has a simple command-line interface with only a few options.
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/inlining/NullSimpleInliningConstraint.java b/src/main/java/com/android/tools/r8/ir/analysis/inlining/NullSimpleInliningConstraint.java index 2c0448a..d589af6 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/inlining/NullSimpleInliningConstraint.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/inlining/NullSimpleInliningConstraint.java
@@ -50,17 +50,18 @@ return removedArgumentInfo.getSingleValue().isNull() && nullability.isDefinitelyNull() ? AlwaysSimpleInliningConstraint.getInstance() : NeverSimpleInliningConstraint.getInstance(); - } else if (argumentInfo.isRewrittenTypeInfo()) { + } + int newArgumentIndex = changes.getNewArgumentIndex(getArgumentIndex()); + if (argumentInfo.isRewrittenTypeInfo()) { RewrittenTypeInfo rewrittenTypeInfo = argumentInfo.asRewrittenTypeInfo(); if (rewrittenTypeInfo.getNewType().isIntType()) { // Rewrite definitely-null constraints to definitely-zero constraints. return nullability.isDefinitelyNull() - ? factory.createEqualToNumberConstraint(getArgumentIndex(), 0) - : factory.createNotEqualToNumberConstraint(getArgumentIndex(), 0); + ? factory.createEqualToNumberConstraint(newArgumentIndex, 0) + : factory.createNotEqualToNumberConstraint(newArgumentIndex, 0); } - return this; } - return withArgumentIndex(changes.getNewArgumentIndex(getArgumentIndex()), factory); + return withArgumentIndex(newArgumentIndex, factory); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java index fcd5428..fb052fb 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
@@ -6,7 +6,6 @@ import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; -import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexClasspathClass; import com.android.tools.r8.graph.DexMethod; @@ -289,7 +288,7 @@ public void acceptNestConstructorBridge( ProgramMethod target, ProgramMethod bridge, - DexClass argumentClass, + DexProgramClass argumentClass, DexClassAndMethod context) { // Intentionally empty. } @@ -723,7 +722,7 @@ public void acceptNestConstructorBridge( ProgramMethod target, ProgramMethod bridge, - DexClass argumentClass, + DexProgramClass argumentClass, DexClassAndMethod context) { // Intentionally empty. }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java index 93b2f34..a4465a9 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
@@ -13,6 +13,7 @@ import com.android.tools.r8.graph.DexClasspathClass; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexMethod; +import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.ProgramField; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.conversion.D8MethodProcessor; @@ -108,7 +109,7 @@ public void acceptNestConstructorBridge( ProgramMethod target, ProgramMethod bridge, - DexClass argumentClass, + DexProgramClass argumentClass, DexClassAndMethod context) { methodProcessor.scheduleDesugaredMethodForProcessing(bridge); } @@ -228,7 +229,8 @@ private void ensureConstructorBridgeFromClasspathAccess( ProgramMethod method, NestBasedAccessDesugaringEventConsumer eventConsumer) { assert method.getDefinition().isInstanceInitializer(); - DexClass constructorArgumentClass = ensureConstructorArgumentClass(method); + DexProgramClass constructorArgumentClass = + ensureConstructorArgumentClass(method).asProgramClass(); DexMethod bridgeReference = getConstructorBridgeReference(method, constructorArgumentClass); synchronized (method.getHolder().getMethodCollection()) { if (method.getHolder().lookupMethod(bridgeReference) == null) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java index 55221e7..10f3501 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
@@ -232,7 +232,7 @@ : AccessBridgeFactory.createMethodAccessorBridge( bridgeAndTarget.getBridge(), targetMethod, dexItemFactory)); if (targetMethod.getDefinition().isInstanceInitializer()) { - DexClass argumentClass = getConstructorArgumentClass(targetMethod); + DexProgramClass argumentClass = getConstructorArgumentClass(targetMethod).asProgramClass(); eventConsumer.acceptNestConstructorBridge(targetMethod, bridgeMethod, argumentClass, context); } else { eventConsumer.acceptNestMethodBridge(targetMethod, bridgeMethod, context); @@ -441,35 +441,29 @@ } private DexClass getConstructorArgumentClass(DexClassAndMethod constructor) { - return syntheticNestConstructorTypes.get(constructor.getHolder().getNestHost()); + return syntheticNestConstructorTypes.get(constructor.getHolderType()); } DexClass ensureConstructorArgumentClass(DexClassAndMethod constructor) { assert constructor.getDefinition().isInstanceInitializer(); - assert constructor.isProgramMethod() || constructor.isClasspathMethod(); - DexType hostType = - constructor.isProgramMethod() - ? constructor.asProgramMethod().getHolder().getNestHost() - : constructor.asClasspathMethod().getHolder().getNestHost(); - DexClass host = appView.definitionFor(hostType); return syntheticNestConstructorTypes.computeIfAbsent( - hostType, + constructor.getHolderType(), holder -> { - if (host.isProgramClass()) { + if (constructor.isProgramMethod()) { return appView .getSyntheticItems() .createFixedClass( kinds -> kinds.INIT_TYPE_ARGUMENT, - host.asProgramClass(), + constructor.asProgramMethod().getHolder(), appView, builder -> {}); } else { - assert host.isClasspathClass(); + assert constructor.isClasspathMethod(); return appView .getSyntheticItems() .ensureFixedClasspathClass( kinds -> kinds.INIT_TYPE_ARGUMENT, - host.asClasspathClass(), + constructor.asClasspathMethod().getHolder(), appView, ignored -> {}, ignored -> {});
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java index 8ec49e2..afbeedc 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java
@@ -4,8 +4,8 @@ package com.android.tools.r8.ir.desugar.nest; -import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexClassAndMethod; +import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.ProgramField; import com.android.tools.r8.graph.ProgramMethod; @@ -14,7 +14,7 @@ void acceptNestConstructorBridge( ProgramMethod target, ProgramMethod bridge, - DexClass argumentClass, + DexProgramClass argumentClass, DexClassAndMethod context); void acceptNestFieldGetBridge( @@ -46,7 +46,7 @@ public void acceptNestConstructorBridge( ProgramMethod target, ProgramMethod bridge, - DexClass argumentClass, + DexProgramClass argumentClass, DexClassAndMethod context) { // Intentionally empty. }
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java index 3af5dc4..b556923 100644 --- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java +++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
@@ -7,7 +7,6 @@ import static com.android.tools.r8.profile.rewriting.ProfileRewritingVarHandleDesugaringEventConsumerUtils.handleVarHandleDesugaringClassContext; import com.android.tools.r8.graph.AppView; -import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexClasspathClass; import com.android.tools.r8.graph.DexMethod; @@ -293,7 +292,7 @@ public void acceptNestConstructorBridge( ProgramMethod target, ProgramMethod bridge, - DexClass argumentClass, + DexProgramClass argumentClass, DexClassAndMethod context) { nestBasedAccessDesugaringEventConsumer.acceptNestConstructorBridge( target, bridge, argumentClass, context);
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java index c44706f..7d731fb 100644 --- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java +++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
@@ -4,8 +4,8 @@ package com.android.tools.r8.profile.rewriting; -import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexClassAndMethod; +import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.ProgramField; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.desugar.nest.NestBasedAccessDesugaringEventConsumer; @@ -38,13 +38,12 @@ public void acceptNestConstructorBridge( ProgramMethod target, ProgramMethod bridge, - DexClass argumentClass, + DexProgramClass argumentClass, DexClassAndMethod context) { if (context.isProgramMethod()) { additionsCollection.applyIfContextIsInProfile( context.asProgramMethod(), - additionsBuilder -> - additionsBuilder.addRule(argumentClass.getReference()).addRule(bridge)); + additionsBuilder -> additionsBuilder.addRule(argumentClass).addRule(bridge)); } else { additionsCollection.accept( additions ->
diff --git a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java index 5e18f9c..0dec846 100644 --- a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java +++ b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
@@ -45,7 +45,7 @@ .inspect( inspector -> assertEquals( - 1, + 5, inspector.allClasses().stream() .map(ClassSubject::getFinalName) .filter(name -> name.endsWith("-IA")) @@ -73,7 +73,7 @@ .inspect( inspector -> assertEquals( - 0, + 1, inspector.allClasses().stream() .map(ClassSubject::getFinalName) .filter(name -> name.endsWith("-IA")) @@ -106,7 +106,7 @@ .inspect( inspector -> assertEquals( - 1, + 5, inspector.allClasses().stream() .map(ClassSubject::getFinalName) .filter(name -> name.endsWith("-IA"))
diff --git a/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java b/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java index 974683a..d2e3d0c 100644 --- a/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java +++ b/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java
@@ -64,13 +64,13 @@ inner.inspect( inspector -> { assertThisNumberOfBridges(inspector, 3); - assertNoNestConstructor(inspector); + assertNestConstructor(inspector); }); D8TestCompileResult host = compileClassesWithD8ProgramClasses(nestHost, nestHost); host.inspect( inspector -> { assertThisNumberOfBridges(inspector, 1); - assertInitArgumentClass(inspector); + assertNestConstructor(inspector); }); } @@ -100,14 +100,10 @@ .compile(); } - private static void assertInitArgumentClass(CodeInspector inspector) { + private static void assertNestConstructor(CodeInspector inspector) { assertTrue(inspector.allClasses().stream().anyMatch(FoundClassSubject::isSynthetic)); } - private static void assertNoNestConstructor(CodeInspector inspector) { - assertTrue(inspector.allClasses().stream().noneMatch(FoundClassSubject::isSynthetic)); - } - private static void assertThisNumberOfBridges(CodeInspector inspector, int numBridges) { for (FoundClassSubject clazz : inspector.allClasses()) { if (!clazz.isSynthetic()) {
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java index b2ea090..3c7248a 100644 --- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java +++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java
@@ -91,9 +91,9 @@ parameters.isCfRuntime(), result -> result.assertSuccessWithOutputLines( - "Outer-IA, 1", - "int, Outer-IA, 2", - "int, int, Outer-IA, 3", + "Outer$Inner-IA, 1", + "int, Outer$Inner-IA, 2", + "int, int, Outer$Inner-IA, 3", "int, int, 2", "int, 1", "0"), @@ -102,9 +102,9 @@ "0", "int, 1", "int, int, 2", - "int, int, Outer-IA, 3", - "int, Outer-IA, 2", - "Outer-IA, 1")); + "int, int, Outer$Inner-IA, 3", + "int, Outer$Inner-IA, 2", + "Outer$Inner-IA, 1")); } @Test
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java index 2b2d2f0..5756f2e 100644 --- a/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java +++ b/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
@@ -107,6 +107,7 @@ inspect( profileInspector, inspector, + false, parameters.canUseNestBasedAccessesWhenDesugaring(), false); } @@ -116,6 +117,7 @@ inspect( profileInspector, inspector, + parameters.canHaveNonReboundConstructorInvoke(), parameters.canUseNestBasedAccesses(), true); } @@ -123,6 +125,7 @@ private void inspect( ArtProfileInspector profileInspector, CodeInspector inspector, + boolean canHaveNonReboundConstructorInvoke, boolean canUseNestBasedAccesses, boolean isR8) throws Exception { @@ -132,7 +135,7 @@ ClassSubject syntheticConstructorArgumentClassSubject = inspector.clazz( SyntheticItemsTestUtils.syntheticNestConstructorArgumentClass( - Reference.classFromClass(Main.class))); + Reference.classFromClass(NestMember.class))); assertThat( syntheticConstructorArgumentClassSubject, notIf(isPresent(), canUseNestBasedAccesses));