[LIR] Add support for const method-handle and method-type.
Bug: b/225838009
Change-Id: I6af20a6bcd596ae8be627963e84b20b715432742
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java b/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java
index 15afa68..58928b0 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java
@@ -22,6 +22,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;
public class ConstMethodHandle extends ConstInstruction {
@@ -72,6 +73,11 @@
}
@Override
+ public void buildLir(LirBuilder<Value, ?> builder) {
+ builder.addConstMethodHandle(methodHandle);
+ }
+
+ @Override
public boolean identicalNonValueNonPositionParts(Instruction other) {
return other.isConstMethodHandle() && other.asConstMethodHandle().methodHandle == methodHandle;
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java b/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
index 0b586ca..87031d2 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
@@ -20,6 +20,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;
public class ConstMethodType extends ConstInstruction {
@@ -70,6 +71,11 @@
}
@Override
+ public void buildLir(LirBuilder<Value, ?> builder) {
+ builder.addConstMethodType(methodType);
+ }
+
+ @Override
public boolean identicalNonValueNonPositionParts(Instruction other) {
return other.isConstMethodType() && other.asConstMethodType().methodType == methodType;
}
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 421be9b..babbcdf 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -9,6 +9,7 @@
import com.android.tools.r8.graph.DexCallSite;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexMethodHandle;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
@@ -29,6 +30,8 @@
import com.android.tools.r8.ir.code.Cmp;
import com.android.tools.r8.ir.code.Cmp.Bias;
import com.android.tools.r8.ir.code.ConstClass;
+import com.android.tools.r8.ir.code.ConstMethodHandle;
+import com.android.tools.r8.ir.code.ConstMethodType;
import com.android.tools.r8.ir.code.ConstNumber;
import com.android.tools.r8.ir.code.ConstString;
import com.android.tools.r8.ir.code.DebugLocalRead;
@@ -509,6 +512,24 @@
}
@Override
+ public void onConstMethodHandle(DexMethodHandle methodHandle) {
+ TypeElement handleType =
+ TypeElement.fromDexType(
+ appView.dexItemFactory().methodHandleType, Nullability.definitelyNotNull(), appView);
+ Value dest = getOutValueForNextInstruction(handleType);
+ addInstruction(new ConstMethodHandle(dest, methodHandle));
+ }
+
+ @Override
+ public void onConstMethodType(DexProto methodType) {
+ TypeElement typeElement =
+ TypeElement.fromDexType(
+ appView.dexItemFactory().methodTypeType, Nullability.definitelyNotNull(), appView);
+ Value dest = getOutValueForNextInstruction(typeElement);
+ addInstruction(new ConstMethodType(dest, methodType));
+ }
+
+ @Override
public void onNumberConversion(NumericType from, NumericType to, EV value) {
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 8c17950..5a8ccd0 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -16,6 +16,7 @@
import com.android.tools.r8.graph.DexItem;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexMethodHandle;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
@@ -387,6 +388,14 @@
return addOneItemInstruction(LirOpcodes.LDC, type);
}
+ public LirBuilder<V, EV> addConstMethodHandle(DexMethodHandle methodHandle) {
+ return addOneItemInstruction(LirOpcodes.LDC, methodHandle);
+ }
+
+ public LirBuilder<V, EV> addConstMethodType(DexProto methodType) {
+ return addOneItemInstruction(LirOpcodes.LDC, methodType);
+ }
+
public LirBuilder<V, EV> addNeg(NumericType type, V value) {
int opcode;
switch (type) {
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 781db23..5b8458a 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItem;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexMethodHandle;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
@@ -101,6 +102,14 @@
onInstruction();
}
+ public void onConstMethodHandle(DexMethodHandle methodHandle) {
+ onInstruction();
+ }
+
+ public void onConstMethodType(DexProto methodType) {
+ onInstruction();
+ }
+
private void onArrayGetInternal(MemberType type, LirInstructionView view) {
if (type.isObject()) {
DexType destType = (DexType) getConstantItem(view.getNextConstantOperand());
@@ -515,6 +524,14 @@
onConstClass((DexType) item);
return;
}
+ if (item instanceof DexMethodHandle) {
+ onConstMethodHandle((DexMethodHandle) item);
+ return;
+ }
+ if (item instanceof DexProto) {
+ onConstMethodType((DexProto) item);
+ return;
+ }
throw new Unimplemented();
}
case LirOpcodes.ICONST_M1:
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 b20e303..2598acb3 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.graph.DexCallSite;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexMethodHandle;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
@@ -166,6 +167,16 @@
}
@Override
+ public void onConstMethodHandle(DexMethodHandle methodHandle) {
+ appendOutValue().append("methodHandle(").append(methodHandle).append(")");
+ }
+
+ @Override
+ public void onConstMethodType(DexProto methodType) {
+ appendOutValue().append("methodType(").append(methodType).append(")");
+ }
+
+ @Override
public void onBinop(NumericType type, EV left, EV right) {
appendOutValue();
appendValueArguments(left, right);