Reland "Keep debug related information in R8 debug mode."
Bug: 202486757
Change-Id: I51c59204c15a9c8c680d0c1c28e2f4e31456759c
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index bb22da1..c9ffe03 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -528,6 +528,11 @@
}
});
+ if (getMode() == CompilationMode.DEBUG) {
+ disableMinification = true;
+ configurationBuilder.disableOptimization();
+ }
+
if (disableTreeShaking) {
configurationBuilder.disableShrinking();
}
@@ -823,10 +828,8 @@
@Override
InternalOptions getInternalOptions() {
- InternalOptions internal = new InternalOptions(proguardConfiguration, getReporter());
+ InternalOptions internal = new InternalOptions(getMode(), proguardConfiguration, getReporter());
assert !internal.testing.allowOutlinerInterfaceArrayArguments; // Only allow in tests.
- assert !internal.debug;
- internal.debug = getMode() == CompilationMode.DEBUG;
internal.programConsumer = getProgramConsumer();
internal.minApiLevel = AndroidApiLevel.getAndroidApiLevel(getMinApiLevel());
internal.desugarState = getDesugarState();
@@ -835,40 +838,26 @@
assert !internal.ignoreMissingClasses;
internal.ignoreMissingClasses =
proguardConfiguration.isIgnoreWarnings()
- // TODO(70706667): We probably only want this in Proguard compatibility mode.
|| (forceProguardCompatibility
- && !proguardConfiguration.isOptimizing()
+ && !internal.isOptimizing()
&& !internal.isShrinking()
&& !internal.isMinifying());
assert !internal.verbose;
internal.mainDexKeepRules = mainDexKeepRules;
- internal.minimalMainDex = getMode() == CompilationMode.DEBUG;
+ internal.minimalMainDex = internal.debug;
internal.mainDexListConsumer = getMainDexListConsumer();
internal.lineNumberOptimization =
- !internal.debug && (proguardConfiguration.isOptimizing() || internal.isMinifying())
+ (internal.isOptimizing() || internal.isMinifying())
? LineNumberOptimization.ON
: LineNumberOptimization.OFF;
HorizontalClassMergerOptions horizontalClassMergerOptions =
internal.horizontalClassMergerOptions();
- assert proguardConfiguration.isOptimizing()
- || horizontalClassMergerOptions.isRestrictedToSynthetics();
+ assert internal.isOptimizing() || horizontalClassMergerOptions.isRestrictedToSynthetics();
assert !internal.enableTreeShakingOfLibraryMethodOverrides;
- assert internal.enableVerticalClassMerging || !proguardConfiguration.isOptimizing();
- if (internal.debug) {
- internal.getProguardConfiguration().getKeepAttributes().lineNumberTable = true;
- internal.getProguardConfiguration().getKeepAttributes().localVariableTable = true;
- internal.getProguardConfiguration().getKeepAttributes().localVariableTypeTable = true;
- internal.enableInlining = false;
- internal.enableClassInlining = false;
- internal.enableVerticalClassMerging = false;
- internal.enableClassStaticizer = false;
- internal.outline.enabled = false;
- internal.enableEnumUnboxing = false;
- internal.callSiteOptimizationOptions().disableOptimization();
- }
+ assert internal.enableVerticalClassMerging || !internal.isOptimizing();
if (!internal.isShrinking()) {
// If R8 is not shrinking, there is no point in running various optimizations since the
diff --git a/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java b/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
index aea3e82..7c7e1d4 100644
--- a/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
+++ b/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
@@ -8,6 +8,7 @@
import com.android.tools.r8.ClassFileConsumer;
import com.android.tools.r8.ClassFileConsumer.ArchiveConsumer;
import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.Diagnostic;
import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.Keep;
@@ -144,7 +145,12 @@
// We are using the proguard configuration for adapting resources.
InternalOptions options =
new InternalOptions(
+ // Set debug to ensure that we are writing all information to the application writer.
+ CompilationMode.DEBUG,
ProguardConfiguration.builder(factory, getReporter())
+ .disableShrinking()
+ .disableObfuscation()
+ .disableOptimization()
.addKeepAttributePatterns(ImmutableList.of("*"))
.addAdaptResourceFilenames(ProguardPathList.builder().addFileName("**").build())
.build(),
@@ -154,8 +160,6 @@
options.programConsumer = consumer;
assert consumer != null;
options.dataResourceConsumer = consumer.getDataResourceConsumer();
- // Set debug to ensure that we are writing all information to the application writer.
- options.debug = true;
return options;
}
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 bf36717..634b988 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -179,25 +179,41 @@
}
// Constructor for R8.
- public InternalOptions(ProguardConfiguration proguardConfiguration, Reporter reporter) {
+ public InternalOptions(
+ CompilationMode mode, ProguardConfiguration proguardConfiguration, Reporter reporter) {
assert reporter != null;
assert proguardConfiguration != null;
+ this.debug = mode == CompilationMode.DEBUG;
this.reporter = reporter;
this.proguardConfiguration = proguardConfiguration;
itemFactory = proguardConfiguration.getDexItemFactory();
enableTreeShaking = proguardConfiguration.isShrinking();
enableMinification = proguardConfiguration.isObfuscating();
- // TODO(b/171457102): Avoid the need for this.
- // -dontoptimize disables optimizations by flipping related flags.
if (!proguardConfiguration.isOptimizing()) {
+ // TODO(b/171457102): Avoid the need for this.
+ // -dontoptimize disables optimizations by flipping related flags.
disableAllOptimizations();
}
+ if (debug) {
+ assert !isMinifying();
+ assert !isOptimizing();
+ keepDebugRelatedInformation();
+ }
configurationDebugging = proguardConfiguration.isConfigurationDebugging();
if (proguardConfiguration.isProtoShrinkingEnabled()) {
enableProtoShrinking();
}
}
+ private void keepDebugRelatedInformation() {
+ assert !proguardConfiguration.isObfuscating();
+ getProguardConfiguration().getKeepAttributes().sourceFile = true;
+ getProguardConfiguration().getKeepAttributes().sourceDebugExtension = true;
+ getProguardConfiguration().getKeepAttributes().lineNumberTable = true;
+ getProguardConfiguration().getKeepAttributes().localVariableTable = true;
+ getProguardConfiguration().getKeepAttributes().localVariableTypeTable = true;
+ }
+
void enableProtoShrinking() {
applyInliningToInlinee = true;
enableFieldBitAccessAnalysis = true;
diff --git a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
index 44ab3fc..7a70c5a 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -621,7 +621,8 @@
DexString renamedName = namingLens.lookupName(method);
if (renamedName != method.name
|| graphLens.getOriginalMethodSignature(method) != method
- || doesContainPositions(encodedMethod)) {
+ || doesContainPositions(encodedMethod)
+ || encodedMethod.isD8R8Synthesized()) {
methodsByRenamedName
.computeIfAbsent(renamedName, key -> new ArrayList<>())
.add(encodedMethod);
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index e3c86ad..21113a9 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -766,7 +766,9 @@
return builder.build();
};
}
- InternalOptions options = new InternalOptions(keepConfig.apply(dexItemFactory), new Reporter());
+ InternalOptions options =
+ new InternalOptions(
+ CompilationMode.RELEASE, keepConfig.apply(dexItemFactory), new Reporter());
if (optionsConsumer != null) {
optionsConsumer.accept(options);
}
diff --git a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
index dbaa9c9..be7b225 100644
--- a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
@@ -352,6 +352,10 @@
return addKeepAttributes(ProguardKeepAttributes.LINE_NUMBER_TABLE);
}
+ public T addKeepAttributeLocalVariableTable() {
+ return addKeepAttributes(ProguardKeepAttributes.LOCAL_VARIABLE_TABLE);
+ }
+
public T addKeepAttributeSignature() {
return addKeepAttributes(ProguardKeepAttributes.SIGNATURE);
}
diff --git a/src/test/java/com/android/tools/r8/debug/MinificationTest.java b/src/test/java/com/android/tools/r8/debug/MinificationTest.java
deleted file mode 100644
index b42d7fa..0000000
--- a/src/test/java/com/android/tools/r8/debug/MinificationTest.java
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright (c) 2017, 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.debug;
-
-import static org.junit.Assert.assertTrue;
-
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.R8Command;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.debug.DebugTestConfig.RuntimeKind;
-import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import com.google.common.collect.ImmutableList;
-import java.nio.file.Path;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-/** Tests renaming of class and method names and corresponding proguard map output. */
-@RunWith(Parameterized.class)
-public class MinificationTest extends DebugTestBase {
-
- private static final String SOURCE_FILE = "Minified.java";
-
- @Parameterized.Parameters(name = "backend:{0} minification:{1} proguardMap:{2}")
- public static Collection minificationControl() {
- ImmutableList.Builder<Object> builder = ImmutableList.builder();
- for (RuntimeKind kind : RuntimeKind.values()) {
- for (MinifyMode mode : MinifyMode.values()) {
- builder.add((Object) new Object[] {kind, mode, false});
- if (mode.isMinify()) {
- builder.add((Object) new Object[] {kind, mode, true});
- }
- }
- }
- return builder.build();
- }
-
- @Rule
- public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
- private final RuntimeKind runtimeKind;
- private final MinifyMode minificationMode;
- private final boolean writeProguardMap;
-
- public MinificationTest(
- RuntimeKind runtimeKind, MinifyMode minificationMode, boolean writeProguardMap) {
- this.runtimeKind = runtimeKind;
- this.minificationMode = minificationMode;
- this.writeProguardMap = writeProguardMap;
- }
-
- private boolean minifiedNames() {
- return minificationMode.isMinify() && !writeProguardMap;
- }
-
- private DebugTestConfig getTestConfig() throws Throwable {
- List<String> proguardConfigurations = Collections.emptyList();
- ImmutableList.Builder<String> proguardConfigurationBuilder = ImmutableList.builder();
- if (!minificationMode.isMinify()) {
- proguardConfigurationBuilder.add("-dontobfuscate");
- } else if (minificationMode.isAggressive()) {
- proguardConfigurationBuilder.add("-overloadaggressively");
- }
- proguardConfigurationBuilder.add(
- "-keep public class Minified { public static void main(java.lang.String[]); }");
- proguardConfigurationBuilder.add("-keepattributes SourceFile");
- proguardConfigurationBuilder.add("-keepattributes LineNumberTable");
- proguardConfigurations = proguardConfigurationBuilder.build();
-
- Path outputPath = temp.getRoot().toPath().resolve("classes.zip");
- Path proguardMap = writeProguardMap ? temp.getRoot().toPath().resolve("proguard.map") : null;
- OutputMode outputMode =
- runtimeKind == RuntimeKind.CF ? OutputMode.ClassFile : OutputMode.DexIndexed;
- R8Command.Builder builder =
- R8Command.builder()
- .addProgramFiles(DEBUGGEE_JAR)
- .setOutput(outputPath, outputMode)
- .setMode(CompilationMode.DEBUG);
- if (runtimeKind == RuntimeKind.DEX) {
- AndroidApiLevel minSdk = ToolHelper.getMinApiLevelForDexVm();
- builder.setMinApiLevel(minSdk.getLevel()).addLibraryFiles(ToolHelper.getAndroidJar(minSdk));
- } else if (runtimeKind == RuntimeKind.CF) {
- builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
- }
- if (proguardMap != null) {
- builder.setProguardMapOutputPath(proguardMap);
- }
- if (!proguardConfigurations.isEmpty()) {
- builder.addProguardConfiguration(proguardConfigurations, Origin.unknown());
- }
- // Disable line number optimization if we're not using a Proguard map.
- ToolHelper.runR8(
- builder.build(),
- proguardMap == null
- ? (oc -> oc.lineNumberOptimization = LineNumberOptimization.OFF)
- : null);
-
- switch (runtimeKind) {
- case CF:
- {
- CfDebugTestConfig config = new CfDebugTestConfig(outputPath);
- config.setProguardMap(proguardMap);
- return config;
- }
- case DEX:
- {
- DexDebugTestConfig config = new DexDebugTestConfig(outputPath);
- config.setProguardMap(proguardMap);
- return config;
- }
- default:
- throw new Unreachable();
- }
- }
-
- @Test
- public void testBreakInMainClass() throws Throwable {
- final String className = "Minified";
- final String methodName = minifiedNames() ? "a" : "test";
- final String signature = "()V";
- final String innerClassName = minifiedNames() ? "a" : "Minified$Inner";
- final String innerMethodName = minifiedNames() ? "a" : "innerTest";
- final String innerSignature = "()I";
- DebugTestConfig config = getTestConfig();
- checkStructure(
- config,
- className,
- MethodSignature.fromSignature(methodName, signature),
- innerClassName,
- MethodSignature.fromSignature(innerMethodName, innerSignature));
- runDebugTest(
- config,
- className,
- breakpoint(className, methodName, signature),
- run(),
- checkMethod(className, methodName, signature),
- checkLine(SOURCE_FILE, 14),
- stepOver(INTELLIJ_FILTER),
- checkMethod(className, methodName, signature),
- checkLine(SOURCE_FILE, 15),
- stepInto(INTELLIJ_FILTER),
- checkMethod(innerClassName, innerMethodName, innerSignature),
- checkLine(8),
- run());
- }
-
- @Test
- public void testBreakInPossiblyRenamedClass() throws Throwable {
- final String className = "Minified";
- final String innerClassName = minifiedNames() ? "a" : "Minified$Inner";
- final String innerMethodName = minifiedNames() ? "a" : "innerTest";
- final String innerSignature = "()I";
- DebugTestConfig config = getTestConfig();
- checkStructure(
- config,
- className,
- innerClassName,
- MethodSignature.fromSignature(innerMethodName, innerSignature));
- runDebugTest(
- config,
- className,
- breakpoint(innerClassName, innerMethodName, innerSignature),
- run(),
- checkMethod(innerClassName, innerMethodName, innerSignature),
- checkLine(8),
- run());
- }
-
- private void checkStructure(
- DebugTestConfig config,
- String className,
- MethodSignature method,
- String innerClassName,
- MethodSignature innerMethod)
- throws Throwable {
- Path proguardMap = config.getProguardMap();
- String mappingFile = proguardMap == null ? null : proguardMap.toString();
- CodeInspector inspector = new CodeInspector(config.getPaths(), mappingFile, null);
- ClassSubject clazz = inspector.clazz(className);
- assertTrue(clazz.isPresent());
- if (method != null) {
- assertTrue(clazz.method(method).isPresent());
- }
- ClassSubject innerClass = inspector.clazz(innerClassName);
- assertTrue(innerClass.isPresent());
- assertTrue(innerClass.method(innerMethod).isPresent());
- }
-
- private void checkStructure(
- DebugTestConfig config, String className, String innerClassName, MethodSignature innerMethod)
- throws Throwable {
- checkStructure(config, className, null, innerClassName, innerMethod);
- }
-}
diff --git a/src/test/java/com/android/tools/r8/ir/InlineTest.java b/src/test/java/com/android/tools/r8/ir/InlineTest.java
index 909a929..6f5d826 100644
--- a/src/test/java/com/android/tools/r8/ir/InlineTest.java
+++ b/src/test/java/com/android/tools/r8/ir/InlineTest.java
@@ -7,6 +7,7 @@
import static com.android.tools.r8.ToolHelper.getMostRecentAndroidJar;
import static org.junit.Assert.assertEquals;
+import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.DexIndexedConsumer;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
@@ -93,7 +94,8 @@
Reporter reporter = new Reporter();
ProguardConfiguration proguardConfiguration =
ProguardConfiguration.builder(new DexItemFactory(), reporter).build();
- InternalOptions options = new InternalOptions(proguardConfiguration, reporter);
+ InternalOptions options =
+ new InternalOptions(CompilationMode.RELEASE, proguardConfiguration, reporter);
options.programConsumer = DexIndexedConsumer.emptyConsumer();
return options;
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InterfaceRenewalInLoopDebugTestRunner.java b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InterfaceRenewalInLoopDebugTestRunner.java
index be426b1..2b6a5c8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InterfaceRenewalInLoopDebugTestRunner.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InterfaceRenewalInLoopDebugTestRunner.java
@@ -8,32 +8,45 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.R8TestCompileResult;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.debug.DebugTestBase;
import com.android.tools.r8.debug.DebugTestConfig;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.MethodSubject;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Streams;
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 InterfaceRenewalInLoopDebugTestRunner extends DebugTestBase {
private static Class<?> MAIN = InterfaceRenewalInLoopDebugTest.class;
+ private static Class<?> ITF = TestInterface.class;
private static Class<?> IMPL = OneUniqueImplementer.class;
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withSystemRuntime().build();
+ }
+
+ private final TestParameters parameters;
+
+ public InterfaceRenewalInLoopDebugTestRunner(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
@Test
public void test() throws Throwable {
R8TestCompileResult result =
- testForR8(Backend.CF)
- .setMode(CompilationMode.DEBUG)
- .addProgramClasses(TestInterface.class, IMPL, MAIN)
+ testForR8(parameters.getBackend())
+ .debug()
+ .addProgramClasses(ITF, IMPL, MAIN)
.addKeepMainRule(MAIN)
- .addKeepRules(ImmutableList.of("-keepattributes SourceFile,LineNumberTable"))
.enableNoVerticalClassMergingAnnotations()
- .noMinification()
.compile();
CodeInspector inspector = result.inspector();
@@ -41,7 +54,7 @@
assertThat(mainSubject, isPresent());
MethodSubject methodSubject = mainSubject.uniqueMethodWithName("booRunner");
assertThat(methodSubject, isPresent());
- verifyDevirtualized(methodSubject);
+ verifyNotDevirtualized(methodSubject);
DebugTestConfig config = result.debugConfig();
runDebugTest(config, MAIN.getCanonicalName(),
@@ -73,24 +86,24 @@
run());
}
- private void verifyDevirtualized(MethodSubject method) {
- long virtualCallCount = Streams.stream(method.iterateInstructions(instructionSubject -> {
- if (instructionSubject.isInvokeVirtual()) {
- return isDevirtualizedCall(instructionSubject.getMethod());
- }
- return false;
- })).count();
- long checkCastCount = Streams.stream(method.iterateInstructions(instructionSubject -> {
- return instructionSubject.isCheckCast(IMPL.getTypeName());
- })).count();
+ private void verifyNotDevirtualized(MethodSubject method) {
+ // Check all calls are on the interface. This used to check the replacement by the impl, but
+ // debug soft-pinning now prohibits that.
+ long virtualCallCount =
+ method
+ .streamInstructions()
+ .filter(i -> i.isInvokeInterface() && isInterfaceCall(i.getMethod()))
+ .count();
assertTrue(virtualCallCount > 0);
- // Make sure that all devirtualized calls don't share check-casted receiver.
- // Rather, it should use its own check-casted receiver to not pass the local.
+ // Make sure that no calls share check-cast receivers.
+ long checkCastCount =
+ method.streamInstructions().filter(i -> i.isCheckCast(ITF.getTypeName())).count();
assertEquals(virtualCallCount, checkCastCount);
}
- private static boolean isDevirtualizedCall(DexMethod method) {
- return method.holder.toSourceString().equals(IMPL.getTypeName())
+ // The calls to the interface actually remain as debug implies dontoptimize.
+ private static boolean isInterfaceCall(DexMethod method) {
+ return method.holder.toSourceString().equals(ITF.getTypeName())
&& method.getArity() == 0
&& method.proto.returnType.isVoidType()
&& method.name.toString().equals("foo");
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
index 116ce4a..df6d1a5 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
@@ -170,7 +170,9 @@
"-keep class " + CLASS_NAME,
"-keepclassmembers,allowobfuscation class " + CLASS_NAME + " { static <fields>; }",
"-dontoptimize");
- CodeInspector inspector = compileWithR8(builder, pgConfigs).inspector();
+ CodeInspector inspector =
+ compileWithR8(builder, testBuilder -> testBuilder.debug().addKeepRules(pgConfigs))
+ .inspector();
ClassSubject clazz = inspector.clazz(CLASS_NAME);
assertTrue(clazz.isPresent());
@@ -373,6 +375,7 @@
builder,
testBuilder ->
testBuilder
+ .addDontOptimize()
.addKeepRules(
"-identifiernamestring class "
+ CLASS_NAME
@@ -420,9 +423,11 @@
"invoke-static {v1}, LExample;->foo(Ljava/lang/String;)V",
"return-void");
- List<String> pgConfigs = ImmutableList.of(
- "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
- "-keep class " + CLASS_NAME);
+ List<String> pgConfigs =
+ ImmutableList.of(
+ "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
+ "-keep class " + CLASS_NAME,
+ "-dontoptimize");
CodeInspector inspector = compileWithR8(builder, pgConfigs).inspector();
ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -465,10 +470,12 @@
"return-void");
builder.addClass(BOO);
- List<String> pgConfigs = ImmutableList.of(
- "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
- "-keep class " + CLASS_NAME,
- "-keep,allowobfuscation class " + BOO);
+ List<String> pgConfigs =
+ ImmutableList.of(
+ "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
+ "-keep class " + CLASS_NAME,
+ "-keep,allowobfuscation class " + BOO,
+ "-dontoptimize");
CodeInspector inspector = compileWithR8(builder, pgConfigs).inspector();
ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -725,7 +732,6 @@
return testForR8(Backend.DEX)
.addProgramDexFileData(builder.compile())
.apply(configuration)
- .debug()
.compile();
}
}
diff --git a/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java b/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
index d2e1d70..aedd6a4 100644
--- a/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
+++ b/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
@@ -212,10 +212,12 @@
}
@Test
- public void test() throws Exception {
- runTest(this::validate, true, CompilationMode.DEBUG);
+ public void testRelease() throws Exception {
runTest(this::validate, true, CompilationMode.RELEASE);
- runTest(this::validate, false, CompilationMode.DEBUG);
+ }
+
+ @Test
+ public void testReleaseNoClassInline() throws Exception {
runTest(this::validate, false, CompilationMode.RELEASE);
}
}
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageDebugMinificationTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageDebugMinificationTest.java
index fe19640..23a5047 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageDebugMinificationTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageDebugMinificationTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.repackage;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -70,7 +69,7 @@
MethodSubject main = mainClass.uniqueMethodWithName("main");
assertThat(main, isPresentAndNotRenamed());
ClassSubject aClass = inspector.clazz(A.class);
- assertThat(aClass, isPresentAndRenamed());
+ assertThat(aClass, isPresentAndNotRenamed());
LocalVariableTable localVariableTable = main.getLocalVariableTable();
// Take the second index which is localValue
assertEquals(2, localVariableTable.size());
diff --git a/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
index afba8bd..dddb176 100644
--- a/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
@@ -3,17 +3,16 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.rewrite.switchmaps;
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.R8Command;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
+import static org.hamcrest.MatcherAssert.assertThat;
+
import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersBuilder;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.collect.ImmutableList;
import java.nio.file.Paths;
import java.util.List;
-import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -21,14 +20,16 @@
@RunWith(Parameterized.class)
public class RewriteSwitchMapsTest extends TestBase {
- private Backend backend;
+ private final Backend backend;
- @Parameterized.Parameters(name = "Backend: {0}")
- public static Backend[] data() {
- return ToolHelper.getBackends();
+ @Parameterized.Parameters(name = "{0}, backend: {1}")
+ public static List<Object[]> data() {
+ return buildParameters(
+ TestParametersBuilder.builder().withNoneRuntime().build(), ToolHelper.getBackends());
}
- public RewriteSwitchMapsTest(Backend backend) {
+ public RewriteSwitchMapsTest(TestParameters parameters, Backend backend) {
+ parameters.assertNoneRuntime();
this.backend = backend;
}
@@ -41,25 +42,13 @@
@Test
public void checkSwitchMapsRemoved() throws Exception {
- run(CompilationMode.RELEASE);
- }
-
- @Test
- public void checkSwitchMapsRemovedDebug() throws Exception {
- run(CompilationMode.DEBUG);
- }
-
- private void run(CompilationMode compilationMode) throws Exception {
- R8Command command =
- R8Command.builder()
- .addProgramFiles(Paths.get(ToolHelper.EXAMPLES_BUILD_DIR).resolve(JAR_FILE))
- .addLibraryFiles(runtimeJar(backend))
- .addProguardConfiguration(PG_CONFIG, Origin.unknown())
- .setMode(compilationMode)
- .setProgramConsumer(emptyConsumer(backend))
- .build();
- AndroidApp result = ToolHelper.runR8(command);
- CodeInspector inspector = new CodeInspector(result);
- Assert.assertFalse(inspector.clazz(SWITCHMAP_CLASS_NAME).isPresent());
+ testForR8(backend)
+ .addProgramFiles(Paths.get(ToolHelper.EXAMPLES_BUILD_DIR).resolve(JAR_FILE))
+ .addKeepRules(PG_CONFIG)
+ .compile()
+ .inspect(
+ inspector -> {
+ assertThat(inspector.clazz(SWITCHMAP_CLASS_NAME), isAbsent());
+ });
}
}