Class MethodAnalyzer<V extends org.objectweb.asm.tree.analysis.Value>
java.lang.Object
org.objectweb.asm.tree.analysis.Analyzer<V>
org.apache.drill.exec.compile.bytecode.MethodAnalyzer<V>
- All Implemented Interfaces:
org.objectweb.asm.Opcodes
public class MethodAnalyzer<V extends org.objectweb.asm.tree.analysis.Value>
extends org.objectweb.asm.tree.analysis.Analyzer<V>
Analyzer that allows us to inject additional functionality into ASMs basic analysis.
We need to be able to keep track of local variables that are assigned to each other so that we can infer their replaceability (for scalar replacement). In order to do that, we need to know when local variables are assigned (with the old value being overwritten) so that we can associate them with the new value, and hence determine whether they can also be replaced, or not.
In order to capture the assignment operation, we have to provide our own Frame<>, but ASM doesn't provide a direct way to do that. Here, we use the Analyzer's newFrame() methods as factories that will provide our own derivative of Frame<> which we use to detect
-
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, V9
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionorg.objectweb.asm.tree.analysis.Frame<V>[]
protected void
newControlFlowEdge
(int insnIndex, int successorIndex) protected org.objectweb.asm.tree.analysis.Frame<V>
newFrame
(int maxLocals, int maxStack) protected org.objectweb.asm.tree.analysis.Frame<V>
Methods inherited from class org.objectweb.asm.tree.analysis.Analyzer
analyzeAndComputeMaxs, getFrames, getHandlers, init, newControlFlowExceptionEdge, newControlFlowExceptionEdge
-
Constructor Details
-
MethodAnalyzer
-
-
Method Details
-
newFrame
- Overrides:
newFrame
in classorg.objectweb.asm.tree.analysis.Analyzer<V extends org.objectweb.asm.tree.analysis.Value>
-
newFrame
protected org.objectweb.asm.tree.analysis.Frame<V> newFrame(org.objectweb.asm.tree.analysis.Frame<? extends V> src) - Overrides:
newFrame
in classorg.objectweb.asm.tree.analysis.Analyzer<V extends org.objectweb.asm.tree.analysis.Value>
-
newControlFlowEdge
protected void newControlFlowEdge(int insnIndex, int successorIndex) - Overrides:
newControlFlowEdge
in classorg.objectweb.asm.tree.analysis.Analyzer<V extends org.objectweb.asm.tree.analysis.Value>
-
analyze
public org.objectweb.asm.tree.analysis.Frame<V>[] analyze(String owner, org.objectweb.asm.tree.MethodNode method) throws org.objectweb.asm.tree.analysis.AnalyzerException - Overrides:
analyze
in classorg.objectweb.asm.tree.analysis.Analyzer<V extends org.objectweb.asm.tree.analysis.Value>
- Throws:
org.objectweb.asm.tree.analysis.AnalyzerException
-