Merge commit 'd10fec99f939477edbebfc4fc218a7ff26e89235' into dev-release
Change-Id: I1df9068ecdfb2404dea379eb3fa2997c4e9a5f6a
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index da49f2e..1083cb8 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -20,6 +20,7 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppServices;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexApplicationReadFlags;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexProgramClass;
@@ -678,9 +679,11 @@
timing.begin("Run postlude");
performFinalMainDexTracing(appView, executorService);
- if (appView.appInfo().hasLiveness()) {
+ // If there was a reference to java.lang.Record in the input, we rewrite the record values.
+ DexApplicationReadFlags flags = appView.appInfo().app().getFlags();
+ if (flags.hasReadRecordReferenceFromProgramClass()) {
RecordFieldValuesRewriter recordFieldArrayRemover =
- RecordFieldValuesRewriter.create(appView.withLiveness());
+ RecordFieldValuesRewriter.create(appView);
if (recordFieldArrayRemover != null) {
recordFieldArrayRemover.rewriteRecordFieldValues();
}
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java
index aaa4dad..b742d92 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -951,6 +951,11 @@
return (AppView<AppInfo>) this;
}
+ @SuppressWarnings("unchecked")
+ public AppView<AppInfo> unsafeWithoutClassHierarchy() {
+ return (AppView<AppInfo>) this;
+ }
+
public boolean hasLiveness() {
return appInfo().hasLiveness();
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index dcc3abf..13b059d 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -222,8 +222,7 @@
&& appView.options().canHaveVerifyErrorForUnknownUnusedReturnValue())
? new RemoveVerificationErrorForUnknownReturnedValues(appView)
: null;
- if (appView.enableWholeProgramOptimizations()) {
- assert appView.appInfo().hasLiveness();
+ if (appView.enableWholeProgramOptimizations() && appView.appInfo().hasLiveness()) {
assert appView.rootSet() != null;
AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
assumeInserter = new AssumeInserter(appViewWithLiveness);
@@ -254,7 +253,10 @@
options.enableDevirtualization ? new Devirtualizer(appViewWithLiveness) : null;
this.typeChecker = new TypeChecker(appViewWithLiveness, VerifyTypesHelper.create(appView));
} else {
- AppView<AppInfo> appViewWithoutClassHierarchy = appView.withoutClassHierarchy();
+ AppView<AppInfo> appViewWithoutClassHierarchy =
+ appView.enableWholeProgramOptimizations()
+ ? appView.unsafeWithoutClassHierarchy()
+ : appView.withoutClassHierarchy();
this.assumeInserter = null;
this.classInliner = null;
this.dynamicTypeOptimization = null;
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 fb052fb..fcd5428 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,6 +6,7 @@
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;
@@ -288,7 +289,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexProgramClass argumentClass,
+ DexClass argumentClass,
DexClassAndMethod context) {
// Intentionally empty.
}
@@ -722,7 +723,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexProgramClass argumentClass,
+ DexClass 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 a4465a9..93b2f34 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,7 +13,6 @@
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;
@@ -109,7 +108,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexProgramClass argumentClass,
+ DexClass argumentClass,
DexClassAndMethod context) {
methodProcessor.scheduleDesugaredMethodForProcessing(bridge);
}
@@ -229,8 +228,7 @@
private void ensureConstructorBridgeFromClasspathAccess(
ProgramMethod method, NestBasedAccessDesugaringEventConsumer eventConsumer) {
assert method.getDefinition().isInstanceInitializer();
- DexProgramClass constructorArgumentClass =
- ensureConstructorArgumentClass(method).asProgramClass();
+ DexClass constructorArgumentClass = ensureConstructorArgumentClass(method);
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 10f3501..55221e7 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()) {
- DexProgramClass argumentClass = getConstructorArgumentClass(targetMethod).asProgramClass();
+ DexClass argumentClass = getConstructorArgumentClass(targetMethod);
eventConsumer.acceptNestConstructorBridge(targetMethod, bridgeMethod, argumentClass, context);
} else {
eventConsumer.acceptNestMethodBridge(targetMethod, bridgeMethod, context);
@@ -441,29 +441,35 @@
}
private DexClass getConstructorArgumentClass(DexClassAndMethod constructor) {
- return syntheticNestConstructorTypes.get(constructor.getHolderType());
+ return syntheticNestConstructorTypes.get(constructor.getHolder().getNestHost());
}
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(
- constructor.getHolderType(),
+ hostType,
holder -> {
- if (constructor.isProgramMethod()) {
+ if (host.isProgramClass()) {
return appView
.getSyntheticItems()
.createFixedClass(
kinds -> kinds.INIT_TYPE_ARGUMENT,
- constructor.asProgramMethod().getHolder(),
+ host.asProgramClass(),
appView,
builder -> {});
} else {
- assert constructor.isClasspathMethod();
+ assert host.isClasspathClass();
return appView
.getSyntheticItems()
.ensureFixedClasspathClass(
kinds -> kinds.INIT_TYPE_ARGUMENT,
- constructor.asClasspathMethod().getHolder(),
+ host.asClasspathClass(),
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 afbeedc..8ec49e2 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,
- DexProgramClass argumentClass,
+ DexClass argumentClass,
DexClassAndMethod context);
void acceptNestFieldGetBridge(
@@ -46,7 +46,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexProgramClass argumentClass,
+ DexClass argumentClass,
DexClassAndMethod context) {
// Intentionally empty.
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
index 71e0780..839fc6a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.graph.DexClass;
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.FieldResolutionResult;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.code.ArrayPut;
@@ -23,7 +24,6 @@
import com.android.tools.r8.ir.conversion.IRConverter;
import com.android.tools.r8.ir.conversion.MethodConversionOptions;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore;
-import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.Timing;
import java.util.ArrayList;
import java.util.List;
@@ -32,17 +32,17 @@
/** Used to shrink record field arrays in dex compilations */
public class RecordFieldValuesRewriter {
- private final AppView<AppInfoWithLiveness> appView;
+ private final AppView<?> appView;
private final IRConverter irConverter;
- public static RecordFieldValuesRewriter create(AppView<AppInfoWithLiveness> appView) {
+ public static RecordFieldValuesRewriter create(AppView<?> appView) {
if (appView.enableWholeProgramOptimizations() && appView.options().isGeneratingDex()) {
return new RecordFieldValuesRewriter(appView);
}
return null;
}
- private RecordFieldValuesRewriter(AppView<AppInfoWithLiveness> appView) {
+ private RecordFieldValuesRewriter(AppView<?> appView) {
this.appView = appView;
irConverter = new IRConverter(appView);
}
@@ -50,18 +50,32 @@
// Called after final tree shaking, prune and minify field names and field values.
// At least one instruction is a newRecordFieldArray.
public void rewriteRecordFieldValues() {
- for (DexMethod recordFieldValuesReference : appView.appInfo().recordFieldValuesReferences) {
- DexClass dexClass =
- appView.contextIndependentDefinitionFor(recordFieldValuesReference.getHolderType());
- assert dexClass.isProgramClass();
- ProgramMethod programMethod =
- dexClass.asProgramClass().lookupProgramMethod(recordFieldValuesReference);
- assert programMethod != null;
- rewriteRecordFieldValues(programMethod);
+ if (appView.hasLiveness()) {
+ for (DexMethod recordFieldValuesReference :
+ appView.appInfo().withLiveness().recordFieldValuesReferences) {
+ DexClass dexClass =
+ appView.contextIndependentDefinitionFor(recordFieldValuesReference.getHolderType());
+ assert dexClass.isProgramClass();
+ ProgramMethod programMethod =
+ dexClass.asProgramClass().lookupProgramMethod(recordFieldValuesReference);
+ assert programMethod != null;
+ rewriteRecordFieldValues(programMethod, false);
+ }
+ } else {
+ // Without liveness, i.e., R8 called with -dontshrink, we take a slow path and exhaustively
+ // process all methods.
+ for (DexProgramClass clazz : appView.appInfo().classes()) {
+ clazz.forEachProgramMethod(
+ method -> {
+ if (method.getDefinition().hasCode()) {
+ rewriteRecordFieldValues(method, true);
+ }
+ });
+ }
}
}
- public void rewriteRecordFieldValues(ProgramMethod programMethod) {
+ public void rewriteRecordFieldValues(ProgramMethod programMethod, boolean wide) {
IRCode irCode =
programMethod
.getDefinition()
@@ -84,7 +98,7 @@
}
}
}
- assert done;
+ assert wide || done;
irConverter.removeDeadCodeAndFinalizeIR(
irCode, OptimizationFeedbackIgnore.getInstance(), Timing.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 b556923..3af5dc4 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,6 +7,7 @@
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;
@@ -292,7 +293,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexProgramClass argumentClass,
+ DexClass 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 7d731fb..c44706f 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,12 +38,13 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexProgramClass argumentClass,
+ DexClass argumentClass,
DexClassAndMethod context) {
if (context.isProgramMethod()) {
additionsCollection.applyIfContextIsInProfile(
context.asProgramMethod(),
- additionsBuilder -> additionsBuilder.addRule(argumentClass).addRule(bridge));
+ additionsBuilder ->
+ additionsBuilder.addRule(argumentClass.getReference()).addRule(bridge));
} else {
additionsCollection.accept(
additions ->
diff --git a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextClass.java b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextClass.java
new file mode 100644
index 0000000..cc8b8f3
--- /dev/null
+++ b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextClass.java
@@ -0,0 +1,32 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package nesthostexample;
+
+class NestInitArgumentContextClass {
+ public class Inner1 {
+ private Inner1() {
+ new NestInitArgumentContextClass();
+ }
+ }
+
+ public class Inner2 {
+ private Inner2() {}
+ }
+
+ public class Inner3 {
+ private Inner3() {}
+ }
+
+ public class Inner4 {
+ private Inner4() {}
+ }
+
+ private NestInitArgumentContextClass() {
+ new Inner1();
+ new Inner2();
+ new Inner3();
+ new Inner4();
+ }
+}
diff --git a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
new file mode 100644
index 0000000..5e18f9c
--- /dev/null
+++ b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
@@ -0,0 +1,115 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package nesthostexample;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.google.common.collect.ImmutableList;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class NestInitArgumentContextTest extends TestBase {
+
+ @Parameter(0)
+ public TestParameters parameters;
+
+ @Parameter(1)
+ public boolean intermediate;
+
+ @Parameters(name = "{0}, intermediate = {1}")
+ public static List<Object[]> data() {
+ return buildParameters(
+ getTestParameters().withDexRuntimesAndAllApiLevels().build(), BooleanUtils.values());
+ }
+
+ @Test
+ public void testD8SingleCompilationUnit() throws Exception {
+ testForD8(parameters.getBackend())
+ .addProgramClassesAndInnerClasses(NestInitArgumentContextClass.class)
+ .setMinApi(parameters)
+ .setIntermediate(intermediate)
+ .compile()
+ .inspect(
+ inspector ->
+ assertEquals(
+ 1,
+ inspector.allClasses().stream()
+ .map(ClassSubject::getFinalName)
+ .filter(name -> name.endsWith("-IA"))
+ .count()));
+ }
+
+ @Test
+ public void testD8SeparateCompilationUnits() throws Exception {
+ List<Class<?>> innerClasses =
+ ImmutableList.of(
+ NestInitArgumentContextClass.Inner1.class,
+ NestInitArgumentContextClass.Inner2.class,
+ NestInitArgumentContextClass.Inner3.class,
+ NestInitArgumentContextClass.Inner4.class);
+ List<Path> innerClassesCompiled = new ArrayList<>();
+ for (int i = 0; i < 4; i++) {
+ innerClassesCompiled.add(
+ testForD8(parameters.getBackend())
+ .addProgramClasses(innerClasses.get(i))
+ .addClasspathClasses(NestInitArgumentContextClass.class)
+ .addClasspathClasses(innerClasses)
+ .setMinApi(parameters)
+ .setIntermediate(intermediate)
+ .compile()
+ .inspect(
+ inspector ->
+ assertEquals(
+ 0,
+ inspector.allClasses().stream()
+ .map(ClassSubject::getFinalName)
+ .filter(name -> name.endsWith("-IA"))
+ .count()))
+ .writeToZip());
+ }
+
+ Path outerClassCompiled =
+ testForD8(parameters.getBackend())
+ .addProgramClasses(NestInitArgumentContextClass.class)
+ .addClasspathClasses(innerClasses)
+ .setMinApi(parameters)
+ .setIntermediate(intermediate)
+ .compile()
+ .inspect(
+ inspector ->
+ assertEquals(
+ 1,
+ inspector.allClasses().stream()
+ .map(ClassSubject::getFinalName)
+ .filter(name -> name.endsWith("-IA"))
+ .count()))
+ .writeToZip();
+
+ testForD8(parameters.getBackend())
+ .addProgramFiles(innerClassesCompiled)
+ .addProgramFiles(outerClassCompiled)
+ .setMinApi(parameters)
+ .compile()
+ .inspect(
+ inspector ->
+ assertEquals(
+ 1,
+ inspector.allClasses().stream()
+ .map(ClassSubject::getFinalName)
+ .filter(name -> name.endsWith("-IA"))
+ .count()));
+ }
+}
diff --git a/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java b/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java
index d2e3d0c..974683a 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);
- assertNestConstructor(inspector);
+ assertNoNestConstructor(inspector);
});
D8TestCompileResult host = compileClassesWithD8ProgramClasses(nestHost, nestHost);
host.inspect(
inspector -> {
assertThisNumberOfBridges(inspector, 1);
- assertNestConstructor(inspector);
+ assertInitArgumentClass(inspector);
});
}
@@ -100,10 +100,14 @@
.compile();
}
- private static void assertNestConstructor(CodeInspector inspector) {
+ private static void assertInitArgumentClass(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/examplesJava17/records/RecordHashCodeTest.java b/src/test/examplesJava17/records/RecordHashCodeTest.java
index 2f2609d..b0b0b0e 100644
--- a/src/test/examplesJava17/records/RecordHashCodeTest.java
+++ b/src/test/examplesJava17/records/RecordHashCodeTest.java
@@ -83,6 +83,28 @@
builder.run(parameters.getRuntime(), TestClass.class).assertSuccessWithOutput(EXPECTED_RESULT);
}
+ @Test
+ public void testR8DontShrinkDontObfuscate() throws Exception {
+ parameters.assumeR8TestParameters();
+ assumeTrue(parameters.isDexRuntime() || isCfRuntimeWithNativeRecordSupport());
+ R8FullTestBuilder builder =
+ testForR8(parameters.getBackend())
+ .addInnerClassesAndStrippedOuter(getClass())
+ .setMinApi(parameters)
+ .addDontShrink()
+ .addDontObfuscate()
+ .addInliningAnnotations()
+ .addKeepMainRule(TestClass.class);
+ if (parameters.isCfRuntime()) {
+ builder
+ .addLibraryProvider(JdkClassFileProvider.fromSystemJdk())
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutput(EXPECTED_RESULT);
+ return;
+ }
+ builder.run(parameters.getRuntime(), TestClass.class).assertSuccessWithOutput(EXPECTED_RESULT);
+ }
+
public static class TestClass {
record Person(String name, int age) {}
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 3c7248a..b2ea090 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$Inner-IA, 1",
- "int, Outer$Inner-IA, 2",
- "int, int, Outer$Inner-IA, 3",
+ "Outer-IA, 1",
+ "int, Outer-IA, 2",
+ "int, int, Outer-IA, 3",
"int, int, 2",
"int, 1",
"0"),
@@ -102,9 +102,9 @@
"0",
"int, 1",
"int, int, 2",
- "int, int, Outer$Inner-IA, 3",
- "int, Outer$Inner-IA, 2",
- "Outer$Inner-IA, 1"));
+ "int, int, Outer-IA, 3",
+ "int, Outer-IA, 2",
+ "Outer-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 5756f2e..2b2d2f0 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,7 +107,6 @@
inspect(
profileInspector,
inspector,
- false,
parameters.canUseNestBasedAccessesWhenDesugaring(),
false);
}
@@ -117,7 +116,6 @@
inspect(
profileInspector,
inspector,
- parameters.canHaveNonReboundConstructorInvoke(),
parameters.canUseNestBasedAccesses(),
true);
}
@@ -125,7 +123,6 @@
private void inspect(
ArtProfileInspector profileInspector,
CodeInspector inspector,
- boolean canHaveNonReboundConstructorInvoke,
boolean canUseNestBasedAccesses,
boolean isR8)
throws Exception {
@@ -135,7 +132,7 @@
ClassSubject syntheticConstructorArgumentClassSubject =
inspector.clazz(
SyntheticItemsTestUtils.syntheticNestConstructorArgumentClass(
- Reference.classFromClass(NestMember.class)));
+ Reference.classFromClass(Main.class)));
assertThat(
syntheticConstructorArgumentClassSubject, notIf(isPresent(), canUseNestBasedAccesses));
diff --git a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1 b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
index c5ef954..8779e19 100644
--- a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
+++ b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
@@ -1 +1 @@
-d50abf6c508c1332eb80f35f5631e99e2e8329b5
\ No newline at end of file
+5b02bd53b6df482392dbd41b04c137b0b3c99388
\ No newline at end of file
diff --git a/tools/desugar_jdk_libs_update.py b/tools/desugar_jdk_libs_update.py
index 3514cf8..d5282c7 100755
--- a/tools/desugar_jdk_libs_update.py
+++ b/tools/desugar_jdk_libs_update.py
@@ -52,13 +52,10 @@
print("Building desugared library")
bazel = os.path.join(utils.BAZEL_TOOL, 'lib', 'bazel', 'bin', 'bazel')
with utils.ChangedWorkingDirectory(checkout_dir):
- for target in [
- ':desugar_jdk_libs_jdk11', '//jdk11/src:java_base_chm_only'
- ]:
- subprocess.check_call([
- bazel, '--bazelrc=/dev/null', 'build',
- '--spawn_strategy=local', '--verbose_failures', target
- ])
+ subprocess.check_call([
+ bazel, '--bazelrc=/dev/null', 'build',
+ '--spawn_strategy=local', '--verbose_failures', ':desugar_jdk_libs_jdk11'
+ ])
openjdk_dir = join('third_party', 'openjdk')
openjdk_subdir = 'desugar_jdk_libs_11'
@@ -72,11 +69,9 @@
os.remove(join(openjdk_dir, openjdk_subdir + '.tar.gz'))
os.remove(join(openjdk_dir, openjdk_subdir + '.tar.gz.sha1'))
os.mkdir(dest_dir)
- for s in [(join(src_dir, 'd8_java_base_selected_with_addon.jar'),
- join(dest_dir, 'desugar_jdk_libs.jar')),
- (join(src_dir, 'java_base_chm_only.jar'),
- join(dest_dir, 'desugar_jdk_libs_chm_only.jar'))]:
- shutil.copyfile(s[0], s[1])
+ shutil.copyfile(
+ join(src_dir, 'd8_java_base_selected_with_addon.jar'),
+ join(dest_dir, 'desugar_jdk_libs.jar'))
for f in metadata_files:
shutil.copyfile(join(tmp_dir, f), join(dest_dir, f))
desugar_jdk_libs_hash = os.path.join(dest_dir, 'desugar_jdk_libs_hash')