Avoid double-lens application to field instructions in backend
Bug: b/267463817
Change-Id: I0b5235619c0dc3773b82d6032a5755006c01d4cb
diff --git a/src/main/java/com/android/tools/r8/dex/DexOutputBuffer.java b/src/main/java/com/android/tools/r8/dex/DexOutputBuffer.java
index d9cabaa..a1a7eb2 100644
--- a/src/main/java/com/android/tools/r8/dex/DexOutputBuffer.java
+++ b/src/main/java/com/android/tools/r8/dex/DexOutputBuffer.java
@@ -5,6 +5,7 @@
import com.android.tools.r8.ByteBufferProvider;
import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexWritableCode;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
@@ -92,6 +93,7 @@
}
public void putInstructions(
+ AppView<?> appView,
DexWritableCode code,
ProgramMethod context,
ObjectToOffsetMapping mapping,
@@ -101,7 +103,12 @@
assert byteBuffer.position() % 2 == 0;
ShortBuffer shortBuffer = byteBuffer.asShortBuffer();
code.writeDex(
- shortBuffer, context, mapping.getGraphLens(), mapping.getLensCodeRewriter(), mapping);
+ shortBuffer,
+ context,
+ mapping.getGraphLens(),
+ code.getCodeLens(appView),
+ mapping.getLensCodeRewriter(),
+ mapping);
code.writeKeepRulesForDesugaredLibrary(desugaredLibraryCodeToKeep);
byteBuffer.position(byteBuffer.position() + shortBuffer.position() * Short.BYTES);
}
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index 9ddc2d2..a1e6639 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -545,7 +545,7 @@
int insnSizeOffset = dest.position();
dest.forward(4);
// Write instruction stream.
- dest.putInstructions(code, method, mapping, desugaredLibraryCodeToKeep);
+ dest.putInstructions(appView, code, method, mapping, desugaredLibraryCodeToKeep);
// Compute size and do the backward/forward dance to write the size at the beginning.
int insnSize = dest.position() - insnSizeOffset - 4;
dest.rewind(insnSize + 4);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java b/src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java
index 650655a..6d95477 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java
@@ -74,6 +74,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
DexType rewritten = graphLens.lookupType(getType());
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstClass.java b/src/main/java/com/android/tools/r8/dex/code/DexConstClass.java
index bc476c1..791eef5 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstClass.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstClass.java
@@ -74,6 +74,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
DexType rewritten = graphLens.lookupType(getType());
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java
index b909f64..7cf55ad 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java
@@ -78,6 +78,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
DexMethodHandle rewritten =
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java
index 15bee8c..a4e1941 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java
@@ -76,6 +76,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
DexProto rewritten = rewriter.rewriteProto(getMethodType());
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstString.java b/src/main/java/com/android/tools/r8/dex/code/DexConstString.java
index e143d89..da79e38 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstString.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstString.java
@@ -89,6 +89,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
int index = BBBB.getOffset(mapping);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java
index 228258d..62b99a3 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java
@@ -56,6 +56,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(3, dest); // Pseudo-opcode = 0x0300
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java
index ab52b2b..08d174c 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java
@@ -72,6 +72,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
DexType rewritten = graphLens.lookupType(getType());
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java
index 5e473dc..5a7ab7d 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java
@@ -72,6 +72,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
DexType rewritten = graphLens.lookupType(getType());
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java
index ba29cbe..1b1ad0c 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java
@@ -35,6 +35,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(AA, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java
index 174c89b..ce80312 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java
@@ -27,6 +27,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(0, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java
index 09e3fb6..805512d 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java
@@ -49,6 +49,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(B, A, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java
index 393ab88..7a5ada4 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java
@@ -35,6 +35,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(AA, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java
index 979bcc7..711072d 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java
@@ -43,6 +43,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(B, A, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java
index a03b9c5..e226b0b 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java
@@ -34,6 +34,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(0, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java
index 246c6cc..40d5684 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java
@@ -43,6 +43,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(AA, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java
index 3d66ad2..2351a2c 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java
@@ -45,6 +45,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(AA, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java
index 93cd025..c2fad2b 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java
@@ -47,6 +47,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(AA, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java
index 222fc09..f9c8419 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java
@@ -49,6 +49,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(AA, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java
index 53d247c..715f719 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java
@@ -49,6 +49,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(B, A, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java
index c276ca1..4ca9fcf 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java
@@ -51,6 +51,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(B, A, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java
index 3cd881d..9d8f38c 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java
@@ -44,6 +44,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(AA, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java
index 1e1b130..c6ee23e 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java
@@ -48,6 +48,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(AA, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java
index cfd2bf7..df14fb9 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java
@@ -33,6 +33,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(0, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java
index ae0ca6c..d5b1037 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java
@@ -47,6 +47,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(AA, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java
index 942c5e2..67ae1b5 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java
@@ -43,6 +43,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(AA, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java
index 7f26c21..07cea77 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java
@@ -43,6 +43,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(AA, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java
index 5389c2f..7cd9e2c 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java
@@ -45,6 +45,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(0, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
index 2f4adc5..91657d8 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
@@ -119,6 +119,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
// The method is one of java.lang.MethodHandle.invoke/invokeExact.
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
index 8aa065a..0bf1e92 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
@@ -57,6 +57,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
// The method is one of java.lang.MethodHandle.invoke/invokeExact.
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java
index ddce5ad..15cb63a 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java
@@ -43,6 +43,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(AA, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java
index d1c298a..1f77b9f 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java
@@ -42,9 +42,10 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
- DexField lookup = graphLens.lookupField(getField());
+ DexField lookup = graphLens.lookupField(getField(), codeLens);
writeFirst(B, A, dest);
write16BitReference(lookup, dest, mapping);
}
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java b/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java
index 8591fd9..77a2f9f 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java
@@ -118,6 +118,7 @@
ShortBuffer buffer,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
// We intentionally apply the graph lens first, and then the init class lens, using the fact
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java b/src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java
index 601dffb..ba204cd 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java
@@ -88,6 +88,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
DexType lookup = graphLens.lookupType(getType());
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java b/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java
index e6362d0..118556a 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java
@@ -393,6 +393,7 @@
ShortBuffer buffer,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java
index 605b420..28464af 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java
@@ -79,6 +79,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(A, G, dest);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java
index a88f338..51f0908 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java
@@ -79,6 +79,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
DexCallSite rewritten = rewriter.rewriteCallSite(getCallSite(), context);
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java
index 9340e4a..a390eff 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java
@@ -50,6 +50,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
MethodLookupResult lookup =
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java
index 34243ac..3c1ffc7 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java
@@ -50,6 +50,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
MethodLookupResult lookup =
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java b/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java
index ddaf074..451eef1 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java
@@ -101,6 +101,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
throw new Unreachable(
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexNewArray.java b/src/main/java/com/android/tools/r8/dex/code/DexNewArray.java
index 8d35555..285b82e 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexNewArray.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNewArray.java
@@ -78,6 +78,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
DexType lookup = graphLens.lookupType(getType());
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java b/src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java
index 4382e71..e3bc04d 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java
@@ -65,6 +65,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
DexType rewritten = graphLens.lookupType(getType());
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java b/src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java
index 387952c..3992859 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java
@@ -64,6 +64,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
throw new Unreachable();
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java
index 95f6eed..77b35f6 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java
@@ -52,6 +52,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(1, dest); // Pseudo-opcode = 0x0100
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java b/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java
index 3101663..8f0b9e8 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java
@@ -117,6 +117,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
throw new Unreachable(
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java
index 85c8ea3..0e9b3b8 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java
@@ -38,9 +38,10 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
- DexField rewritten = graphLens.lookupField(getField());
+ DexField rewritten = graphLens.lookupField(getField(), codeLens);
writeFirst(AA, dest);
write16BitReference(rewritten, dest, mapping);
}
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java
index 838e4ea..f0059d9 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java
@@ -56,6 +56,7 @@
ShortBuffer dest,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
writeFirst(2, dest); // Pseudo-opcode = 0x0200
diff --git a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
index 165ff81..601ce08 100644
--- a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
@@ -371,13 +371,14 @@
ShortBuffer shortBuffer,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
LensCodeRewriterUtils lensCodeRewriter,
ObjectToOffsetMapping mapping) {
DexMethod parentConstructor = getParentConstructor(context, mapping.dexItemFactory());
MethodLookupResult lookupResult = graphLens.lookupInvokeDirect(parentConstructor, context);
new DexInvokeDirect(1, lookupResult.getReference(), 0, 0, 0, 0, 0)
- .write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
- new DexReturnVoid().write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
+ .write(shortBuffer, context, graphLens, codeLens, mapping, lensCodeRewriter);
+ new DexReturnVoid().write(shortBuffer, context, graphLens, codeLens, mapping, lensCodeRewriter);
}
@Override
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 09db76d..f244b31 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -78,6 +78,20 @@
.withItemArray(c -> c.instructions);
}
+ private DexCode(DexCode code) {
+ this(
+ code.registerSize,
+ code.incomingRegisterSize,
+ code.outgoingRegisterSize,
+ code.instructions,
+ code.tries,
+ code.handlers,
+ code.debugInfo,
+ code.metadata);
+ this.debugInfoForWriting = code.debugInfoForWriting;
+ this.highestSortingString = code.highestSortingString;
+ }
+
public DexCode(int registerSize, int insSize, int outsSize, DexInstruction[] instructions) {
this(
registerSize,
@@ -131,6 +145,16 @@
hashCode(); // Cache the hash code eagerly.
}
+ public DexCode withCodeLens(GraphLens codeLens) {
+ return new DexCode(this) {
+
+ @Override
+ public GraphLens getCodeLens(AppView<?> appView) {
+ return codeLens;
+ }
+ };
+ }
+
@Override
public DexCode self() {
return this;
@@ -730,10 +754,11 @@
ShortBuffer shortBuffer,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
LensCodeRewriterUtils lensCodeRewriter,
ObjectToOffsetMapping mapping) {
for (DexInstruction instruction : instructions) {
- instruction.write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
+ instruction.write(shortBuffer, context, graphLens, codeLens, mapping, lensCodeRewriter);
}
}
diff --git a/src/main/java/com/android/tools/r8/graph/DexWritableCode.java b/src/main/java/com/android/tools/r8/graph/DexWritableCode.java
index 1458f08..af4b8a0 100644
--- a/src/main/java/com/android/tools/r8/graph/DexWritableCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexWritableCode.java
@@ -63,6 +63,8 @@
void writeKeepRulesForDesugaredLibrary(CodeToKeep codeToKeep);
+ GraphLens getCodeLens(AppView<?> appView);
+
DexDebugInfoForWriting getDebugInfoForWriting();
DexWritableCodeKind getDexWritableCodeKind();
@@ -99,6 +101,7 @@
ShortBuffer shortBuffer,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
LensCodeRewriterUtils lensCodeRewriter,
ObjectToOffsetMapping mapping);
}
diff --git a/src/main/java/com/android/tools/r8/graph/NestedGraphLens.java b/src/main/java/com/android/tools/r8/graph/NestedGraphLens.java
index fe15a02..4c61282 100644
--- a/src/main/java/com/android/tools/r8/graph/NestedGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/NestedGraphLens.java
@@ -135,7 +135,7 @@
if (this == codeLens) {
return originalField;
}
- DexField renamedField = getPrevious().getRenamedFieldSignature(originalField);
+ DexField renamedField = getPrevious().getRenamedFieldSignature(originalField, codeLens);
return internalGetNextFieldSignature(renamedField);
}
diff --git a/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java b/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java
index dc18cfe..57baddf 100644
--- a/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java
+++ b/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java
@@ -211,19 +211,21 @@
ShortBuffer shortBuffer,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
LensCodeRewriterUtils lensCodeRewriter,
ObjectToOffsetMapping mapping) {
int register = 0;
int notUsed = 0;
int argumentCount = 1;
new DexNewInstance(register, exceptionType)
- .write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
+ .write(shortBuffer, context, graphLens, codeLens, mapping, lensCodeRewriter);
DexMethod instanceInitializer =
lensCodeRewriter.dexItemFactory().createInstanceInitializer(exceptionType);
new DexInvokeDirect(
argumentCount, instanceInitializer, register, notUsed, notUsed, notUsed, notUsed)
- .write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
- new DexThrow(register).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
+ .write(shortBuffer, context, graphLens, codeLens, mapping, lensCodeRewriter);
+ new DexThrow(register)
+ .write(shortBuffer, context, graphLens, codeLens, mapping, lensCodeRewriter);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java b/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
index 661cefb..a15e551 100644
--- a/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
+++ b/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
@@ -248,11 +248,14 @@
ShortBuffer shortBuffer,
ProgramMethod context,
GraphLens graphLens,
+ GraphLens codeLens,
LensCodeRewriterUtils lensCodeRewriter,
ObjectToOffsetMapping mapping) {
int register = 0;
- new DexConst4(register, 0).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
- new DexThrow(register).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
+ new DexConst4(register, 0)
+ .write(shortBuffer, context, graphLens, codeLens, mapping, lensCodeRewriter);
+ new DexThrow(register)
+ .write(shortBuffer, context, graphLens, codeLens, mapping, lensCodeRewriter);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/SyntheticInitializerConverter.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/SyntheticInitializerConverter.java
index a3e5972..1872754 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/SyntheticInitializerConverter.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/SyntheticInitializerConverter.java
@@ -6,7 +6,9 @@
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
import com.android.tools.r8.horizontalclassmerging.IRCodeProvider;
@@ -78,10 +80,18 @@
assert appView.options().isGeneratingDex();
assert mode.isFinal();
clazz.forEachProgramInstanceInitializerMatching(
- method -> !method.getCode().isDexCode(),
+ method -> method.getCode().isCfCode(),
method -> {
+ GraphLens codeLens = method.getDefinition().getCode().getCodeLens(appView);
+ assert codeLens != appView.codeLens();
+
+ // Convert to dex.
processMethod(method, converter);
- assert method.getDefinition().getCode().isDexCode();
+
+ // Recover code lens.
+ Code code = method.getDefinition().getCode();
+ assert code.isDexCode();
+ method.setCode(code.asDexCode().withCodeLens(codeLens), appView);
});
}