[LIR] Add support for InvokeCustom.
Bug: b/225838009
Change-Id: I5841f6661ea0e6c21fb26768a8ca543435e6a0c5
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
index 92ecb73..4539f17 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
@@ -25,6 +25,7 @@
import com.android.tools.r8.ir.desugar.LambdaDescriptor;
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;
import java.util.List;
@@ -157,6 +158,11 @@
}
@Override
+ public void buildLir(LirBuilder<Value, ?> builder) {
+ builder.addInvokeCustom(getCallSite(), arguments());
+ }
+
+ @Override
public boolean identicalNonValueNonPositionParts(Instruction other) {
return other.isInvokeCustom() && callSite == other.asInvokeCustom().callSite;
}
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 2244a37..8ab729f 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -6,8 +6,10 @@
import com.android.tools.r8.errors.Unimplemented;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppView;
+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.DexProto;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
@@ -42,6 +44,7 @@
import com.android.tools.r8.ir.code.InstancePut;
import com.android.tools.r8.ir.code.Instruction;
import com.android.tools.r8.ir.code.IntSwitch;
+import com.android.tools.r8.ir.code.InvokeCustom;
import com.android.tools.r8.ir.code.InvokeDirect;
import com.android.tools.r8.ir.code.InvokeInterface;
import com.android.tools.r8.ir.code.InvokeMultiNewArray;
@@ -618,10 +621,23 @@
addInstruction(instruction);
}
+ @Override
+ public void onInvokeCustom(DexCallSite callSite, List<EV> arguments) {
+ Value dest = getInvokeInstructionOutputValue(callSite.methodProto);
+ List<Value> ssaArgumentValues = getValues(arguments);
+ InvokeCustom instruction = new InvokeCustom(callSite, dest, ssaArgumentValues);
+ addInstruction(instruction);
+ }
+
private Value getInvokeInstructionOutputValue(DexMethod target) {
- return target.getReturnType().isVoidType()
+ return getInvokeInstructionOutputValue(target.getProto());
+ }
+
+ private Value getInvokeInstructionOutputValue(DexProto target) {
+ DexType returnType = target.getReturnType();
+ return returnType.isVoidType()
? null
- : getOutValueForNextInstruction(target.getReturnType().toTypeElement(appView));
+ : getOutValueForNextInstruction(returnType.toTypeElement(appView));
}
@Override
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 6f56349..1f4ac6b 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.errors.Unimplemented;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DebugLocalInfo;
+import com.android.tools.r8.graph.DexCallSite;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItem;
import com.android.tools.r8.graph.DexItemFactory;
@@ -497,7 +498,7 @@
LirOpcodes.PUTFIELD, Collections.singletonList(field), ImmutableList.of(object, value));
}
- public LirBuilder<V, EV> addInvokeInstruction(int opcode, DexMethod method, List<V> arguments) {
+ public LirBuilder<V, EV> addInvokeInstruction(int opcode, DexItem method, List<V> arguments) {
return addInstructionTemplate(opcode, Collections.singletonList(method), arguments);
}
@@ -527,6 +528,10 @@
return addInvokeInstruction(LirOpcodes.INVOKEINTERFACE, method, arguments);
}
+ public LirBuilder<V, EV> addInvokeCustom(DexCallSite callSite, List<V> arguments) {
+ return addInvokeInstruction(LirOpcodes.INVOKEDYNAMIC, callSite, arguments);
+ }
+
public LirBuilder<V, EV> addNewInstance(DexType clazz) {
return addOneItemInstruction(LirOpcodes.NEW, clazz);
}
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 e70b2e7..e9b52f7 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -6,6 +6,7 @@
import com.android.tools.r8.cf.code.CfNumberConversion;
import com.android.tools.r8.errors.Unimplemented;
import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.DexCallSite;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItem;
import com.android.tools.r8.graph.DexMethod;
@@ -406,6 +407,10 @@
onInvokeMethodInstruction(method, arguments);
}
+ public void onInvokeCustom(DexCallSite callSite, List<EV> arguments) {
+ onInstruction();
+ }
+
public void onNewInstance(DexType clazz) {
onInstruction();
}
@@ -975,6 +980,13 @@
onInvokeInterface(target, arguments);
return;
}
+ case LirOpcodes.INVOKEDYNAMIC:
+ {
+ DexCallSite callSite = (DexCallSite) getConstantItem(view.getNextConstantOperand());
+ List<EV> arguments = getInvokeInstructionArguments(view);
+ onInvokeCustom(callSite, arguments);
+ return;
+ }
case LirOpcodes.NEW:
{
DexItem item = getConstantItem(view.getNextConstantOperand());
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 d49c90f..c8d335f 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.lightir;
import com.android.tools.r8.errors.Unimplemented;
+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.DexReference;
@@ -261,6 +262,12 @@
}
@Override
+ public void onInvokeCustom(DexCallSite callSite, List<EV> arguments) {
+ appendValueArguments(arguments);
+ builder.append(callSite);
+ }
+
+ @Override
public void onStaticGet(DexField field) {
appendOutValue();
builder.append(field).append(' ');