[LIR] Add support for InitClass.
Bug: b/225838009
Change-Id: Id397b1ff43487de909244fb7aad2ea0b252da03f
diff --git a/src/main/java/com/android/tools/r8/ir/code/InitClass.java b/src/main/java/com/android/tools/r8/ir/code/InitClass.java
index 765d4a1..7d1b853 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InitClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InitClass.java
@@ -23,6 +23,7 @@
import com.android.tools.r8.ir.conversion.DexBuilder;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
+import com.android.tools.r8.lightir.LirBuilder;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
public class InitClass extends Instruction {
@@ -82,6 +83,11 @@
}
@Override
+ public void buildLir(LirBuilder<Value, ?> builder) {
+ builder.addInitClass(clazz);
+ }
+
+ @Override
public boolean definitelyTriggersClassInitialization(
DexType clazz,
ProgramMethod context,
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 c80020b..ef76924 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -40,6 +40,7 @@
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.If;
import com.android.tools.r8.ir.code.IfType;
+import com.android.tools.r8.ir.code.InitClass;
import com.android.tools.r8.ir.code.InstanceGet;
import com.android.tools.r8.ir.code.InstanceOf;
import com.android.tools.r8.ir.code.InstancePut;
@@ -843,5 +844,11 @@
Value dest = getOutValueForNextInstruction(type);
addInstruction(new NewUnboxedEnumInstance(clazz, ordinal, dest));
}
+
+ @Override
+ public void onInitClass(DexType clazz) {
+ Value dest = getOutValueForNextInstruction(TypeElement.getInt());
+ addInstruction(new InitClass(dest, clazz));
+ }
}
}
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 b5ece03..bfd9541 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -849,4 +849,8 @@
ByteUtils.writeEncodedInt(ordinal, writer::writeOperand);
return this;
}
+
+ public LirBuilder<V, EV> addInitClass(DexType clazz) {
+ return addOneItemInstruction(LirOpcodes.INITCLASS, clazz);
+ }
}
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 df85c0b..7df9b5a 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
@@ -205,6 +205,7 @@
int INOT = 218;
int LNOT = 219;
int DEBUGLOCALREAD = 220;
+ int INITCLASS = 221;
static String toString(int opcode) {
switch (opcode) {
@@ -531,6 +532,8 @@
return "LNOT";
case DEBUGLOCALREAD:
return "DEBUGLOCALREAD";
+ case INITCLASS:
+ return "INITCLASS";
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 57e0914..c999baf 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -482,6 +482,10 @@
onInstruction();
}
+ public void onInitClass(DexType clazz) {
+ onInstruction();
+ }
+
private DexItem getConstantItem(int index) {
return code.getConstantItem(index);
}
@@ -1177,6 +1181,12 @@
onNot(opcode == LirOpcodes.INOT ? NumericType.INT : NumericType.LONG, value);
return;
}
+ case LirOpcodes.INITCLASS:
+ {
+ DexType clazz = getNextDexTypeOperand(view);
+ onInitClass(clazz);
+ return;
+ }
default:
throw new Unimplemented("No dispatch for opcode " + LirOpcodes.toString(opcode));
}
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 02b6fc3..74d0956 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -390,4 +390,9 @@
public void onNewUnboxedEnumInstance(DexType type, int ordinal) {
appendOutValue().append("type(").append(type).append(") ordinal(").append(ordinal).append(")");
}
+
+ @Override
+ public void onInitClass(DexType clazz) {
+ builder.append(clazz);
+ }
}