[LIR] Add support for DebugLocalRead.
Bug: b/225838009
Change-Id: Id817527267d07f19515af610540091b15cb5539b
diff --git a/src/main/java/com/android/tools/r8/ir/code/DebugLocalRead.java b/src/main/java/com/android/tools/r8/ir/code/DebugLocalRead.java
index 5a3e094..3e8e999 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DebugLocalRead.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DebugLocalRead.java
@@ -12,6 +12,7 @@
import com.android.tools.r8.ir.optimize.DeadCodeRemover.DeadInstructionResult;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
+import com.android.tools.r8.lightir.LirBuilder;
public class DebugLocalRead extends Instruction {
private static final String ERROR_MESSAGE = "Unexpected attempt to emit debug-local read.";
@@ -51,6 +52,11 @@
}
@Override
+ public void buildLir(LirBuilder<Value, ?> builder) {
+ builder.addDebugLocalRead();
+ }
+
+ @Override
public boolean identicalNonValueNonPositionParts(Instruction other) {
return other.isDebugLocalRead();
}
diff --git a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
index 8ab729f..9c3cb42 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -31,6 +31,7 @@
import com.android.tools.r8.ir.code.ConstClass;
import com.android.tools.r8.ir.code.ConstNumber;
import com.android.tools.r8.ir.code.ConstString;
+import com.android.tools.r8.ir.code.DebugLocalRead;
import com.android.tools.r8.ir.code.DebugLocalWrite;
import com.android.tools.r8.ir.code.DebugPosition;
import com.android.tools.r8.ir.code.DexItemBasedConstString;
@@ -745,6 +746,11 @@
}
@Override
+ public void onDebugLocalRead() {
+ addInstruction(new DebugLocalRead());
+ }
+
+ @Override
public void onInvokeMultiNewArray(DexType type, List<EV> arguments) {
Value dest =
getOutValueForNextInstruction(
diff --git a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
index 1f4ac6b..b5ece03 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -670,6 +670,10 @@
return addOneValueInstruction(LirOpcodes.DEBUGLOCALWRITE, src);
}
+ public LirBuilder<V, EV> addDebugLocalRead() {
+ return addNoOperandInstruction(LirOpcodes.DEBUGLOCALREAD);
+ }
+
public LirCode<EV> build() {
assert metadata != null;
int constantsCount = constants.size();
diff --git a/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java b/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
index d7ccc91..df85c0b 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
@@ -14,7 +14,11 @@
static boolean isOneByteInstruction(int opcode) {
assert opcode >= ACONST_NULL;
- return opcode <= DCONST_1 || opcode == RETURN || opcode == DEBUGPOS || opcode == FALLTHROUGH;
+ return opcode <= DCONST_1
+ || opcode == RETURN
+ || opcode == DEBUGPOS
+ || opcode == FALLTHROUGH
+ || opcode == DEBUGLOCALREAD;
}
// Instructions maintaining the same opcode as defined in CF.
@@ -200,6 +204,7 @@
int NEWUNBOXEDENUMINSTANCE = 217;
int INOT = 218;
int LNOT = 219;
+ int DEBUGLOCALREAD = 220;
static String toString(int opcode) {
switch (opcode) {
@@ -524,6 +529,8 @@
return "INOT";
case LNOT:
return "LNOT";
+ case DEBUGLOCALREAD:
+ return "DEBUGLOCALREAD";
default:
throw new Unreachable("Unexpected LIR opcode: " + opcode);
diff --git a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
index e9b52f7..f715f0e 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -371,6 +371,10 @@
onInstruction();
}
+ public void onDebugLocalRead() {
+ onInstruction();
+ }
+
public void onInvokeMultiNewArray(DexType type, List<EV> arguments) {
onInstruction();
}
@@ -1111,6 +1115,11 @@
onDebugLocalWrite(srcIndex);
return;
}
+ case LirOpcodes.DEBUGLOCALREAD:
+ {
+ onDebugLocalRead();
+ return;
+ }
case LirOpcodes.MULTIANEWARRAY:
{
DexType type = getNextDexTypeOperand(view);
diff --git a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
index c8d335f..02b6fc3 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -227,6 +227,11 @@
}
@Override
+ public void onDebugLocalRead() {
+ // Nothing to add.
+ }
+
+ @Override
public void onInvokeMultiNewArray(DexType type, List<EV> arguments) {
appendOutValue();
appendValueArguments(arguments);