Don't allow inlining between different features (and base)
Bug: 122902374
Change-Id: Ief95f81d5210a5db2d1b358365f02898f9e19d36
diff --git a/src/main/java/com/android/tools/r8/features/FeatureSplitConfiguration.java b/src/main/java/com/android/tools/r8/features/FeatureSplitConfiguration.java
index 8e779f4..b7f6158 100644
--- a/src/main/java/com/android/tools/r8/features/FeatureSplitConfiguration.java
+++ b/src/main/java/com/android/tools/r8/features/FeatureSplitConfiguration.java
@@ -68,7 +68,7 @@
if (javaTypeToFeatureSplitMapping.isEmpty()) {
return true;
}
- // TODO(ricow): Consider caching the descriptor string.
+ // TODO(141451259): Consider doing the mapping from DexType to Feature (with support in mapper)
return javaTypeToFeatureSplitMapping.get(
DescriptorUtils.descriptorToJavaType(a.toDescriptorString()))
== javaTypeToFeatureSplitMapping.get(
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 0c4e409..9d2c5ad 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
@@ -213,6 +213,12 @@
}
InternalOptions options = appView.options();
+ if (options.featureSplitConfiguration != null
+ && !options.featureSplitConfiguration.inSameFeatureOrBase(
+ candidate.method, method.method)) {
+ return false;
+ }
+
if (options.testing.validInliningReasons != null
&& !options.testing.validInliningReasons.contains(reason)) {
return false;
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterInlineRegression.java b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterInlineRegression.java
index cd9ad87..14d1e63 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterInlineRegression.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterInlineRegression.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.dexsplitter;
+import static junit.framework.TestCase.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
@@ -85,9 +86,9 @@
EXPECTED,
a -> true,
configurator);
- // TODO(122902374): This should not fail, but currently we are just on par with DexSplitter.
- assertNotEquals(processResult.exitCode, 0);
- assertTrue(processResult.stderr.contains("NoClassDefFoundError"));
+
+ assertEquals(processResult.exitCode, 0);
+ assertEquals(processResult.stdout, StringUtils.lines("42"));
}
@NeverMerge
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java b/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
index b56827b..9d8c12b 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
@@ -2,6 +2,7 @@
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.ArchiveProgramResourceProvider;
import com.android.tools.r8.ByteDataView;
@@ -205,7 +206,7 @@
protected ProcessResult runFeatureOnArt(
Class toRun, Path splitterBaseDexFile, Path splitterFeatureDexFile, TestRuntime runtime)
throws IOException {
- assertTrue(runtime.isDex());
+ assumeTrue(runtime.isDex());
ArtCommandBuilder commandBuilder = new ArtCommandBuilder(runtime.asDex().getVm());
commandBuilder.appendClasspath(splitterBaseDexFile.toString());
commandBuilder.appendProgramArgument(toRun.getName());