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

    Constructors
    Constructor
    Description
    MethodAnalyzer(org.objectweb.asm.tree.analysis.Interpreter<V> interpreter)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    org.objectweb.asm.tree.analysis.Frame<V>[]
    analyze(String owner, org.objectweb.asm.tree.MethodNode method)
     
    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>
    newFrame(org.objectweb.asm.tree.analysis.Frame<? extends V> src)
     

    Methods inherited from class org.objectweb.asm.tree.analysis.Analyzer

    analyzeAndComputeMaxs, getFrames, getHandlers, init, newControlFlowExceptionEdge, newControlFlowExceptionEdge

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • MethodAnalyzer

      public MethodAnalyzer(org.objectweb.asm.tree.analysis.Interpreter<V> interpreter)
  • Method Details

    • newFrame

      protected org.objectweb.asm.tree.analysis.Frame<V> newFrame(int maxLocals, int maxStack)
      Overrides:
      newFrame in class org.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 class org.objectweb.asm.tree.analysis.Analyzer<V extends org.objectweb.asm.tree.analysis.Value>
    • newControlFlowEdge

      protected void newControlFlowEdge(int insnIndex, int successorIndex)
      Overrides:
      newControlFlowEdge in class org.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 class org.objectweb.asm.tree.analysis.Analyzer<V extends org.objectweb.asm.tree.analysis.Value>
      Throws:
      org.objectweb.asm.tree.analysis.AnalyzerException