Revert "Add api reference level to method optimization info"
This reverts commit 015b2bcc24d52e39f9e1455af3e2cb4e9647449a.
Reason for revert: Not checking for enabled api level :)
Change-Id: Ie76c6881e45aa004907ea24cf16541409c0c490b
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 1cd35e6..7c26ce2 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -56,7 +56,6 @@
import com.android.tools.r8.ir.optimize.NestUtils;
import com.android.tools.r8.ir.optimize.info.CallSiteOptimizationInfo;
import com.android.tools.r8.ir.optimize.info.DefaultMethodOptimizationInfo;
-import com.android.tools.r8.ir.optimize.info.DefaultMethodOptimizationWithMinApiInfo;
import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
import com.android.tools.r8.ir.optimize.info.UpdatableMethodOptimizationInfo;
@@ -1456,7 +1455,10 @@
public synchronized UpdatableMethodOptimizationInfo getMutableOptimizationInfo() {
checkIfObsolete();
- return optimizationInfo.asUpdatableMethodOptimizationInfo();
+ if (optimizationInfo == DefaultMethodOptimizationInfo.DEFAULT_INSTANCE) {
+ optimizationInfo = optimizationInfo.mutableCopy();
+ }
+ return (UpdatableMethodOptimizationInfo) optimizationInfo;
}
public void setOptimizationInfo(UpdatableMethodOptimizationInfo info) {
@@ -1464,11 +1466,6 @@
optimizationInfo = info;
}
- public void setMinApiOptimizationInfo(DefaultMethodOptimizationWithMinApiInfo info) {
- checkIfObsolete();
- optimizationInfo = info;
- }
-
public synchronized void abandonCallSiteOptimizationInfo() {
checkIfObsolete();
callSiteOptimizationInfo = CallSiteOptimizationInfo.abandoned();
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index 646c9a0..7d95e87 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -29,12 +29,10 @@
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.ir.desugar.LambdaClass;
import com.android.tools.r8.kotlin.Kotlin;
-import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.utils.ArrayUtils;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.IterableUtils;
import com.android.tools.r8.utils.LRUCacheTable;
-import com.android.tools.r8.utils.ListUtils;
import com.google.common.base.Strings;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
@@ -2500,22 +2498,6 @@
return createMethod(holder, proto, createString(name));
}
- public DexMethod createMethod(MethodReference methodReference) {
- DexString[] formals = new DexString[methodReference.getFormalTypes().size()];
- ListUtils.forEachWithIndex(
- methodReference.getFormalTypes(),
- (formal, index) -> {
- formals[index] = createString(formal.getDescriptor());
- });
- return createMethod(
- createString(methodReference.getHolderClass().getDescriptor()),
- createString(methodReference.getMethodName()),
- methodReference.getReturnType() == null
- ? voidDescriptor
- : createString(methodReference.getReturnType().getDescriptor()),
- formals);
- }
-
public DexMethodHandle createMethodHandle(
MethodHandleType type,
DexMember<? extends DexItem, ? extends DexMember<?, ?>> fieldOrMethod,
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java
index f8aae86..17758fa 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java
@@ -11,16 +11,13 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.analysis.proto.schema.ProtoEnqueuerExtension;
import com.android.tools.r8.shaking.DefaultEnqueuerUseRegistry;
import com.android.tools.r8.shaking.Enqueuer;
import com.android.tools.r8.shaking.EnqueuerUseRegistryFactory;
-import com.android.tools.r8.utils.AndroidApiLevel;
import java.util.ListIterator;
-import java.util.Map;
public class ProtoEnqueuerUseRegistry extends DefaultEnqueuerUseRegistry {
@@ -31,9 +28,8 @@
public ProtoEnqueuerUseRegistry(
AppView<? extends AppInfoWithClassHierarchy> appView,
ProgramMethod currentMethod,
- Enqueuer enqueuer,
- Map<DexReference, AndroidApiLevel> apiLevelReferenceMap) {
- super(appView, currentMethod, enqueuer, apiLevelReferenceMap);
+ Enqueuer enqueuer) {
+ super(appView, currentMethod, enqueuer);
this.references = appView.protoShrinker().references;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index ececbe3..8e66601 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.optimize;
-import static com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo.isApiSafeForInlining;
import static com.android.tools.r8.ir.optimize.inliner.InlinerUtils.addMonitorEnterValue;
import static com.android.tools.r8.ir.optimize.inliner.InlinerUtils.collectAllMonitorEnterValues;
@@ -34,7 +33,6 @@
import com.android.tools.r8.ir.optimize.Inliner.InlineAction;
import com.android.tools.r8.ir.optimize.Inliner.InlineeWithReason;
import com.android.tools.r8.ir.optimize.Inliner.Reason;
-import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.inliner.InliningReasonStrategy;
import com.android.tools.r8.ir.optimize.inliner.WhyAreYouNotInliningReporter;
@@ -123,22 +121,11 @@
Reason reason,
WhyAreYouNotInliningReporter whyAreYouNotInliningReporter) {
DexEncodedMethod singleTargetMethod = singleTarget.getDefinition();
- MethodOptimizationInfo targetOptimizationInfo = singleTargetMethod.getOptimizationInfo();
- if (targetOptimizationInfo.neverInline()) {
+ if (singleTargetMethod.getOptimizationInfo().neverInline()) {
whyAreYouNotInliningReporter.reportMarkedAsNeverInline();
return false;
}
- // Do not inline if the inlinee is greater than the api caller level.
- MethodOptimizationInfo callerOptimizationInfo = method.getDefinition().getOptimizationInfo();
- // TODO(b/188498051): We should not force inline lower api method calls.
- if (reason != Reason.FORCE
- && isApiSafeForInlining(callerOptimizationInfo, targetOptimizationInfo, appView.options())
- .isPossiblyFalse()) {
- whyAreYouNotInliningReporter.reportInlineeHigherApiCall();
- return false;
- }
-
// We don't inline into constructors when producing class files since this can mess up
// the stackmap, see b/136250031
if (method.getDefinition().isInstanceInitializer()
@@ -151,7 +138,7 @@
if (method.getDefinition() == singleTargetMethod) {
// Cannot handle recursive inlining at this point.
// Force inlined method should never be recursive.
- assert !targetOptimizationInfo.forceInline();
+ assert !singleTargetMethod.getOptimizationInfo().forceInline();
whyAreYouNotInliningReporter.reportRecursiveMethod();
return false;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java
index 2b7ef1a..d49189f 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java
@@ -16,7 +16,6 @@
import com.android.tools.r8.ir.optimize.info.bridge.BridgeInfo;
import com.android.tools.r8.ir.optimize.info.initializer.DefaultInstanceInitializerInfo;
import com.android.tools.r8.ir.optimize.info.initializer.InstanceInitializerInfo;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableSet;
import java.util.BitSet;
import java.util.Set;
@@ -39,9 +38,8 @@
static boolean UNKNOWN_RETURN_VALUE_ONLY_DEPENDS_ON_ARGUMENTS = false;
static BitSet NO_NULL_PARAMETER_OR_THROW_FACTS = null;
static BitSet NO_NULL_PARAMETER_ON_NORMAL_EXITS_FACTS = null;
- static AndroidApiLevel UNKNOWN_API_REFERENCE_LEVEL = null;
- protected DefaultMethodOptimizationInfo() {}
+ private DefaultMethodOptimizationInfo() {}
public static DefaultMethodOptimizationInfo getInstance() {
return DEFAULT_INSTANCE;
@@ -59,7 +57,7 @@
@Override
public UpdatableMethodOptimizationInfo asUpdatableMethodOptimizationInfo() {
- return mutableCopy();
+ return null;
}
@Override
@@ -194,16 +192,6 @@
}
@Override
- public AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApi) {
- return UNKNOWN_API_REFERENCE_LEVEL;
- }
-
- @Override
- public boolean hasApiReferenceLevel() {
- return false;
- }
-
- @Override
public UpdatableMethodOptimizationInfo mutableCopy() {
return new UpdatableMethodOptimizationInfo();
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationWithMinApiInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationWithMinApiInfo.java
deleted file mode 100644
index fc61ba6..0000000
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationWithMinApiInfo.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2021, 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.ir.optimize.info;
-
-import com.android.tools.r8.utils.AndroidApiLevel;
-
-public class DefaultMethodOptimizationWithMinApiInfo extends DefaultMethodOptimizationInfo {
-
- private static final DefaultMethodOptimizationWithMinApiInfo DEFAULT_MIN_API_INSTANCE =
- new DefaultMethodOptimizationWithMinApiInfo();
-
- public static DefaultMethodOptimizationWithMinApiInfo getInstance() {
- return DEFAULT_MIN_API_INSTANCE;
- }
-
- @Override
- public boolean hasApiReferenceLevel() {
- return true;
- }
-
- @Override
- public AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApi) {
- return minApi;
- }
-
- @Override
- public UpdatableMethodOptimizationInfo mutableCopy() {
- UpdatableMethodOptimizationInfo updatableMethodOptimizationInfo = super.mutableCopy();
- // Use null to specify that the min api is set to minApi.
- updatableMethodOptimizationInfo.setApiReferenceLevel(null);
- return updatableMethodOptimizationInfo;
- }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java
index c006e6c..bdc35f3 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java
@@ -4,8 +4,6 @@
package com.android.tools.r8.ir.optimize.info;
-import static com.android.tools.r8.utils.OptionalBool.UNKNOWN;
-
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.analysis.inlining.SimpleInliningConstraint;
import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
@@ -15,9 +13,6 @@
import com.android.tools.r8.ir.optimize.classinliner.constraint.ClassInlinerMethodConstraint;
import com.android.tools.r8.ir.optimize.info.bridge.BridgeInfo;
import com.android.tools.r8.ir.optimize.info.initializer.InstanceInitializerInfo;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.OptionalBool;
import java.util.BitSet;
import java.util.Set;
@@ -100,20 +95,5 @@
public abstract boolean returnValueHasBeenPropagated();
- public abstract AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApi);
-
- public abstract boolean hasApiReferenceLevel();
-
public abstract UpdatableMethodOptimizationInfo mutableCopy();
-
- public static OptionalBool isApiSafeForInlining(
- MethodOptimizationInfo caller, MethodOptimizationInfo inlinee, InternalOptions options) {
- if (!caller.hasApiReferenceLevel() || !inlinee.hasApiReferenceLevel()) {
- return UNKNOWN;
- }
- return OptionalBool.of(
- caller
- .getApiReferenceLevel(options.minApiLevel)
- .isGreaterThanOrEqualTo(inlinee.getApiReferenceLevel(options.minApiLevel)));
- }
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
index 85e2576..0d2e43b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
@@ -22,10 +22,8 @@
import com.android.tools.r8.ir.optimize.info.initializer.InstanceInitializerInfo;
import com.android.tools.r8.ir.optimize.info.initializer.InstanceInitializerInfoCollection;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import java.util.BitSet;
-import java.util.Optional;
import java.util.Set;
public class UpdatableMethodOptimizationInfo extends MethodOptimizationInfo {
@@ -68,8 +66,6 @@
private SimpleInliningConstraint simpleInliningConstraint =
NeverSimpleInliningConstraint.getInstance();
- private Optional<AndroidApiLevel> apiReferenceLevel = null;
-
// To reduce the memory footprint of UpdatableMethodOptimizationInfo, all the boolean fields are
// merged into a flag int field. The various static final FLAG fields indicate which bit is
// used by each boolean. DEFAULT_FLAGS encodes the default value for efficient instantiation and
@@ -150,7 +146,6 @@
nonNullParamOrThrow = template.nonNullParamOrThrow;
nonNullParamOnNormalExits = template.nonNullParamOnNormalExits;
classInlinerConstraint = template.classInlinerConstraint;
- apiReferenceLevel = template.apiReferenceLevel;
}
public UpdatableMethodOptimizationInfo fixupClassTypeReferences(
@@ -500,23 +495,6 @@
}
@Override
- public AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApi) {
- assert hasApiReferenceLevel();
- return apiReferenceLevel.orElse(minApi);
- }
-
- @SuppressWarnings("OptionalAssignedToNull")
- @Override
- public boolean hasApiReferenceLevel() {
- return apiReferenceLevel != null;
- }
-
- public UpdatableMethodOptimizationInfo setApiReferenceLevel(AndroidApiLevel apiReferenceLevel) {
- this.apiReferenceLevel = Optional.ofNullable(apiReferenceLevel);
- return this;
- }
-
- @Override
public UpdatableMethodOptimizationInfo mutableCopy() {
return new UpdatableMethodOptimizationInfo(this);
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/NopWhyAreYouNotInliningReporter.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/NopWhyAreYouNotInliningReporter.java
index 218a8fc..e398dce 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/NopWhyAreYouNotInliningReporter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/NopWhyAreYouNotInliningReporter.java
@@ -58,9 +58,6 @@
public void reportInlineeNotSimple() {}
@Override
- public void reportInlineeHigherApiCall() {}
-
- @Override
public void reportInlineeRefersToClassesNotInMainDex() {}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporter.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporter.java
index 8063674..81c6a35 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporter.java
@@ -69,8 +69,6 @@
public abstract void reportInlineeNotSimple();
- public abstract void reportInlineeHigherApiCall();
-
public abstract void reportInlineeRefersToClassesNotInMainDex();
public abstract void reportInliningAcrossFeatureSplit();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporterImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporterImpl.java
index f9418b4..257cc15 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporterImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporterImpl.java
@@ -120,11 +120,6 @@
}
@Override
- public void reportInlineeHigherApiCall() {
- print("inlinee having a higher api call than caller context.");
- }
-
- @Override
public void reportInlineeRefersToClassesNotInMainDex() {
print(
"inlining could increase the main dex size "
diff --git a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
index cb49580..f8302d7 100644
--- a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
@@ -13,33 +13,25 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexMethodHandle;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.utils.AndroidApiLevel;
import java.util.ListIterator;
-import java.util.Map;
public class DefaultEnqueuerUseRegistry extends UseRegistry {
protected final AppView<? extends AppInfoWithClassHierarchy> appView;
private final ProgramMethod context;
protected final Enqueuer enqueuer;
- private final Map<DexReference, AndroidApiLevel> apiReferenceMapping;
- private AndroidApiLevel maxApiReferenceLevel;
public DefaultEnqueuerUseRegistry(
AppView<? extends AppInfoWithClassHierarchy> appView,
ProgramMethod context,
- Enqueuer enqueuer,
- Map<DexReference, AndroidApiLevel> apiReferenceMapping) {
+ Enqueuer enqueuer) {
super(appView.dexItemFactory());
this.appView = appView;
this.context = context;
this.enqueuer = enqueuer;
- this.apiReferenceMapping = apiReferenceMapping;
- this.maxApiReferenceLevel = appView.options().minApiLevel;
}
public ProgramMethod getContext() {
@@ -61,31 +53,26 @@
@Override
public void registerInvokeVirtual(DexMethod invokedMethod) {
- setMaxApiReferenceLevel(invokedMethod);
enqueuer.traceInvokeVirtual(invokedMethod, context);
}
@Override
public void registerInvokeDirect(DexMethod invokedMethod) {
- setMaxApiReferenceLevel(invokedMethod);
enqueuer.traceInvokeDirect(invokedMethod, context);
}
@Override
public void registerInvokeStatic(DexMethod invokedMethod) {
- setMaxApiReferenceLevel(invokedMethod);
enqueuer.traceInvokeStatic(invokedMethod, context);
}
@Override
public void registerInvokeInterface(DexMethod invokedMethod) {
- setMaxApiReferenceLevel(invokedMethod);
enqueuer.traceInvokeInterface(invokedMethod, context);
}
@Override
public void registerInvokeSuper(DexMethod invokedMethod) {
- setMaxApiReferenceLevel(invokedMethod);
enqueuer.traceInvokeSuper(invokedMethod, context);
}
@@ -171,14 +158,4 @@
super.registerCallSite(callSite);
enqueuer.traceCallSite(callSite, context);
}
-
- private void setMaxApiReferenceLevel(DexMethod invokedMethod) {
- this.maxApiReferenceLevel =
- maxApiReferenceLevel.max(
- apiReferenceMapping.getOrDefault(invokedMethod, maxApiReferenceLevel));
- }
-
- public AndroidApiLevel getMaxApiReferenceLevel() {
- return maxApiReferenceLevel;
- }
}
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 6d9bc15..f6d9e6e 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -102,8 +102,6 @@
import com.android.tools.r8.ir.desugar.DesugaredLibraryAPIConverter;
import com.android.tools.r8.ir.desugar.LambdaClass;
import com.android.tools.r8.ir.desugar.LambdaDescriptor;
-import com.android.tools.r8.ir.optimize.info.DefaultMethodOptimizationInfo;
-import com.android.tools.r8.ir.optimize.info.DefaultMethodOptimizationWithMinApiInfo;
import com.android.tools.r8.kotlin.KotlinMetadataEnqueuerExtension;
import com.android.tools.r8.logging.Log;
import com.android.tools.r8.naming.identifiernamestring.IdentifierNameStringLookupResult;
@@ -122,7 +120,6 @@
import com.android.tools.r8.shaking.ScopedDexMethodSet.AddMethodIfMoreVisibleResult;
import com.android.tools.r8.synthesis.SyntheticItems.SynthesizingContextOracle;
import com.android.tools.r8.utils.Action;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.IteratorUtils;
import com.android.tools.r8.utils.ListUtils;
@@ -257,8 +254,6 @@
private final Set<DexReference> identifierNameStrings = Sets.newIdentityHashSet();
- private final Map<DexReference, AndroidApiLevel> referenceToApiLevelMap;
-
/**
* Tracks the dependency between a method and the super-method it calls, if any. Used to make
* super methods become live when they become reachable from a live sub-method.
@@ -468,17 +463,6 @@
} else {
desugaredLibraryWrapperAnalysis = null;
}
- referenceToApiLevelMap = new IdentityHashMap<>();
- if (options.apiModelingOptions().enableApiCallerIdentification) {
- options
- .apiModelingOptions()
- .methodApiMapping
- .forEach(
- (methodReference, apiLevel) -> {
- referenceToApiLevelMap.put(
- options.dexItemFactory().createMethod(methodReference), apiLevel);
- });
- }
}
private AppInfoWithClassHierarchy appInfo() {
@@ -3911,22 +3895,7 @@
}
void traceCode(ProgramMethod method) {
- DefaultEnqueuerUseRegistry registry =
- useRegistryFactory.create(appView, method, this, referenceToApiLevelMap);
- method.registerCodeReferences(registry);
- DexEncodedMethod methodDefinition = method.getDefinition();
- AndroidApiLevel maxApiReferenceLevel = registry.getMaxApiReferenceLevel();
- assert maxApiReferenceLevel.isGreaterThanOrEqualTo(options.minApiLevel);
- // To not have mutable update information for all methods that all has min api level we
- // swap the default optimization info for one with that marks the api level to be min api.
- if (methodDefinition.getOptimizationInfo() == DefaultMethodOptimizationInfo.getInstance()
- && maxApiReferenceLevel == options.minApiLevel) {
- methodDefinition.setMinApiOptimizationInfo(
- DefaultMethodOptimizationWithMinApiInfo.getInstance());
- return;
- }
- methodDefinition.setOptimizationInfo(
- methodDefinition.getMutableOptimizationInfo().setApiReferenceLevel(maxApiReferenceLevel));
+ method.registerCodeReferences(useRegistryFactory.create(appView, method, this));
}
private void checkMemberForSoftPinning(ProgramMember<?, ?> member) {
diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerUseRegistryFactory.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerUseRegistryFactory.java
index 6bd8473..c15f8d7 100644
--- a/src/main/java/com/android/tools/r8/shaking/EnqueuerUseRegistryFactory.java
+++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerUseRegistryFactory.java
@@ -6,16 +6,13 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import java.util.Map;
+import com.android.tools.r8.graph.UseRegistry;
public interface EnqueuerUseRegistryFactory {
- DefaultEnqueuerUseRegistry create(
+ UseRegistry create(
AppView<? extends AppInfoWithClassHierarchy> appView,
ProgramMethod currentMethod,
- Enqueuer enqueuer,
- Map<DexReference, AndroidApiLevel> apiLevelReferenceMap);
+ Enqueuer enqueuer);
}
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 0263e28..de01d36 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -348,6 +348,9 @@
// Contain the contents of the build properties file from the compiler command.
public DumpOptions dumpOptions;
+ // A mapping from methods to the api-level introducing them.
+ public Map<MethodReference, AndroidApiLevel> methodApiMapping = new HashMap<>();
+
// Hidden marker for classes.dex
private boolean hasMarker = false;
private Marker marker;
@@ -672,7 +675,6 @@
private final ProtoShrinkingOptions protoShrinking = new ProtoShrinkingOptions();
private final KotlinOptimizationOptions kotlinOptimizationOptions =
new KotlinOptimizationOptions();
- private final ApiModelTestingOptions apiModelTestingOptions = new ApiModelTestingOptions();
private final DesugarSpecificOptions desugarSpecificOptions = new DesugarSpecificOptions();
public final TestingOptions testing = new TestingOptions();
@@ -705,10 +707,6 @@
return kotlinOptimizationOptions;
}
- public ApiModelTestingOptions apiModelingOptions() {
- return apiModelTestingOptions;
- }
-
public DesugarSpecificOptions desugarSpecificOptions() {
return desugarSpecificOptions;
}
@@ -1292,14 +1290,6 @@
}
}
- public static class ApiModelTestingOptions {
-
- // A mapping from methods to the api-level introducing them.
- public Map<MethodReference, AndroidApiLevel> methodApiMapping = new HashMap<>();
-
- public boolean enableApiCallerIdentification = false;
- }
-
public static class ProtoShrinkingOptions {
public boolean enableGeneratedExtensionRegistryShrinking = false;
diff --git a/src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java b/src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java
deleted file mode 100644
index 4e5c39d..0000000
--- a/src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) 2021, 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.apimodeling;
-
-import static com.android.tools.r8.apimodeling.ApiModelingTestHelper.setMockApiLevelForMethod;
-import static com.android.tools.r8.apimodeling.ApiModelingTestHelper.verifyThat;
-
-import com.android.tools.r8.NeverInline;
-import com.android.tools.r8.NoHorizontalClassMerging;
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import java.lang.reflect.Method;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class ApiModelNoInliningOfHigherApiLevelInterfaceTest extends TestBase {
-
- private final TestParameters parameters;
-
- @Parameters(name = "{0}")
- public static TestParametersCollection data() {
- return getTestParameters().withAllRuntimes().withAllApiLevels().build();
- }
-
- public ApiModelNoInliningOfHigherApiLevelInterfaceTest(TestParameters parameters) {
- this.parameters = parameters;
- }
-
- @Test
- public void testR8() throws Exception {
- Method apiMethod = Api.class.getDeclaredMethod("apiLevel22");
- Method apiCaller = ApiCaller.class.getDeclaredMethod("callInterfaceMethod", Api.class);
- Method apiCallerCaller = A.class.getDeclaredMethod("noApiCall");
- testForR8(parameters.getBackend())
- .addProgramClasses(Main.class, A.class, ApiCaller.class)
- .addLibraryClasses(Api.class)
- .addDefaultRuntimeLibrary(parameters)
- .setMinApi(parameters.getApiLevel())
- .addKeepMainRule(Main.class)
- .enableInliningAnnotations()
- .enableNoHorizontalClassMergingAnnotations()
- .apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.L_MR1))
- .apply(ApiModelingTestHelper::enableApiCallerIdentification)
- .run(parameters.getRuntime(), Main.class)
- .assertSuccessWithOutputLines("A::noApiCall", "ApiCaller::callInterfaceMethod")
- .inspect(
- verifyThat(parameters, apiCaller)
- .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1));
- }
-
- public interface Api {
-
- void apiLevel22();
- }
-
- @NoHorizontalClassMerging
- public static class ApiCaller {
-
- public static void callInterfaceMethod(Api api) {
- System.out.println("ApiCaller::callInterfaceMethod");
- if (api != null) {
- api.apiLevel22();
- }
- }
- }
-
- @NoHorizontalClassMerging
- public static class A {
-
- @NeverInline
- public static void noApiCall() {
- System.out.println("A::noApiCall");
- ApiCaller.callInterfaceMethod(null);
- }
- }
-
- public static class Main {
-
- public static void main(String[] args) {
- A.noApiCall();
- }
- }
-}
diff --git a/src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelInterfaceTest.java b/src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelInterfaceTest.java
new file mode 100644
index 0000000..e56d36e
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelInterfaceTest.java
@@ -0,0 +1,102 @@
+// Copyright (c) 2021, 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.apimodeling;
+
+import static com.android.tools.r8.apimodeling.ApiModelingTestHelper.setMockApiLevelForMethod;
+import static com.android.tools.r8.apimodeling.ApiModelingTestHelper.verifyThat;
+import static org.junit.Assert.assertThrows;
+
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.NoHorizontalClassMerging;
+import com.android.tools.r8.R8TestRunResult;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import java.lang.reflect.Method;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class ApiModelingNoInliningOfHigherApiLevelInterfaceTest extends TestBase {
+
+ private final TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
+ }
+
+ public ApiModelingNoInliningOfHigherApiLevelInterfaceTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ Method apiMethod = Api.class.getDeclaredMethod("apiLevel22");
+ Method apiCaller = ApiCaller.class.getDeclaredMethod("callInterfaceMethod", Api.class);
+ Method apiCallerCaller = A.class.getDeclaredMethod("noApiCall");
+ R8TestRunResult runResult =
+ testForR8(parameters.getBackend())
+ .addProgramClasses(Main.class, A.class, ApiCaller.class)
+ .addLibraryClasses(Api.class)
+ .addDefaultRuntimeLibrary(parameters)
+ .setMinApi(parameters.getApiLevel())
+ .addKeepMainRule(Main.class)
+ .enableInliningAnnotations()
+ .enableNoHorizontalClassMergingAnnotations()
+ .apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.L_MR1))
+ .run(parameters.getRuntime(), Main.class)
+ .assertSuccessWithOutputLines("A::noApiCall", "ApiCaller::callInterfaceMethod");
+ if (parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.L_MR1)) {
+ runResult.inspect(
+ verifyThat(parameters, apiCaller)
+ .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1));
+ } else {
+ // TODO(b/188388130): Should only inline on minApi >= 22.
+ assertThrows(
+ AssertionError.class,
+ () ->
+ runResult.inspect(
+ verifyThat(parameters, apiCaller)
+ .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1)));
+ }
+ }
+
+ public interface Api {
+
+ void apiLevel22();
+ }
+
+ @NoHorizontalClassMerging
+ public static class ApiCaller {
+
+ public static void callInterfaceMethod(Api api) {
+ System.out.println("ApiCaller::callInterfaceMethod");
+ if (api != null) {
+ api.apiLevel22();
+ }
+ }
+ }
+
+ @NoHorizontalClassMerging
+ public static class A {
+
+ @NeverInline
+ public static void noApiCall() {
+ System.out.println("A::noApiCall");
+ ApiCaller.callInterfaceMethod(null);
+ }
+ }
+
+ public static class Main {
+
+ public static void main(String[] args) {
+ A.noApiCall();
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelIntoLowerDirectTest.java b/src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelIntoLowerDirectTest.java
similarity index 88%
rename from src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelIntoLowerDirectTest.java
rename to src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelIntoLowerDirectTest.java
index 048874d..174dcf7 100644
--- a/src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelIntoLowerDirectTest.java
+++ b/src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelIntoLowerDirectTest.java
@@ -20,16 +20,16 @@
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
-public class ApiModelNoInliningOfHigherApiLevelIntoLowerDirectTest extends TestBase {
+public class ApiModelingNoInliningOfHigherApiLevelIntoLowerDirectTest extends TestBase {
private final TestParameters parameters;
@Parameters(name = "{0}")
public static TestParametersCollection data() {
- return getTestParameters().withAllRuntimesAndApiLevels().build();
+ return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
}
- public ApiModelNoInliningOfHigherApiLevelIntoLowerDirectTest(TestParameters parameters) {
+ public ApiModelingNoInliningOfHigherApiLevelIntoLowerDirectTest(TestParameters parameters) {
this.parameters = parameters;
}
@@ -45,7 +45,6 @@
.enableNoHorizontalClassMergingAnnotations()
.apply(setMockApiLevelForMethod(apiLevel21, AndroidApiLevel.L))
.apply(setMockApiLevelForMethod(apiLevel22, AndroidApiLevel.L_MR1))
- .apply(ApiModelingTestHelper::enableApiCallerIdentification)
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines("A::apiLevel21", "B::apiLevel22")
.inspect(verifyThat(parameters, apiLevel22).inlinedInto(apiLevel21));
diff --git a/src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelStaticTest.java b/src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelStaticTest.java
similarity index 72%
rename from src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelStaticTest.java
rename to src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelStaticTest.java
index dfb8628..7130631 100644
--- a/src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelStaticTest.java
+++ b/src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelStaticTest.java
@@ -6,6 +6,7 @@
import static com.android.tools.r8.apimodeling.ApiModelingTestHelper.setMockApiLevelForMethod;
import static com.android.tools.r8.apimodeling.ApiModelingTestHelper.verifyThat;
+import static org.junit.Assert.assertThrows;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.NoHorizontalClassMerging;
@@ -20,16 +21,16 @@
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
-public class ApiModelNoInliningOfHigherApiLevelStaticTest extends TestBase {
+public class ApiModelingNoInliningOfHigherApiLevelStaticTest extends TestBase {
private final TestParameters parameters;
@Parameters(name = "{0}")
public static TestParametersCollection data() {
- return getTestParameters().withAllRuntimesAndApiLevels().build();
+ return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
}
- public ApiModelNoInliningOfHigherApiLevelStaticTest(TestParameters parameters) {
+ public ApiModelingNoInliningOfHigherApiLevelStaticTest(TestParameters parameters) {
this.parameters = parameters;
}
@@ -47,11 +48,23 @@
.enableInliningAnnotations()
.enableNoHorizontalClassMergingAnnotations()
.apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.L_MR1))
- .apply(ApiModelingTestHelper::enableApiCallerIdentification)
.compile()
.inspect(
- verifyThat(parameters, apiCaller)
- .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1))
+ inspector -> {
+ if (parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.L_MR1)) {
+ verifyThat(parameters, apiCaller)
+ .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1)
+ .accept(inspector);
+ } else {
+ // TODO(b/188388130): Should only inline on minApi >= 22.
+ assertThrows(
+ AssertionError.class,
+ () ->
+ verifyThat(parameters, apiCaller)
+ .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1)
+ .accept(inspector));
+ }
+ })
.addRunClasspathClasses(Api.class)
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines(
diff --git a/src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelSuperTest.java b/src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelSuperTest.java
similarity index 74%
rename from src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelSuperTest.java
rename to src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelSuperTest.java
index 415a163..7f96dbc9 100644
--- a/src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelSuperTest.java
+++ b/src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelSuperTest.java
@@ -6,11 +6,11 @@
import static com.android.tools.r8.apimodeling.ApiModelingTestHelper.setMockApiLevelForMethod;
import static com.android.tools.r8.apimodeling.ApiModelingTestHelper.verifyThat;
+import static org.junit.Assert.assertThrows;
import com.android.tools.r8.NeverClassInline;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.NoHorizontalClassMerging;
-import com.android.tools.r8.NoVerticalClassMerging;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
@@ -22,7 +22,7 @@
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
-public class ApiModelNoInliningOfHigherApiLevelSuperTest extends TestBase {
+public class ApiModelingNoInliningOfHigherApiLevelSuperTest extends TestBase {
private final TestParameters parameters;
@@ -31,7 +31,7 @@
return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
}
- public ApiModelNoInliningOfHigherApiLevelSuperTest(TestParameters parameters) {
+ public ApiModelingNoInliningOfHigherApiLevelSuperTest(TestParameters parameters) {
this.parameters = parameters;
}
@@ -47,19 +47,30 @@
.enableInliningAnnotations()
.enableNoHorizontalClassMergingAnnotations()
.enableNeverClassInliningAnnotations()
- .enableNoVerticalClassMergingAnnotations()
.apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.L_MR1))
- .apply(ApiModelingTestHelper::enableApiCallerIdentification)
.compile()
.inspect(
- verifyThat(parameters, apiCaller)
- .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1))
+ inspector -> {
+ if (parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.L_MR1)) {
+ verifyThat(parameters, apiCaller)
+ .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1)
+ .accept(inspector);
+ } else {
+ // TODO(b/188388130): Should only inline on minApi >= 22.
+ assertThrows(
+ AssertionError.class,
+ () ->
+ verifyThat(parameters, apiCaller)
+ .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1)
+ .accept(inspector));
+ }
+ })
.addRunClasspathClasses(Api.class)
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines("A::noApiCall", "ApiCaller::apiLevel22", "Api::apiLevel22");
}
- @NoVerticalClassMerging
+ @NoHorizontalClassMerging
public static class Api {
void apiLevel22() {
diff --git a/src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelVirtualTest.java b/src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelVirtualTest.java
similarity index 70%
rename from src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelVirtualTest.java
rename to src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelVirtualTest.java
index 31af9e3..fdf184e 100644
--- a/src/test/java/com/android/tools/r8/apimodeling/ApiModelNoInliningOfHigherApiLevelVirtualTest.java
+++ b/src/test/java/com/android/tools/r8/apimodeling/ApiModelingNoInliningOfHigherApiLevelVirtualTest.java
@@ -4,10 +4,11 @@
package com.android.tools.r8.apimodeling;
-import static com.android.tools.r8.apimodeling.ApiModelNoInliningOfHigherApiLevelVirtualTest.ApiCaller.callVirtualMethod;
import static com.android.tools.r8.apimodeling.ApiModelingTestHelper.setMockApiLevelForMethod;
import static com.android.tools.r8.apimodeling.ApiModelingTestHelper.verifyThat;
+import static org.junit.Assert.assertThrows;
+import com.android.tools.r8.NeverClassInline;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.NoHorizontalClassMerging;
import com.android.tools.r8.TestBase;
@@ -21,7 +22,7 @@
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
-public class ApiModelNoInliningOfHigherApiLevelVirtualTest extends TestBase {
+public class ApiModelingNoInliningOfHigherApiLevelVirtualTest extends TestBase {
private final TestParameters parameters;
@@ -30,7 +31,7 @@
return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
}
- public ApiModelNoInliningOfHigherApiLevelVirtualTest(TestParameters parameters) {
+ public ApiModelingNoInliningOfHigherApiLevelVirtualTest(TestParameters parameters) {
this.parameters = parameters;
}
@@ -47,12 +48,25 @@
.addKeepMainRule(Main.class)
.enableInliningAnnotations()
.enableNoHorizontalClassMergingAnnotations()
+ .enableNeverClassInliningAnnotations()
.apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.L_MR1))
- .apply(ApiModelingTestHelper::enableApiCallerIdentification)
.compile()
.inspect(
- verifyThat(parameters, apiCaller)
- .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1))
+ inspector -> {
+ if (parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.L_MR1)) {
+ verifyThat(parameters, apiCaller)
+ .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1)
+ .accept(inspector);
+ } else {
+ // TODO(b/188388130): Should only inline on minApi >= 22.
+ assertThrows(
+ AssertionError.class,
+ () ->
+ verifyThat(parameters, apiCaller)
+ .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1)
+ .accept(inspector));
+ }
+ })
.addRunClasspathClasses(Api.class)
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines(
@@ -67,9 +81,9 @@
}
@NoHorizontalClassMerging
+ @NeverClassInline
public static class ApiCaller {
-
- public static void callVirtualMethod() {
+ public void callVirtualMethod() {
System.out.println("ApiCaller::callVirtualMethod");
new Api().apiLevel22();
}
@@ -81,7 +95,7 @@
@NeverInline
public static void noApiCall() {
System.out.println("A::noApiCall");
- callVirtualMethod();
+ new ApiCaller().callVirtualMethod();
}
}
diff --git a/src/test/java/com/android/tools/r8/apimodeling/ApiModelingTestHelper.java b/src/test/java/com/android/tools/r8/apimodeling/ApiModelingTestHelper.java
index 5b1a2f7..d22c4bb 100644
--- a/src/test/java/com/android/tools/r8/apimodeling/ApiModelingTestHelper.java
+++ b/src/test/java/com/android/tools/r8/apimodeling/ApiModelingTestHelper.java
@@ -26,21 +26,11 @@
return compilerBuilder -> {
compilerBuilder.addOptionsModification(
options -> {
- options
- .apiModelingOptions()
- .methodApiMapping
- .put(Reference.methodFromMethod(method), apiLevel);
+ options.methodApiMapping.put(Reference.methodFromMethod(method), apiLevel);
});
};
}
- static void enableApiCallerIdentification(TestCompilerBuilder<?, ?, ?, ?, ?> compilerBuilder) {
- compilerBuilder.addOptionsModification(
- options -> {
- options.apiModelingOptions().enableApiCallerIdentification = true;
- });
- }
-
static ApiModelingMethodVerificationHelper verifyThat(TestParameters parameters, Method method) {
return new ApiModelingMethodVerificationHelper(parameters, method);
}
@@ -57,7 +47,7 @@
protected ThrowingConsumer<CodeInspector, Exception> inlinedIntoFromApiLevel(
Method method, AndroidApiLevel apiLevel) {
- return parameters.isDexRuntime() && parameters.getApiLevel().isGreaterThanOrEqualTo(apiLevel)
+ return parameters.getApiLevel().isGreaterThanOrEqualTo(apiLevel)
? inlinedInto(method)
: notInlinedInto(method);
}