Enum Class CallOtherOpGen
- All Implemented Interfaces:
OpGen<JitCallOtherOpIf>
,Serializable
,Comparable<CallOtherOpGen>
,Constable
,org.objectweb.asm.Opcodes
callother
.
The checks if Direct invocation is possible. If so, it emits code using
generateRunCodeUsingDirectStrategy(JitCodeGenerator, JitCallOtherOpIf, JitBlock, MethodVisitor)
.
If not, it emits code using
generateRunCodeUsingRetirementStrategy(JitCodeGenerator, PcodeOp, JitBlock, PcodeUseropDefinition, MethodVisitor)
.
Direct invocation is possible when the userop is functional
and all of its parameters and return type have a supported primitive type.
(char
is not supported.) Regarding the invocation strategies, see
JitDataFlowUseropLibrary
and note that the Inline strategy is already handled by this
point.
For the Standard strategy, we emit code to retire the program counter, decode context, and all
live variables. We then request a field to hold the userop and emit code to load it. We then emit
code to prepare its arguments and place them on the stack, namely the output varnode and an array
for the input varnodes. We request a field for each varnode and emit code to load them as needed.
For the array, we emit code to construct and fill it. We then emit code to invoke
JitCompiledPassage.invokeUserop(PcodeUseropDefinition, Varnode, Varnode[])
. The userop
definition handles retrieving all of its inputs and writing the output, directly to the
state
. Thus, we now need only to emit code to re-birth all the
live variables. If any errors occur, execution is interrupted as usual, and our state is
consistent.
For the Direct strategy, we wish to avoid retirement and re-birth, so we request an
ExceptionHandler
. We request a field for the userop, just as in the Standard strategy,
but we emit code to invoke PcodeUseropLibrary.PcodeUseropDefinition.getDefiningLibrary()
instead. We can use
PcodeUseropLibrary.PcodeUseropDefinition.getJavaMethod()
at generation time to reflect its Java
definition. We then emit code to cast the library and load each of the operands onto the JVM
stack. We then emit the invocation of the Java method, guarded by the exception handler. We then
have to consider whether the userop has an output operand and whether its definition returns a
value. If both are true, we emit code to write the result. If neither is true, we're done. If a
result is returned, but no output operand is provided, we must still emit a pop
.
-
Nested Class Summary
Nested classes/interfaces inherited from class java.lang.Enum
Enum.EnumDesc<E extends Enum<E>>
-
Enum Constant Summary
Enum Constants -
Field Summary
Fields inherited from interface org.objectweb.asm.Opcodes
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V9
-
Method Summary
Modifier and TypeMethodDescriptionstatic boolean
Check if the Direct invocation strategy is applicable (see class documentation)void
generateRunCode
(JitCodeGenerator gen, JitCallOtherOpIf op, JitControlFlowModel.JitBlock block, org.objectweb.asm.MethodVisitor rv) Emit bytecode into therun
method.static void
generateRunCodeUsingDirectStrategy
(JitCodeGenerator gen, JitCallOtherOpIf op, JitControlFlowModel.JitBlock block, org.objectweb.asm.MethodVisitor rv) Emit code to implement the Direct strategy (see the class documentation)static void
generateRunCodeUsingRetirementStrategy
(JitCodeGenerator gen, PcodeOp op, JitControlFlowModel.JitBlock block, PcodeUseropLibrary.PcodeUseropDefinition<?> userop, org.objectweb.asm.MethodVisitor rv) Emit code to implement the Standard strategy (see the class documentation)static CallOtherOpGen
Returns the enum constant of this class with the specified name.static CallOtherOpGen[]
values()
Returns an array containing the constants of this enum class, in the order they are declared.Methods inherited from class java.lang.Enum
clone, compareTo, describeConstable, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
Methods inherited from interface ghidra.pcode.emu.jit.gen.op.OpGen
generateInitCode
-
Enum Constant Details
-
GEN
The generator singleton
-
-
Method Details
-
values
Returns an array containing the constants of this enum class, in the order they are declared.- Returns:
- an array containing the constants of this enum class, in the order they are declared
-
valueOf
Returns the enum constant of this class with the specified name. The string must match exactly an identifier used to declare an enum constant in this class. (Extraneous whitespace characters are not permitted.)- Parameters:
name
- the name of the enum constant to be returned.- Returns:
- the enum constant with the specified name
- Throws:
IllegalArgumentException
- if this enum class has no constant with the specified nameNullPointerException
- if the argument is null
-
generateRunCodeUsingRetirementStrategy
public static void generateRunCodeUsingRetirementStrategy(JitCodeGenerator gen, PcodeOp op, JitControlFlowModel.JitBlock block, PcodeUseropLibrary.PcodeUseropDefinition<?> userop, org.objectweb.asm.MethodVisitor rv) Emit code to implement the Standard strategy (see the class documentation)- Parameters:
gen
- the code generatorop
- the p-code opblock
- the block containing the opuserop
- the userop definition, wrapped by theJitDataFlowUseropLibrary
rv
- the visitor for therun
method
-
generateRunCodeUsingDirectStrategy
public static void generateRunCodeUsingDirectStrategy(JitCodeGenerator gen, JitCallOtherOpIf op, JitControlFlowModel.JitBlock block, org.objectweb.asm.MethodVisitor rv) Emit code to implement the Direct strategy (see the class documentation)- Parameters:
gen
- the code generatorop
- the p-code op use-def nodeblock
- the block containing the oprv
- the visitor for therun
method
-
canDoDirectInvocation
Check if the Direct invocation strategy is applicable (see class documentation)- Parameters:
op
- the p-code op use-def node- Returns:
- true if applicable
-
generateRunCode
public void generateRunCode(JitCodeGenerator gen, JitCallOtherOpIf op, JitControlFlowModel.JitBlock block, org.objectweb.asm.MethodVisitor rv) Description copied from interface:OpGen
Emit bytecode into therun
method.This method must emit the code needed to load any input operands, convert them to the appropriate type, perform the actual operation, and then if applicable, store the output operand. The implementations should delegate to
JitCodeGenerator.generateValReadCode(JitVal, JitTypeBehavior)
,JitCodeGenerator.generateVarWriteCode(JitVar, JitType)
, andTypeConversions
appropriately.- Specified by:
generateRunCode
in interfaceOpGen<JitCallOtherOpIf>
- Parameters:
gen
- the code generatorop
- the p-code op (use-def node) to translateblock
- the basic block containing the p-code oprv
- the visitor for therun
method.
-