Merge "Fix local variable table in CF backend when inserting CfFrames."
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexList.java b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
index 26097c1..fe946da 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexList.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.shaking.Enqueuer;
import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
import com.android.tools.r8.shaking.MainDexListBuilder;
@@ -41,7 +42,7 @@
AppInfoWithSubtyping appInfo = new AppInfoWithSubtyping(application);
RootSet mainDexRootSet =
new RootSetBuilder(appInfo, application, options.mainDexKeepRules, options).run(executor);
- Enqueuer enqueuer = new Enqueuer(appInfo, options, true);
+ Enqueuer enqueuer = new Enqueuer(appInfo, GraphLense.getIdentityLense(), options, true);
AppInfoWithLiveness mainDexAppInfo = enqueuer.traceMainDex(mainDexRootSet, executor, timing);
// LiveTypes is the result.
Set<DexType> mainDexClasses =
diff --git a/src/main/java/com/android/tools/r8/PrintSeeds.java b/src/main/java/com/android/tools/r8/PrintSeeds.java
index 782c91d..4410d8a 100644
--- a/src/main/java/com/android/tools/r8/PrintSeeds.java
+++ b/src/main/java/com/android/tools/r8/PrintSeeds.java
@@ -6,6 +6,7 @@
import com.android.tools.r8.dex.ApplicationReader;
import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.DexApplication;
+import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.shaking.Enqueuer;
import com.android.tools.r8.shaking.RootSetBuilder;
import com.android.tools.r8.shaking.RootSetBuilder.RootSet;
@@ -84,7 +85,7 @@
new RootSetBuilder(
appInfo, application, options.proguardConfiguration.getRules(), options)
.run(executor);
- Enqueuer enqueuer = new Enqueuer(appInfo, options, false);
+ Enqueuer enqueuer = new Enqueuer(appInfo, GraphLense.getIdentityLense(), options, false);
appInfo = enqueuer.traceApplication(rootSet, executor, timing);
RootSetBuilder.writeSeeds(
appInfo.withLiveness(),
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index c03d928..16858af 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -292,6 +292,7 @@
Enqueuer enqueuer =
new Enqueuer(
appView.getAppInfo(),
+ appView.getGraphLense(),
options,
options.forceProguardCompatibility,
compatibility,
@@ -380,10 +381,9 @@
.rewrittenWithLense(application.asDirect(), appView.getGraphLense()));
}
// Collect switch maps and ordinals maps.
+ appViewWithLiveness.setAppInfo(new SwitchMapCollector(appViewWithLiveness, options).run());
appViewWithLiveness.setAppInfo(
- new SwitchMapCollector(appViewWithLiveness.getAppInfo(), options).run());
- appViewWithLiveness.setAppInfo(
- new EnumOrdinalMapCollector(appViewWithLiveness.getAppInfo(), options).run());
+ new EnumOrdinalMapCollector(appViewWithLiveness, options).run());
// TODO(b/79143143): re-enable once fixed.
// graphLense = new BridgeMethodAnalysis(graphLense, appInfo.withLiveness()).run();
@@ -419,7 +419,8 @@
if (!options.mainDexKeepRules.isEmpty()) {
appView.setAppInfo(new AppInfoWithSubtyping(application));
- Enqueuer enqueuer = new Enqueuer(appView.getAppInfo(), options, true);
+ Enqueuer enqueuer =
+ new Enqueuer(appView.getAppInfo(), appView.getGraphLense(), options, true);
// Lets find classes which may have code executed before secondary dex files installation.
RootSet mainDexRootSet =
new RootSetBuilder(appView.getAppInfo(), application, options.mainDexKeepRules, options)
@@ -443,7 +444,11 @@
timing.begin("Post optimization code stripping");
try {
Enqueuer enqueuer =
- new Enqueuer(appView.getAppInfo(), options, options.forceProguardCompatibility);
+ new Enqueuer(
+ appView.getAppInfo(),
+ appView.getGraphLense(),
+ options,
+ options.forceProguardCompatibility);
appView.setAppInfo(enqueuer.traceApplication(rootSet, executorService, timing));
AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index 776cc42..e41120d 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -201,14 +201,19 @@
@Override
public IRCode buildIR(
- DexEncodedMethod encodedMethod, AppInfo appInfo, InternalOptions options, Origin origin) {
- return internalBuild(encodedMethod, appInfo, options, null, null, origin);
+ DexEncodedMethod encodedMethod,
+ AppInfo appInfo,
+ GraphLense graphLense,
+ InternalOptions options,
+ Origin origin) {
+ return internalBuild(encodedMethod, appInfo, graphLense, options, null, null, origin);
}
@Override
public IRCode buildInliningIR(
DexEncodedMethod encodedMethod,
AppInfo appInfo,
+ GraphLense graphLense,
InternalOptions options,
ValueNumberGenerator valueNumberGenerator,
Position callerPosition,
@@ -216,12 +221,13 @@
assert valueNumberGenerator != null;
assert callerPosition != null;
return internalBuild(
- encodedMethod, appInfo, options, valueNumberGenerator, callerPosition, origin);
+ encodedMethod, appInfo, graphLense, options, valueNumberGenerator, callerPosition, origin);
}
private IRCode internalBuild(
DexEncodedMethod encodedMethod,
AppInfo appInfo,
+ GraphLense graphLense,
InternalOptions options,
ValueNumberGenerator generator,
Position callerPosition,
@@ -235,14 +241,11 @@
new CfSourceCode(
this,
encodedMethod,
+ graphLense.getOriginalMethodSignature(encodedMethod.method),
callerPosition,
origin,
options.lineNumberOptimization == LineNumberOptimization.ON);
- IRBuilder builder =
- (generator == null)
- ? new IRBuilder(encodedMethod, appInfo, source, options)
- : new IRBuilder(encodedMethod, appInfo, source, options, generator);
- return builder.build();
+ return new IRBuilder(encodedMethod, appInfo, source, options, generator).build();
}
@Override
diff --git a/src/main/java/com/android/tools/r8/graph/Code.java b/src/main/java/com/android/tools/r8/graph/Code.java
index 60a5ef5..0484a63 100644
--- a/src/main/java/com/android/tools/r8/graph/Code.java
+++ b/src/main/java/com/android/tools/r8/graph/Code.java
@@ -17,11 +17,16 @@
public abstract class Code extends CachedHashValueDexItem {
public abstract IRCode buildIR(
- DexEncodedMethod encodedMethod, AppInfo appInfo, InternalOptions options, Origin origin);
+ DexEncodedMethod encodedMethod,
+ AppInfo appInfo,
+ GraphLense graphLense,
+ InternalOptions options,
+ Origin origin);
public IRCode buildInliningIR(
DexEncodedMethod encodedMethod,
AppInfo appInfo,
+ GraphLense graphLense,
InternalOptions options,
ValueNumberGenerator valueNumberGenerator,
Position callerPosition,
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index b1b5f8a..4a0a483 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -164,10 +164,18 @@
@Override
public IRCode buildIR(
- DexEncodedMethod encodedMethod, AppInfo appInfo, InternalOptions options, Origin origin) {
+ DexEncodedMethod encodedMethod,
+ AppInfo appInfo,
+ GraphLense graphLense,
+ InternalOptions options,
+ Origin origin) {
DexSourceCode source =
new DexSourceCode(
- this, encodedMethod, null, options.lineNumberOptimization == LineNumberOptimization.ON);
+ this,
+ encodedMethod,
+ graphLense.getOriginalMethodSignature(encodedMethod.method),
+ null,
+ options.lineNumberOptimization == LineNumberOptimization.ON);
IRBuilder builder = new IRBuilder(encodedMethod, appInfo, source, options);
return builder.build();
}
@@ -176,6 +184,7 @@
public IRCode buildInliningIR(
DexEncodedMethod encodedMethod,
AppInfo appInfo,
+ GraphLense graphLense,
InternalOptions options,
ValueNumberGenerator valueNumberGenerator,
Position callerPosition,
@@ -184,6 +193,7 @@
new DexSourceCode(
this,
encodedMethod,
+ graphLense.getOriginalMethodSignature(encodedMethod.method),
callerPosition,
options.lineNumberOptimization == LineNumberOptimization.ON);
IRBuilder builder =
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 a6032e4..cf1a105 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -252,23 +252,26 @@
compilationState = CompilationState.NOT_PROCESSED;
}
- public IRCode buildIR(AppInfo appInfo, InternalOptions options, Origin origin) {
- return code == null ? null : code.buildIR(this, appInfo, options, origin);
+ public IRCode buildIR(
+ AppInfo appInfo, GraphLense graphLense, InternalOptions options, Origin origin) {
+ return code == null ? null : code.buildIR(this, appInfo, graphLense, options, origin);
}
public IRCode buildInliningIRForTesting(
InternalOptions options, ValueNumberGenerator valueNumberGenerator) {
- return buildInliningIR(null, options, valueNumberGenerator, null, Origin.unknown());
+ return buildInliningIR(
+ null, GraphLense.getIdentityLense(), options, valueNumberGenerator, null, Origin.unknown());
}
public IRCode buildInliningIR(
AppInfo appInfo,
+ GraphLense graphLense,
InternalOptions options,
ValueNumberGenerator valueNumberGenerator,
Position callerPosition,
Origin origin) {
return code.buildInliningIR(
- this, appInfo, options, valueNumberGenerator, callerPosition, origin);
+ this, appInfo, graphLense, options, valueNumberGenerator, callerPosition, origin);
}
public void setCode(Code code) {
diff --git a/src/main/java/com/android/tools/r8/graph/JarCode.java b/src/main/java/com/android/tools/r8/graph/JarCode.java
index a48841f..28143ad 100644
--- a/src/main/java/com/android/tools/r8/graph/JarCode.java
+++ b/src/main/java/com/android/tools/r8/graph/JarCode.java
@@ -108,17 +108,22 @@
@Override
public IRCode buildIR(
- DexEncodedMethod encodedMethod, AppInfo appInfo, InternalOptions options, Origin origin) {
+ DexEncodedMethod encodedMethod,
+ AppInfo appInfo,
+ GraphLense graphLense,
+ InternalOptions options,
+ Origin origin) {
triggerDelayedParsingIfNeccessary();
return options.debug
- ? internalBuildWithLocals(encodedMethod, appInfo, options, null, null)
- : internalBuild(encodedMethod, appInfo, options, null, null);
+ ? internalBuildWithLocals(encodedMethod, appInfo, graphLense, options, null, null)
+ : internalBuild(encodedMethod, appInfo, graphLense, options, null, null);
}
@Override
public IRCode buildInliningIR(
DexEncodedMethod encodedMethod,
AppInfo appInfo,
+ GraphLense graphLense,
InternalOptions options,
ValueNumberGenerator generator,
Position callerPosition,
@@ -126,41 +131,45 @@
assert generator != null;
triggerDelayedParsingIfNeccessary();
return options.debug
- ? internalBuildWithLocals(encodedMethod, appInfo, options, generator, callerPosition)
- : internalBuild(encodedMethod, appInfo, options, generator, callerPosition);
+ ? internalBuildWithLocals(
+ encodedMethod, appInfo, graphLense, options, generator, callerPosition)
+ : internalBuild(encodedMethod, appInfo, graphLense, options, generator, callerPosition);
}
private IRCode internalBuildWithLocals(
DexEncodedMethod encodedMethod,
AppInfo appInfo,
+ GraphLense graphLense,
InternalOptions options,
ValueNumberGenerator generator,
Position callerPosition) {
try {
- return internalBuild(encodedMethod, appInfo, options, generator, callerPosition);
+ return internalBuild(encodedMethod, appInfo, graphLense, options, generator, callerPosition);
} catch (InvalidDebugInfoException e) {
options.warningInvalidDebugInfo(encodedMethod, origin, e);
node.localVariables.clear();
- return internalBuild(encodedMethod, appInfo, options, generator, callerPosition);
+ return internalBuild(encodedMethod, appInfo, graphLense, options, generator, callerPosition);
}
}
private IRCode internalBuild(
DexEncodedMethod encodedMethod,
AppInfo appInfo,
+ GraphLense graphLense,
InternalOptions options,
ValueNumberGenerator generator,
Position callerPosition) {
if (!options.debug) {
node.localVariables.clear();
}
- JarSourceCode source = new JarSourceCode(
- method.getHolder(), node, application, encodedMethod.method, callerPosition);
- IRBuilder builder =
- (generator == null)
- ? new IRBuilder(encodedMethod, appInfo, source, options)
- : new IRBuilder(encodedMethod, appInfo, source, options, generator);
- return builder.build();
+ JarSourceCode source =
+ new JarSourceCode(
+ method.getHolder(),
+ node,
+ application,
+ graphLense.getOriginalMethodSignature(encodedMethod.method),
+ callerPosition);
+ return new IRBuilder(encodedMethod, appInfo, source, options, generator).build();
}
@Override
diff --git a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
index afc2969..b6eb879 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
@@ -175,20 +175,32 @@
@Override
public IRCode buildIR(
- DexEncodedMethod encodedMethod, AppInfo appInfo, InternalOptions options, Origin origin) {
- return asCfCode().buildIR(encodedMethod, appInfo, options, origin);
+ DexEncodedMethod encodedMethod,
+ AppInfo appInfo,
+ GraphLense graphLense,
+ InternalOptions options,
+ Origin origin) {
+ return asCfCode().buildIR(encodedMethod, appInfo, graphLense, options, origin);
}
@Override
public IRCode buildInliningIR(
DexEncodedMethod encodedMethod,
AppInfo appInfo,
+ GraphLense graphLense,
InternalOptions options,
ValueNumberGenerator valueNumberGenerator,
Position callerPosition,
Origin origin) {
- return asCfCode().buildInliningIR(
- encodedMethod, appInfo, options, valueNumberGenerator, callerPosition, origin);
+ return asCfCode()
+ .buildInliningIR(
+ encodedMethod,
+ appInfo,
+ graphLense,
+ options,
+ valueNumberGenerator,
+ callerPosition,
+ origin);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
index bc2222f..7892afb 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
@@ -20,6 +20,7 @@
import com.android.tools.r8.graph.DebugLocalInfo;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.code.CanonicalPositions;
import com.android.tools.r8.ir.code.CatchHandlers;
@@ -199,6 +200,7 @@
public CfSourceCode(
CfCode code,
DexEncodedMethod method,
+ DexMethod originalMethod,
Position callerPosition,
Origin origin,
boolean preserveCaller) {
@@ -217,7 +219,7 @@
}
this.state = new CfState(origin);
canonicalPositions =
- new CanonicalPositions(callerPosition, preserveCaller, cfPositionCount, this.method.method);
+ new CanonicalPositions(callerPosition, preserveCaller, cfPositionCount, originalMethod);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
index 10bf6a5..94516a2 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
@@ -75,26 +75,30 @@
private List<DexDebugEntry> debugEntries = null;
// In case of inlining the position of the invoke in the caller.
- private final DexMethod method;
+ private final DexMethod originalMethod;
public DexSourceCode(
- DexCode code, DexEncodedMethod method, Position callerPosition, boolean preserveCaller) {
+ DexCode code,
+ DexEncodedMethod method,
+ DexMethod originalMethod,
+ Position callerPosition,
+ boolean preserveCaller) {
this.code = code;
this.proto = method.method.proto;
this.accessFlags = method.accessFlags;
- this.method = method.method;
+ this.originalMethod = originalMethod;
argumentTypes = computeArgumentTypes();
DexDebugInfo info = code.getDebugInfo();
if (info != null) {
- debugEntries = info.computeEntries(method.method);
+ debugEntries = info.computeEntries(originalMethod);
}
canonicalPositions =
new CanonicalPositions(
callerPosition,
preserveCaller,
debugEntries == null ? 0 : debugEntries.size(),
- this.method);
+ originalMethod);
}
@Override
@@ -253,7 +257,7 @@
private Position getCanonicalPositionAppendCaller(DexDebugEntry entry) {
// If this instruction has already been inlined then this.method must be the outermost caller.
assert entry.callerPosition == null
- || entry.callerPosition.getOutermostCaller().method == method;
+ || entry.callerPosition.getOutermostCaller().method == originalMethod;
return canonicalPositions.getCanonical(
new Position(
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index 62450d4..98b4502 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -329,19 +329,23 @@
// Flag indicating if the instructions define values with imprecise types.
private boolean hasImpreciseInstructionOutValueTypes = false;
- public IRBuilder(DexEncodedMethod method, AppInfo appInfo,
- SourceCode source, InternalOptions options) {
+ public IRBuilder(
+ DexEncodedMethod method, AppInfo appInfo, SourceCode source, InternalOptions options) {
this(method, appInfo, source, options, new ValueNumberGenerator());
}
public IRBuilder(
- DexEncodedMethod method, AppInfo appInfo, SourceCode source,
- InternalOptions options, ValueNumberGenerator valueNumberGenerator) {
+ DexEncodedMethod method,
+ AppInfo appInfo,
+ SourceCode source,
+ InternalOptions options,
+ ValueNumberGenerator valueNumberGenerator) {
assert source != null;
this.method = method;
this.appInfo = appInfo;
this.source = source;
- this.valueNumberGenerator = valueNumberGenerator;
+ this.valueNumberGenerator =
+ valueNumberGenerator != null ? valueNumberGenerator : new ValueNumberGenerator();
this.options = options;
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 00c3754..f523b46 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -495,7 +495,8 @@
executorService.submit(
() -> {
IRCode code =
- method.buildIR(appInfo, options, appInfo.originFor(method.method.holder));
+ method.buildIR(
+ appInfo, graphLense, options, appInfo.originFor(method.method.holder));
assert code != null;
assert !method.getCode().isOutlineCode();
// Instead of repeating all the optimizations of rewriteCode(), only run the
@@ -637,7 +638,8 @@
feedback.markProcessed(method, ConstraintWithTarget.NEVER);
return;
}
- IRCode code = method.buildIR(appInfo, options, appInfo.originFor(method.method.holder));
+ IRCode code =
+ method.buildIR(appInfo, graphLense, options, appInfo.originFor(method.method.holder));
if (code == null) {
feedback.markProcessed(method, ConstraintWithTarget.NEVER);
return;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
index 1170dab..85a0f99 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
@@ -187,20 +187,20 @@
// Cooked position to indicate positions in synthesized code (ie, for synchronization).
private Position syntheticPosition = null;
- private final DexMethod method;
+ private final DexMethod originalMethod;
private final Position callerPosition;
public JarSourceCode(
DexType clazz,
MethodNode node,
JarApplicationReader application,
- DexMethod method,
+ DexMethod originalMethod,
Position callerPosition) {
assert node != null;
assert node.desc != null;
this.node = node;
this.application = application;
- this.method = method;
+ this.originalMethod = originalMethod;
this.clazz = clazz;
this.callerPosition = callerPosition;
parameterTypes = Arrays.asList(application.getArgumentTypes(node.desc));
@@ -2862,12 +2862,12 @@
private Position getCanonicalPosition(int line) {
return canonicalPositions.computeIfAbsent(
- line, l -> new Position(l, null, method, callerPosition));
+ line, l -> new Position(l, null, originalMethod, callerPosition));
}
private Position getPreamblePosition() {
if (preamblePosition == null) {
- preamblePosition = Position.synthetic(0, method, null);
+ preamblePosition = Position.synthetic(0, originalMethod, null);
}
return preamblePosition;
}
@@ -2891,8 +2891,8 @@
}
syntheticPosition =
(min == Integer.MAX_VALUE)
- ? Position.noneWithMethod(method, callerPosition)
- : Position.synthetic(min < max ? min - 1 : min, method, callerPosition);
+ ? Position.noneWithMethod(originalMethod, callerPosition)
+ : Position.synthetic(min < max ? min - 1 : min, originalMethod, callerPosition);
}
return syntheticPosition;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/EnumOrdinalMapCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/EnumOrdinalMapCollector.java
index 1b68f7d..e23b534 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/EnumOrdinalMapCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/EnumOrdinalMapCollector.java
@@ -3,10 +3,12 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.optimize;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Instruction;
import com.android.tools.r8.ir.code.InstructionIterator;
@@ -30,12 +32,14 @@
public class EnumOrdinalMapCollector {
private final AppInfoWithLiveness appInfo;
+ private final GraphLense graphLense;
private final InternalOptions options;
private final Map<DexType, Reference2IntMap<DexField>> ordinalsMaps = new IdentityHashMap<>();
- public EnumOrdinalMapCollector(AppInfoWithLiveness appInfo, InternalOptions options) {
- this.appInfo = appInfo;
+ public EnumOrdinalMapCollector(AppView<AppInfoWithLiveness> appView, InternalOptions options) {
+ this.appInfo = appView.getAppInfo();
+ this.graphLense = appView.getGraphLense();
this.options = options;
}
@@ -55,7 +59,8 @@
return;
}
DexEncodedMethod initializer = clazz.getClassInitializer();
- IRCode code = initializer.getCode().buildIR(initializer, appInfo, options, clazz.origin);
+ IRCode code =
+ initializer.getCode().buildIR(initializer, appInfo, graphLense, options, clazz.origin);
Reference2IntMap<DexField> ordinalsMap = new Reference2IntArrayMap<>();
ordinalsMap.defaultReturnValue(-1);
InstructionIterator it = code.instructionIterator();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index 7ea7379..12baa2c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -409,7 +409,8 @@
Position callerPosition) {
// Build the IR for a yet not processed method, and perform minimal IR processing.
Origin origin = appInfo.originFor(target.method.holder);
- IRCode code = target.buildInliningIR(appInfo, options, generator, callerPosition, origin);
+ IRCode code =
+ target.buildInliningIR(appInfo, graphLense, options, generator, callerPosition, origin);
if (!target.isProcessed()) {
new LensCodeRewriter(graphLense, appInfo).rewrite(code, target);
}
@@ -586,7 +587,8 @@
invokePosition = Position.noneWithMethod(method.method, null);
}
assert invokePosition.callerPosition == null
- || invokePosition.getOutermostCaller().method == method.method;
+ || invokePosition.getOutermostCaller().method
+ == graphLense.getOriginalMethodSignature(method.method);
IRCode inlinee =
result.buildInliningIR(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
index 505d192..5f8fd6b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
@@ -20,6 +20,7 @@
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DexTypeList;
+import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.ParameterAnnotationsList;
import com.android.tools.r8.graph.UseRegistry;
@@ -1164,10 +1165,13 @@
@Override
public IRCode buildIR(
- DexEncodedMethod encodedMethod, AppInfo appInfo, InternalOptions options, Origin origin) {
+ DexEncodedMethod encodedMethod,
+ AppInfo appInfo,
+ GraphLense graphLense,
+ InternalOptions options,
+ Origin origin) {
OutlineSourceCode source = new OutlineSourceCode(outline);
- IRBuilder builder = new IRBuilder(encodedMethod, appInfo, source, options);
- return builder.build();
+ return new IRBuilder(encodedMethod, appInfo, source, options).build();
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
index a586355..c2fbc9e 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
@@ -3,12 +3,14 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.optimize;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Instruction;
import com.android.tools.r8.ir.code.InstructionIterator;
@@ -61,14 +63,16 @@
public class SwitchMapCollector {
private final AppInfoWithLiveness appInfo;
+ private final GraphLense graphLense;
private final InternalOptions options;
private final DexString switchMapPrefix;
private final DexType intArrayType;
private final Map<DexField, Int2ReferenceMap<DexField>> switchMaps = new IdentityHashMap<>();
- public SwitchMapCollector(AppInfoWithLiveness appInfo, InternalOptions options) {
- this.appInfo = appInfo;
+ public SwitchMapCollector(AppView<AppInfoWithLiveness> appView, InternalOptions options) {
+ this.appInfo = appView.getAppInfo();
+ this.graphLense = appView.getGraphLense();
this.options = options;
switchMapPrefix = appInfo.dexItemFactory.createString("$SwitchMap$");
intArrayType = appInfo.dexItemFactory.createType("[I");
@@ -92,7 +96,8 @@
List<DexEncodedField> switchMapFields = Arrays.stream(clazz.staticFields())
.filter(this::maybeIsSwitchMap).collect(Collectors.toList());
if (!switchMapFields.isEmpty()) {
- IRCode initializer = clazz.getClassInitializer().buildIR(appInfo, options, clazz.origin);
+ IRCode initializer =
+ clazz.getClassInitializer().buildIR(appInfo, graphLense, options, clazz.origin);
switchMapFields.forEach(field -> extractSwitchMap(field, initializer));
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java
index 7835da2..aa6be96 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java
@@ -8,6 +8,7 @@
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.graph.UseRegistry;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Position;
@@ -47,16 +48,27 @@
@Override
public final IRCode buildIR(
- DexEncodedMethod encodedMethod, AppInfo appInfo, InternalOptions options, Origin origin) {
+ DexEncodedMethod encodedMethod,
+ AppInfo appInfo,
+ GraphLense graphLense,
+ InternalOptions options,
+ Origin origin) {
return new IRBuilder(encodedMethod, appInfo, sourceCodeProvider.get(), options).build();
}
@Override
public IRCode buildInliningIR(
- DexEncodedMethod encodedMethod, AppInfo appInfo, InternalOptions options,
- ValueNumberGenerator valueNumberGenerator, Position callerPosition, Origin origin) {
- return new IRBuilder(encodedMethod, appInfo,
- sourceCodeProvider.get(), options, valueNumberGenerator).build();
+ DexEncodedMethod encodedMethod,
+ AppInfo appInfo,
+ GraphLense graphLense,
+ InternalOptions options,
+ ValueNumberGenerator valueNumberGenerator,
+ Position callerPosition,
+ Origin origin) {
+ IRBuilder builder =
+ new IRBuilder(
+ encodedMethod, appInfo, sourceCodeProvider.get(), options, valueNumberGenerator);
+ return builder.build();
}
@Override
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 6a12b60..bcd489e 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -94,6 +94,7 @@
private boolean tracingMainDex = false;
private final AppInfoWithSubtyping appInfo;
+ private final GraphLense graphLense;
private final InternalOptions options;
private RootSet rootSet;
@@ -218,15 +219,23 @@
*/
private final ProguardConfiguration.Builder compatibility;
- public Enqueuer(AppInfoWithSubtyping appInfo, InternalOptions options,
+ public Enqueuer(
+ AppInfoWithSubtyping appInfo,
+ GraphLense graphLense,
+ InternalOptions options,
boolean forceProguardCompatibility) {
- this(appInfo, options, forceProguardCompatibility, null, null);
+ this(appInfo, graphLense, options, forceProguardCompatibility, null, null);
}
- public Enqueuer(AppInfoWithSubtyping appInfo, InternalOptions options,
+ public Enqueuer(
+ AppInfoWithSubtyping appInfo,
+ GraphLense graphLense,
+ InternalOptions options,
boolean forceProguardCompatibility,
- ProguardConfiguration.Builder compatibility, ProtoLiteExtension protoLiteExtension) {
+ ProguardConfiguration.Builder compatibility,
+ ProtoLiteExtension protoLiteExtension) {
this.appInfo = appInfo;
+ this.graphLense = graphLense;
this.compatibility = compatibility;
this.options = options;
this.protoLiteExtension = protoLiteExtension;
@@ -1478,7 +1487,7 @@
private void handleProguardReflectiveBehavior(DexEncodedMethod method) {
DexType originHolder = method.method.holder;
Origin origin = appInfo.originFor(originHolder);
- IRCode code = method.buildIR(appInfo, options, origin);
+ IRCode code = method.buildIR(appInfo, graphLense, options, origin);
code.instructionIterator().forEachRemaining(instr ->
handleProguardReflectiveBehavior(instr, originHolder));
}
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java
index 59bd91b..a329513 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java
@@ -14,6 +14,7 @@
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.ir.code.Argument;
import com.android.tools.r8.ir.code.ArrayGet;
import com.android.tools.r8.ir.code.IRCode;
@@ -58,7 +59,8 @@
AppInfo appInfo = new AppInfo(dexApplication);
CodeInspector codeInspector = new CodeInspector(appInfo.app);
DexEncodedMethod foo = codeInspector.clazz(mainClass.getName()).method(signature).getMethod();
- IRCode irCode = foo.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
+ IRCode irCode =
+ foo.buildIR(appInfo, GraphLense.getIdentityLense(), TEST_OPTIONS, Origin.unknown());
NonNullTracker nonNullTracker = new NonNullTracker();
nonNullTracker.addNonNull(irCode);
TypeAnalysis analysis = new TypeAnalysis(appInfo, foo, irCode);
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
index d3efebe..9c1214c 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
@@ -14,6 +14,7 @@
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.ir.code.ArrayLength;
import com.android.tools.r8.ir.code.CheckCast;
import com.android.tools.r8.ir.code.ConstString;
@@ -122,7 +123,8 @@
.method(
new MethodSignature("subtractConstants8bitRegisters", "int", ImmutableList.of()))
.getMethod();
- IRCode irCode = subtract.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
+ IRCode irCode =
+ subtract.buildIR(appInfo, GraphLense.getIdentityLense(), TEST_OPTIONS, Origin.unknown());
TypeAnalysis analysis = new TypeAnalysis(appInfo, subtract, irCode);
analysis.forEach((v, l) -> {
assertEither(l, PRIMITIVE, NULL, TOP);
@@ -136,7 +138,8 @@
inspector.clazz("Test")
.method(new MethodSignature("fibonacci", "int", ImmutableList.of("int")))
.getMethod();
- IRCode irCode = fib.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
+ IRCode irCode =
+ fib.buildIR(appInfo, GraphLense.getIdentityLense(), TEST_OPTIONS, Origin.unknown());
TypeAnalysis analysis = new TypeAnalysis(appInfo, fib, irCode);
analysis.forEach((v, l) -> {
assertEither(l, PRIMITIVE, NULL);
@@ -150,7 +153,8 @@
inspector.clazz("Test")
.method(new MethodSignature("test1", "int[]", ImmutableList.of()))
.getMethod();
- IRCode irCode = test1.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
+ IRCode irCode =
+ test1.buildIR(appInfo, GraphLense.getIdentityLense(), TEST_OPTIONS, Origin.unknown());
TypeAnalysis analysis = new TypeAnalysis(appInfo, test1, irCode);
Value array = null;
InstructionIterator iterator = irCode.instructionIterator();
@@ -181,7 +185,8 @@
inspector.clazz("Test")
.method(new MethodSignature("test4", "int[]", ImmutableList.of()))
.getMethod();
- IRCode irCode = test4.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
+ IRCode irCode =
+ test4.buildIR(appInfo, GraphLense.getIdentityLense(), TEST_OPTIONS, Origin.unknown());
TypeAnalysis analysis = new TypeAnalysis(appInfo, test4, irCode);
Value array = null;
InstructionIterator iterator = irCode.instructionIterator();
@@ -212,7 +217,8 @@
inspector.clazz("Test")
.method(new MethodSignature("loop2", "void", ImmutableList.of()))
.getMethod();
- IRCode irCode = loop2.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
+ IRCode irCode =
+ loop2.buildIR(appInfo, GraphLense.getIdentityLense(), TEST_OPTIONS, Origin.unknown());
TypeAnalysis analysis = new TypeAnalysis(appInfo, loop2, irCode);
analysis.forEach((v, l) -> {
if (l.isClassTypeLatticeElement()) {
@@ -231,7 +237,8 @@
inspector.clazz("Test")
.method(new MethodSignature("test2_throw", "int", ImmutableList.of()))
.getMethod();
- IRCode irCode = test2.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
+ IRCode irCode =
+ test2.buildIR(appInfo, GraphLense.getIdentityLense(), TEST_OPTIONS, Origin.unknown());
TypeAnalysis analysis = new TypeAnalysis(appInfo, test2, irCode);
analysis.forEach((v, l) -> {
if (l.isClassTypeLatticeElement()) {
@@ -257,7 +264,8 @@
ConstString.class, new ClassTypeLatticeElement(appInfo.dexItemFactory.stringType, false),
CheckCast.class, new ClassTypeLatticeElement(test, true),
NewInstance.class, new ClassTypeLatticeElement(test, false));
- IRCode irCode = method.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
+ IRCode irCode =
+ method.buildIR(appInfo, GraphLense.getIdentityLense(), TEST_OPTIONS, Origin.unknown());
TypeAnalysis analysis = new TypeAnalysis(appInfo, method, irCode);
analysis.forEach((v, l) -> verifyTypeEnvironment(expectedLattices, v, l));
}
@@ -275,7 +283,8 @@
ConstString.class, new ClassTypeLatticeElement(appInfo.dexItemFactory.stringType, false),
InstanceOf.class, PRIMITIVE,
StaticGet.class, new ClassTypeLatticeElement(test, true));
- IRCode irCode = method.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
+ IRCode irCode =
+ method.buildIR(appInfo, GraphLense.getIdentityLense(), TEST_OPTIONS, Origin.unknown());
TypeAnalysis analysis = new TypeAnalysis(appInfo, method, irCode);
analysis.forEach((v, l) -> verifyTypeEnvironment(expectedLattices, v, l));
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java
index 9993b68..b1647cc 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java
@@ -13,6 +13,7 @@
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.InstancePut;
import com.android.tools.r8.ir.code.Instruction;
@@ -48,7 +49,8 @@
AppInfo appInfo = new AppInfo(dexApplication);
CodeInspector codeInspector = new CodeInspector(appInfo.app);
DexEncodedMethod foo = codeInspector.clazz(testClass.getName()).method(signature).getMethod();
- IRCode irCode = foo.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
+ IRCode irCode =
+ foo.buildIR(appInfo, GraphLense.getIdentityLense(), TEST_OPTIONS, Origin.unknown());
checkCountOfNonNull(irCode, 0);
NonNullTracker nonNullTracker = new NonNullTracker();
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
index fc41672..0df78bc 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -38,6 +38,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DexTypeList;
import com.android.tools.r8.graph.DirectMappedDexApplication;
+import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.ParameterAnnotationsList;
import com.android.tools.r8.ir.code.CatchHandlers;
@@ -650,7 +651,8 @@
DexAnnotationSet.empty(),
ParameterAnnotationsList.empty(),
code);
- IRCode ir = code.buildIR(method, null, options, Origin.unknown());
+ IRCode ir =
+ code.buildIR(method, null, GraphLense.getIdentityLense(), options, Origin.unknown());
RegisterAllocator allocator = new LinearScanRegisterAllocator(ir, options);
method.setCode(ir, allocator, options);
directMethods[i] = method;
diff --git a/src/test/java/com/android/tools/r8/naming/NamingTestBase.java b/src/test/java/com/android/tools/r8/naming/NamingTestBase.java
index 5cc07a4..ed95627 100644
--- a/src/test/java/com/android/tools/r8/naming/NamingTestBase.java
+++ b/src/test/java/com/android/tools/r8/naming/NamingTestBase.java
@@ -84,7 +84,9 @@
new RootSetBuilder(appInfo, program, configuration.getRules(), options).run(executor);
}
- Enqueuer enqueuer = new Enqueuer(appInfo, options, options.forceProguardCompatibility);
+ Enqueuer enqueuer =
+ new Enqueuer(
+ appInfo, GraphLense.getIdentityLense(), options, options.forceProguardCompatibility);
appInfo = enqueuer.traceApplication(rootSet, executor, timing);
return new Minifier(appInfo.withLiveness(), rootSet, options).run(timing);
}
diff --git a/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java b/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
index 22cab2a..23c8933 100644
--- a/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.resolution.singletarget.Main;
import com.android.tools.r8.resolution.singletarget.one.AbstractSubClass;
import com.android.tools.r8.resolution.singletarget.one.AbstractTopClass;
@@ -107,8 +108,13 @@
ExecutorService executor = Executors.newSingleThreadExecutor();
RootSet rootSet = new RootSetBuilder(appInfoWithSubtyping, application,
buildKeepRuleForClass(Main.class, application.dexItemFactory), options).run(executor);
- appInfo = new Enqueuer(appInfoWithSubtyping, options, options.forceProguardCompatibility)
- .traceApplication(rootSet, executor, timing);
+ appInfo =
+ new Enqueuer(
+ appInfoWithSubtyping,
+ GraphLense.getIdentityLense(),
+ options,
+ options.forceProguardCompatibility)
+ .traceApplication(rootSet, executor, timing);
// We do not run the tree pruner to ensure that the hierarchy is as designed and not modified
// due to liveness.
}
diff --git a/src/test/java/com/android/tools/r8/smali/CatchSuccessorFallthroughTest.java b/src/test/java/com/android/tools/r8/smali/CatchSuccessorFallthroughTest.java
index 6b90d88..00d385f 100644
--- a/src/test/java/com/android/tools/r8/smali/CatchSuccessorFallthroughTest.java
+++ b/src/test/java/com/android/tools/r8/smali/CatchSuccessorFallthroughTest.java
@@ -7,6 +7,7 @@
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.ir.code.BasicBlock;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Phi;
@@ -68,7 +69,9 @@
DexEncodedMethod method = getMethod(originalApplication, methodSig);
// Get the IR pre-optimization.
- IRCode code = method.buildIR(null, new InternalOptions(), Origin.unknown());
+ IRCode code =
+ method.buildIR(
+ null, GraphLense.getIdentityLense(), new InternalOptions(), Origin.unknown());
// Find the exit block and assert that the value is a phi merging the exceptional edge
// with the normal edge.