Enable lir-to-lir desugaring in R8
Change-Id: I2f84369889c261782322d8ec1ab28a890014579c
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiModelingOptions.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiModelingOptions.java
index 813529f..6c61415 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiModelingOptions.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiModelingOptions.java
@@ -6,6 +6,7 @@
import static com.android.tools.r8.utils.CfUtils.extractClassDescriptor;
import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.references.ClassReference;
@@ -126,18 +127,26 @@
return isApiModelingEnabled() && options.isGeneratingDex() && enableOutliningOfMethods;
}
- public boolean isCfToCfApiOutliningEnabled() {
+ public boolean isCfToCfApiOutliningEnabled(AppView<?> appView) {
if (isOutliningOfMethodsEnabled()) {
- // Enable cf-to-cf when running normal D8/R8. When running R8 partial, enable cf-to-cf
- // desugaring when there is no library desugaring.
- return options.partialSubCompilationConfiguration == null
- || !options.getSubCompilationLibraryDesugaringOptions().isEnabled();
+ if (options.partialSubCompilationConfiguration != null) {
+ // When running R8 partial, enable cf-to-cf desugaring when there is no library desugaring.
+ return !options.getSubCompilationLibraryDesugaringOptions().isEnabled();
+ }
+ if (appView.enableWholeProgramOptimizations()) {
+ // When running R8, for consistency with R8 partial, enable cf-to-cf desugaring when there
+ // is no library desugaring.
+ return !options.getLibraryDesugaringOptions().isEnabled();
+ } else {
+ // Always use cf-to-cf desugaring in D8.
+ return true;
+ }
}
return false;
}
- public boolean isLirToLirApiOutliningEnabled() {
- return isOutliningOfMethodsEnabled() && !isCfToCfApiOutliningEnabled();
+ public boolean isLirToLirApiOutliningEnabled(AppView<?> appView) {
+ return isOutliningOfMethodsEnabled() && !isCfToCfApiOutliningEnabled(appView);
}
public boolean isCheckAllApiReferencesAreSet() {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
index b765ca4..9f1c7be 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
@@ -128,15 +128,15 @@
}
if (appView.enableWholeProgramOptimizations()) {
if (enqueuer != null) {
- return libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled();
+ return libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled(appView);
} else {
// We only reach here if we are running lir-to-lir library desugaring.
- assert libraryDesugaringOptions.isLirToLirLibraryDesugaringEnabled();
+ assert libraryDesugaringOptions.isLirToLirLibraryDesugaringEnabled(appView);
return true;
}
} else {
// Library desugaring is cf-to-cf in D8.
- assert libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled();
+ assert libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled(appView);
return true;
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
index 3bd73cf..cd2567f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
@@ -59,7 +59,7 @@
public static CfToCfApiInvokeOutlinerDesugaring createCfToCf(
AppView<?> appView, AndroidApiLevelCompute apiLevelCompute) {
- if (appView.options().apiModelingOptions().isCfToCfApiOutliningEnabled()) {
+ if (appView.options().apiModelingOptions().isCfToCfApiOutliningEnabled(appView)) {
return new CfToCfApiInvokeOutlinerDesugaring(appView, apiLevelCompute);
}
return null;
@@ -69,7 +69,7 @@
AppView<?> appView,
AndroidApiLevelCompute apiLevelCompute,
CfInstructionDesugaringEventConsumer eventConsumer) {
- if (appView.options().apiModelingOptions().isLirToLirApiOutliningEnabled()) {
+ if (appView.options().apiModelingOptions().isLirToLirApiOutliningEnabled(appView)) {
return new LirToLirApiInvokeOutlinerDesugaring(appView, apiLevelCompute, eventConsumer);
}
return null;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/LibraryDesugaringOptions.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/LibraryDesugaringOptions.java
index 0a6aa20..3f90327 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/LibraryDesugaringOptions.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/LibraryDesugaringOptions.java
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.desugar.desugaredlibrary;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
@@ -131,14 +132,14 @@
return !synthesizedClassPrefix.isEmpty();
}
- public boolean isCfToCfLibraryDesugaringEnabled() {
- return isEnabled() && !isLirToLirLibraryDesugaringEnabled();
+ public boolean isCfToCfLibraryDesugaringEnabled(AppView<?> appView) {
+ // Cf-to-cf library desugaring is always enabled in D8.
+ return isEnabled() && !appView.enableWholeProgramOptimizations();
}
- public boolean isLirToLirLibraryDesugaringEnabled() {
- return isEnabled()
- && options.partialSubCompilationConfiguration != null
- && options.partialSubCompilationConfiguration.isR8();
+ public boolean isLirToLirLibraryDesugaringEnabled(AppView<?> appView) {
+ // Lir-to-lir library desugaring is always enabled in R8 and R8 partial.
+ return isEnabled() && appView.enableWholeProgramOptimizations();
}
public void resetDesugaredLibrarySpecificationForTesting() {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/R8LibraryDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/R8LibraryDesugaring.java
index 9874af7..593c603 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/R8LibraryDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/R8LibraryDesugaring.java
@@ -58,12 +58,15 @@
throws ExecutionException {
InternalOptions options = appView.options();
if (options.isDesugaring()) {
- if (options.getLibraryDesugaringOptions().isEnabled()
- && options.getLibraryDesugaringOptions().isLirToLirLibraryDesugaringEnabled()
- && options.isGeneratingDex()) {
+ boolean needsApiModeling =
+ options.apiModelingOptions().isApiModelingEnabled()
+ && options.apiModelingOptions().isLirToLirApiOutliningEnabled(appView);
+ boolean needsLibraryDesugaring =
+ options.getLibraryDesugaringOptions().isEnabled()
+ && options.getLibraryDesugaringOptions().isLirToLirLibraryDesugaringEnabled(appView);
+ if (needsApiModeling || needsLibraryDesugaring) {
+ assert options.isGeneratingDex();
new R8LibraryDesugaring(appView).run(executorService, timing);
- } else {
- assert !appView.options().apiModelingOptions().isLirToLirApiOutliningEnabled();
}
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
index 837225a..7471f0c 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
@@ -77,7 +77,7 @@
InterfaceMethodRewriter interfaceMethodRewriter) {
LibraryDesugaringOptions libraryDesugaringOptions =
appView.options().getLibraryDesugaringOptions();
- if (libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled()
+ if (libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled(appView)
&& libraryDesugaringOptions.hasTypeRewriter()) {
return new CfToCfDesugaredLibraryApiConverter(
appView, interfaceMethodRewriter, precedingDesugarings);
@@ -91,7 +91,7 @@
InterfaceMethodRewriter interfaceMethodRewriter) {
LibraryDesugaringOptions libraryDesugaringOptions =
appView.options().getLibraryDesugaringOptions();
- if (libraryDesugaringOptions.isLirToLirLibraryDesugaringEnabled()
+ if (libraryDesugaringOptions.isLirToLirLibraryDesugaringEnabled(appView)
&& libraryDesugaringOptions.hasTypeRewriter()) {
return new LirToLirDesugaredLibraryApiConverter(
appView, eventConsumer, interfaceMethodRewriter);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
index 7f938a4..5c144af 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
@@ -28,14 +28,20 @@
public static CfToCfDesugaredLibraryDisableDesugarer createCfToCf(AppView<?> appView) {
return DesugaredLibraryDisableDesugarerHelper.shouldCreate(appView)
- && appView.options().getLibraryDesugaringOptions().isCfToCfLibraryDesugaringEnabled()
+ && appView
+ .options()
+ .getLibraryDesugaringOptions()
+ .isCfToCfLibraryDesugaringEnabled(appView)
? new CfToCfDesugaredLibraryDisableDesugarer(appView)
: null;
}
public static LirToLirDesugaredLibraryDisableDesugarer createLirToLir(AppView<?> appView) {
return DesugaredLibraryDisableDesugarerHelper.shouldCreate(appView)
- && appView.options().getLibraryDesugaringOptions().isLirToLirLibraryDesugaringEnabled()
+ && appView
+ .options()
+ .getLibraryDesugaringOptions()
+ .isLirToLirLibraryDesugaringEnabled(appView)
? new LirToLirDesugaredLibraryDisableDesugarer(appView)
: null;
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
index 4c31664..2a40cee 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
@@ -49,7 +49,7 @@
public static CfToCfDesugaredLibraryRetargeter createCfToCf(AppView<?> appView) {
LibraryDesugaringOptions libraryDesugaringOptions =
appView.options().getLibraryDesugaringOptions();
- if (libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled()
+ if (libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled(appView)
&& libraryDesugaringOptions.getMachineDesugaredLibrarySpecification().hasRetargeting()) {
return new CfToCfDesugaredLibraryRetargeter(appView);
}
@@ -60,7 +60,7 @@
AppView<?> appView, CfInstructionDesugaringEventConsumer eventConsumer) {
LibraryDesugaringOptions libraryDesugaringOptions =
appView.options().getLibraryDesugaringOptions();
- if (libraryDesugaringOptions.isLirToLirLibraryDesugaringEnabled()
+ if (libraryDesugaringOptions.isLirToLirLibraryDesugaringEnabled(appView)
&& libraryDesugaringOptions.getMachineDesugaredLibrarySpecification().hasRetargeting()) {
return new LirToLirDesugaredLibraryRetargeter(appView, eventConsumer);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
index aac75bc..cbe7634 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
@@ -46,6 +46,7 @@
import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
+import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.structural.Ordered;
import com.google.common.collect.ImmutableList;
import java.util.function.Predicate;
@@ -97,6 +98,22 @@
static InterfaceDesugaringSyntheticHelper createSubCompilationHelper(
AppView<?> appView, InterfaceMethodDesugaringMode desugaringMode) {
+ if (desugaringMode.isLibraryDesugaring()) {
+ // Don't create a sub compilation helper when library desugaring is already enabled.
+ // The sub compilation helper is only needed to tweak interface method desugaring when
+ // library desugaring is performed lir-to-lir.
+ return null;
+ }
+ InternalOptions options = appView.options();
+ if (!appView.enableWholeProgramOptimizations()
+ && options.partialSubCompilationConfiguration == null) {
+ // In D8 all desugaring runs cf-to-cf and we do not need to do anything.
+ return null;
+ }
+ // This is an R8 build or the D8 build of an R8 partial build. In this case, we tweak interface
+ // method desugaring using the library desugaring options.
+ assert options.partialSubCompilationConfiguration == null
+ || options.partialSubCompilationConfiguration.isD8();
LibraryDesugaringOptions libraryDesugaringOptions =
appView.options().getSubCompilationLibraryDesugaringOptions();
return new InterfaceDesugaringSyntheticHelper(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodDesugaringMode.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodDesugaringMode.java
index 33a822d..be84827 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodDesugaringMode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodDesugaringMode.java
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.desugar.itf;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.utils.InternalOptions;
public enum InterfaceMethodDesugaringMode {
@@ -18,14 +19,20 @@
// Desugaring is disabled.
NONE;
- public static InterfaceMethodDesugaringMode createCfToCf(InternalOptions options) {
+ public static InterfaceMethodDesugaringMode createCfToCf(AppView<?> appView) {
+ InternalOptions options = appView.options();
return create(
- options, true, options.getLibraryDesugaringOptions().isCfToCfLibraryDesugaringEnabled());
+ options,
+ true,
+ options.getLibraryDesugaringOptions().isCfToCfLibraryDesugaringEnabled(appView));
}
- public static InterfaceMethodDesugaringMode createLirToLir(InternalOptions options) {
+ public static InterfaceMethodDesugaringMode createLirToLir(AppView<?> appView) {
+ InternalOptions options = appView.options();
return create(
- options, false, options.getLibraryDesugaringOptions().isLirToLirLibraryDesugaringEnabled());
+ options,
+ false,
+ options.getLibraryDesugaringOptions().isLirToLirLibraryDesugaringEnabled(appView));
}
public static InterfaceMethodDesugaringMode createForInterfaceMethodDesugaringInRootSetBuilder(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index 280d710..65d9650 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -101,13 +101,8 @@
this.options = appView.options();
this.factory = appView.dexItemFactory();
this.helper = new InterfaceDesugaringSyntheticHelper(appView, desugaringMode);
- if (options.partialSubCompilationConfiguration != null
- && options.partialSubCompilationConfiguration.isD8()) {
- this.subCompilationHelper =
- InterfaceDesugaringSyntheticHelper.createSubCompilationHelper(appView, desugaringMode);
- } else {
- this.subCompilationHelper = null;
- }
+ this.subCompilationHelper =
+ InterfaceDesugaringSyntheticHelper.createSubCompilationHelper(appView, desugaringMode);
if (desugaringMode.isLibraryDesugaring()) {
initializeEmulatedInterfaceVariables();
@@ -120,7 +115,7 @@
Set<CfInstructionDesugaring> precedingDesugaringsForInvokeDynamic) {
return create(
appView,
- InterfaceMethodDesugaringMode.createCfToCf(appView.options()),
+ InterfaceMethodDesugaringMode.createCfToCf(appView),
precedingDesugaringsForInvoke,
precedingDesugaringsForInvokeDynamic);
}
@@ -128,7 +123,7 @@
public static LirToLirInterfaceMethodRewriter createLirToLir(
AppView<?> appView, CfInstructionDesugaringEventConsumer eventConsumer) {
InterfaceMethodDesugaringMode desugaringMode =
- InterfaceMethodDesugaringMode.createLirToLir(appView.options());
+ InterfaceMethodDesugaringMode.createLirToLir(appView);
return desugaringMode.isSome()
? new LirToLirInterfaceMethodRewriter(appView, desugaringMode, eventConsumer)
: null;
@@ -285,6 +280,12 @@
// We did not create this code yet, but it will not require rewriting.
return RetargetMethodSupplier.none();
}
+ if (holder.isLibraryClass()
+ && subCompilationHelper != null
+ && subCompilationHelper.isInDesugaredLibrary(holder)) {
+ // Defer desugaring of this invoke-static to lir-to-lir library desugaring.
+ return RetargetMethodSupplier.none();
+ }
if (isNonDesugaredLibraryClass(holder)) {
// NOTE: we intentionally don't desugar static calls into static interface
// methods coming from android.jar since it is only possible in case v24+
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
index 4c12b8f..40b386a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
@@ -65,13 +65,13 @@
public static InterfaceProcessor createCfToCf(AppView<?> appView) {
InterfaceMethodDesugaringMode desugaringMode =
- InterfaceMethodDesugaringMode.createCfToCf(appView.options());
+ InterfaceMethodDesugaringMode.createCfToCf(appView);
return create(appView, desugaringMode);
}
public static InterfaceProcessor createLirToLir(AppView<?> appView) {
InterfaceMethodDesugaringMode desugaringMode =
- InterfaceMethodDesugaringMode.createLirToLir(appView.options());
+ InterfaceMethodDesugaringMode.createLirToLir(appView);
return create(appView, desugaringMode);
}
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index f020f5c..ca00c0c 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -4498,7 +4498,10 @@
.dexItemFactory()
.forEachPossiblyCompilerSynthesizedType(this::recordCompilerSynthesizedTypeReference);
appView.rootSet().rootNonProgramTypes.forEach(this::recordCompilerSynthesizedTypeReference);
- if (appView.options().getLibraryDesugaringOptions().isLirToLirLibraryDesugaringEnabled()) {
+ if (appView
+ .options()
+ .getLibraryDesugaringOptions()
+ .isLirToLirLibraryDesugaringEnabled(appView)) {
appView
.options()
.getLibraryDesugaringOptions()
diff --git a/src/test/examplesJava9/desugaredlib/ProgramRewritingTest.java b/src/test/examplesJava9/desugaredlib/ProgramRewritingTest.java
index 3333f39..2d0c5ca 100644
--- a/src/test/examplesJava9/desugaredlib/ProgramRewritingTest.java
+++ b/src/test/examplesJava9/desugaredlib/ProgramRewritingTest.java
@@ -140,7 +140,7 @@
}
private void checkRewrittenInvokes(CodeInspector inspector) {
- if (parameters.getApiLevel().getLevel() >= AndroidApiLevel.N.getLevel()) {
+ if (parameters.canUseDefaultAndStaticInterfaceMethods()) {
return;
}
ClassSubject classSubject = inspector.clazz(TEST_CLASS);
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/ForceInlineConstructorWithRetargetedLibMemberTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/ForceInlineConstructorWithRetargetedLibMemberTest.java
index 4c11361..e0f24cd 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/ForceInlineConstructorWithRetargetedLibMemberTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/ForceInlineConstructorWithRetargetedLibMemberTest.java
@@ -1,13 +1,12 @@
// Copyright (c) 2020, 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 com.android.tools.r8.classmerging.vertical;
import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.R8_L8DEBUG;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsentIf;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.NeverClassInline;
@@ -22,14 +21,20 @@
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 ForceInlineConstructorWithRetargetedLibMemberTest extends DesugaredLibraryTestBase {
- private final TestParameters parameters;
- private final LibraryDesugaringSpecification libraryDesugaringSpecification;
- private final CompilationSpecification compilationSpecification;
+ @Parameter(0)
+ public TestParameters parameters;
+
+ @Parameter(1)
+ public LibraryDesugaringSpecification libraryDesugaringSpecification;
+
+ @Parameter(2)
+ public CompilationSpecification compilationSpecification;
@Parameters(name = "{0}, spec: {1}, {2}")
public static List<Object[]> data() {
@@ -39,15 +44,6 @@
ImmutableList.of(R8_L8DEBUG));
}
- public ForceInlineConstructorWithRetargetedLibMemberTest(
- TestParameters parameters,
- LibraryDesugaringSpecification libraryDesugaringSpecification,
- CompilationSpecification compilationSpecification) {
- this.parameters = parameters;
- this.libraryDesugaringSpecification = libraryDesugaringSpecification;
- this.compilationSpecification = compilationSpecification;
- }
-
@Test
public void test() throws Throwable {
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
@@ -55,12 +51,20 @@
.addKeepMainRule(TestClass.class)
.enableNeverClassInliningAnnotations()
.enableInliningAnnotations()
+ // Arrays#stream was introduced in API 24.
.addVerticallyMergedClassesInspector(
- inspector -> inspector.assertMergedIntoSubtype(A.class))
+ inspector ->
+ inspector
+ .applyIf(
+ parameters.canUseDefaultAndStaticInterfaceMethods(),
+ i -> i.assertMergedIntoSubtype(A.class))
+ .assertNoOtherClassesMerged())
.compile()
.inspect(
inspector -> {
- assertThat(inspector.clazz(A.class), not(isPresent()));
+ assertThat(
+ inspector.clazz(A.class),
+ isAbsentIf(parameters.canUseDefaultAndStaticInterfaceMethods()));
assertThat(inspector.clazz(B.class), isPresent());
});
}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
index ed5b42a..b472dd6 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
@@ -14,14 +14,11 @@
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.NoVerticalClassMerging;
-import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
-import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.utils.SetUtils;
import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.codeinspector.CheckCastInstructionSubject;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.InstructionSubject;
@@ -98,7 +95,6 @@
private void checkRewrittenInvokes(CodeInspector inspector) {
Set<String> expectedInvokeHolders;
Set<String> expectedCatchGuards;
- Set<String> expectedCheckCastType;
String expectedInstanceOfTypes;
boolean isR8 = compilationSpecification.isProgramShrink();
if (!libraryDesugaringSpecification.hasTimeDesugaring(parameters)) {
@@ -108,7 +104,6 @@
expectedInvokeHolders.add("java.time.ZoneOffset");
}
expectedCatchGuards = ImmutableSet.of("java.time.format.DateTimeParseException");
- expectedCheckCastType = ImmutableSet.of("java.time.ZoneId");
expectedInstanceOfTypes = "java.time.ZoneOffset";
} else {
expectedInvokeHolders =
@@ -117,7 +112,6 @@
expectedInvokeHolders.add("j$.time.ZoneOffset");
}
expectedCatchGuards = ImmutableSet.of("j$.time.format.DateTimeParseException");
- expectedCheckCastType = ImmutableSet.of("j$.time.ZoneId");
expectedInstanceOfTypes = "j$.time.ZoneOffset";
}
ClassSubject classSubject = inspector.clazz(TestClass.class);
@@ -132,13 +126,6 @@
.filter(holder -> holder.startsWith("j$.time.") || holder.startsWith("java.time."))
.collect(Collectors.toSet());
assertEquals(expectedInvokeHolders, foundInvokeHolders);
- main.streamInstructions()
- .filter(InstructionSubject::isCheckCast)
- .map(InstructionSubject::asCheckCast)
- .map(CheckCastInstructionSubject::getType)
- .map(DexType::toSourceString)
- .collect(Collectors.toSet())
- .equals(expectedCheckCastType);
assertEquals(
1,
main.streamInstructions().filter(io -> io.isInstanceOf(expectedInstanceOfTypes)).count());
@@ -149,10 +136,7 @@
.map(TypeSubject::toString)
.collect(Collectors.toSet());
assertEquals(expectedCatchGuards, foundCatchGuards);
- if (parameters
- .getApiLevel()
- .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
- && isR8) {
+ if (parameters.canUseDefaultAndStaticInterfaceMethodsWhenDesugaring() && isR8) {
String holder =
libraryDesugaringSpecification.hasTimeDesugaring(parameters)
? "j$.time.temporal.TemporalAccessor"
@@ -160,23 +144,17 @@
assertThat(
inspector.clazz(TemporalAccessorImplSub.class).uniqueMethodWithFinalName("query"),
invokesMethod(null, holder, "query", null));
+ } else if (!parameters.canUseDefaultAndStaticInterfaceMethodsWhenDesugaring() && isR8) {
+ assertThat(
+ inspector.clazz(TemporalAccessorImplSub.class).uniqueMethodWithFinalName("query"),
+ invokesMethod(null, "j$.time.temporal.TemporalAccessor$-CC", "$default$query", null));
} else {
- if (!parameters
- .getApiLevel()
- .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
- && isR8) {
- assertThat(
- inspector.clazz(TemporalAccessorImplSub.class).uniqueMethodWithFinalName("query"),
- invokesMethod(null, "j$.time.temporal.TemporalAccessor$-CC", "$default$query", null));
- } else {
- assertThat(
- inspector.clazz(TemporalAccessorImplSub.class).uniqueMethodWithFinalName("query"),
- invokesMethod(
- null, inspector.clazz(TemporalAccessorImpl.class).getFinalName(), "query", null));
- }
+ assertThat(
+ inspector.clazz(TemporalAccessorImplSub.class).uniqueMethodWithFinalName("query"),
+ invokesMethod(
+ null, inspector.clazz(TemporalAccessorImpl.class).getFinalName(), "query", null));
}
- if (parameters.canUseDefaultAndStaticInterfaceMethodsWhenDesugaring()
- || (isR8 && !compilationSpecification.isProgramShrinkWithPartial())) {
+ if (parameters.canUseDefaultAndStaticInterfaceMethodsWhenDesugaring()) {
assertThat(
inspector.clazz(TemporalAccessorImpl.class).uniqueMethodWithOriginalName("query"),
isAbsent());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java
index 89079d4..155cff7 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java
@@ -34,7 +34,7 @@
@Parameters(name = "{0}, spec: {1}, {2}")
public static List<Object[]> data() {
return buildParameters(
- getTestParameters().withDexRuntimes().withAllApiLevels().build(),
+ getTestParameters().withDexRuntimesAndAllApiLevels().build(),
getJdk8Jdk11(),
SPECIFICATIONS_WITH_CF2CF);
}
@@ -59,17 +59,13 @@
.applyIf(
!libraryDesugaringSpecification.hasJDollarFunction(parameters)
|| parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N)
- || (compilationSpecification.isProgramShrinkWithPartial()
+ || (compilationSpecification.isProgramShrink()
&& (parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V7_0_0)
|| libraryDesugaringSpecification == JDK11)),
r -> r.assertSuccessWithOutput(EXPECTED_RESULT),
r -> {
if (compilationSpecification.isProgramShrink()) {
- if (compilationSpecification.isProgramShrinkWithPartial()) {
- r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class);
- } else {
- r.assertFailureWithErrorThatThrows(NoSuchMethodError.class);
- }
+ r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class);
} else {
r.assertFailureWithErrorThatThrows(AbstractMethodError.class);
}