Class InducedCFG
- All Implemented Interfaces:
ControlFlowGraph<SSAInstruction, InducedCFG.BasicBlock>, MinimalCFG<InducedCFG.BasicBlock>, Constants, EdgeManager<InducedCFG.BasicBlock>, Graph<InducedCFG.BasicBlock>, NodeManager<InducedCFG.BasicBlock>, NumberedEdgeManager<InducedCFG.BasicBlock>, NumberedGraph<InducedCFG.BasicBlock>, NumberedNodeManager<InducedCFG.BasicBlock>, Iterable<InducedCFG.BasicBlock>
- Direct Known Subclasses:
AstInducedCFG
A
ControlFlowGraph computed from a set of SSAInstruction instructions.
This is a funny CFG ... we assume that there are always fallthru edges, even from throws and returns. It is extremely fragile and unsuited for flow-sensitive analysis. Someday this should be nuked.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionclassclassThis visitor identifies basic block boundaries induced by branch instructions.class -
Field Summary
Fields inherited from interface Constants
ACC_ABSTRACT, ACC_ANNOTATION, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MODULE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VOLATILE, CONSTANT_Class, CONSTANT_Double, CONSTANT_FieldRef, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodRef, CONSTANT_InvokeDynamic, CONSTANT_Long, CONSTANT_MethodHandle, CONSTANT_MethodRef, CONSTANT_MethodType, CONSTANT_NameAndType, CONSTANT_String, CONSTANT_Utf8, indexedTypes, indexedTypes_T, MAYBE, NO, OP_aaload, OP_aastore, OP_aconst_null, OP_aload, OP_aload_0, OP_aload_1, OP_aload_2, OP_aload_3, OP_anewarray, OP_areturn, OP_arraylength, OP_astore, OP_astore_0, OP_astore_1, OP_astore_2, OP_astore_3, OP_athrow, OP_baload, OP_bastore, OP_bipush, OP_caload, OP_castore, OP_checkcast, OP_d2f, OP_d2i, OP_d2l, OP_dadd, OP_daload, OP_dastore, OP_dcmpg, OP_dcmpl, OP_dconst_0, OP_dconst_1, OP_ddiv, OP_dload, OP_dload_0, OP_dload_1, OP_dload_2, OP_dload_3, OP_dmul, OP_dneg, OP_drem, OP_dreturn, OP_dstore, OP_dstore_0, OP_dstore_1, OP_dstore_2, OP_dstore_3, OP_dsub, OP_dup, OP_dup_x1, OP_dup_x2, OP_dup2, OP_dup2_x1, OP_dup2_x2, OP_f2d, OP_f2i, OP_f2l, OP_fadd, OP_faload, OP_fastore, OP_fcmpg, OP_fcmpl, OP_fconst_0, OP_fconst_1, OP_fconst_2, OP_fdiv, OP_fload, OP_fload_0, OP_fload_1, OP_fload_2, OP_fload_3, OP_fmul, OP_fneg, OP_frem, OP_freturn, OP_fstore, OP_fstore_0, OP_fstore_1, OP_fstore_2, OP_fstore_3, OP_fsub, OP_getfield, OP_getstatic, OP_goto, OP_goto_w, OP_i2b, OP_i2c, OP_i2d, OP_i2f, OP_i2l, OP_i2s, OP_iadd, OP_iaload, OP_iand, OP_iastore, OP_iconst_0, OP_iconst_1, OP_iconst_2, OP_iconst_3, OP_iconst_4, OP_iconst_5, OP_iconst_m1, OP_idiv, OP_if_acmpeq, OP_if_acmpne, OP_if_icmpeq, OP_if_icmpge, OP_if_icmpgt, OP_if_icmple, OP_if_icmplt, OP_if_icmpne, OP_ifeq, OP_ifge, OP_ifgt, OP_ifle, OP_iflt, OP_ifne, OP_ifnonnull, OP_ifnull, OP_iinc, OP_iload, OP_iload_0, OP_iload_1, OP_iload_2, OP_iload_3, OP_imul, OP_ineg, OP_instanceof, OP_invokedynamic, OP_invokeinterface, OP_invokespecial, OP_invokestatic, OP_invokevirtual, OP_ior, OP_irem, OP_ireturn, OP_ishl, OP_ishr, OP_istore, OP_istore_0, OP_istore_1, OP_istore_2, OP_istore_3, OP_isub, OP_iushr, OP_ixor, OP_jsr, OP_jsr_w, OP_l2d, OP_l2f, OP_l2i, OP_ladd, OP_laload, OP_land, OP_lastore, OP_lcmp, OP_lconst_0, OP_lconst_1, OP_ldc, OP_ldc_w, OP_ldc2_w, OP_ldiv, OP_lload, OP_lload_0, OP_lload_1, OP_lload_2, OP_lload_3, OP_lmul, OP_lneg, OP_lookupswitch, OP_lor, OP_lrem, OP_lreturn, OP_lshl, OP_lshr, OP_lstore, OP_lstore_0, OP_lstore_1, OP_lstore_2, OP_lstore_3, OP_lsub, OP_lushr, OP_lxor, OP_monitorenter, OP_monitorexit, OP_multianewarray, OP_new, OP_newarray, OP_nop, OP_pop, OP_pop2, OP_putfield, OP_putstatic, OP_ret, OP_return, OP_saload, OP_sastore, OP_sipush, OP_swap, OP_tableswitch, OP_wide, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TYPE_boolean, TYPE_boolean_index, TYPE_byte, TYPE_byte_index, TYPE_char, TYPE_char_index, TYPE_Class, TYPE_double, TYPE_double_index, TYPE_Error, TYPE_Exception, TYPE_float, TYPE_float_index, TYPE_int, TYPE_int_index, TYPE_long, TYPE_long_index, TYPE_MethodHandle, TYPE_MethodType, TYPE_null, TYPE_Object, TYPE_Object_index, TYPE_RuntimeException, TYPE_short, TYPE_short_index, TYPE_String, TYPE_Throwable, TYPE_unknown, TYPE_void, YES -
Constructor Summary
ConstructorsConstructorDescriptionInducedCFG(SSAInstruction[] instructions, IMethod method, Context context) TODO: we do not yet support induced CFGS with exception handlers. -
Method Summary
Modifier and TypeMethodDescriptionbooleangetBlockForInstruction(int index) intgetIndexFromIIndex(int iindex) Get the position of a instruction with a given iindex in the internal list.intgetProgramCounter(int index) Since this CFG is synthetic, for now we assume the instruction index is the same as the program counterinthashCode()protected InducedCFG.BranchVisitormakeBranchVisitor(boolean[] r) protected InducedCFG.PEIVisitormakePEIVisitor(boolean[] r) toString()Methods inherited from class AbstractCFG
addEdge, addExceptionalEdge, addNode, addNormalEdge, containsNode, entry, exit, getCatchBlocks, getExceptionalPredecessors, getExceptionalSuccessors, getExceptionalToExit, getMaxNumber, getMethod, getNode, getNormalPredecessors, getNormalSuccessors, getNormalToExit, getNumber, getNumberOfExceptionalIn, getNumberOfExceptionalOut, getNumberOfExceptionalOut, getNumberOfNodes, getNumberOfNormalIn, getNumberOfNormalOut, getPredNodeCount, getPredNodeNumbers, getPredNodes, getSuccNodeCount, getSuccNodeNumbers, getSuccNodes, hasEdge, hasExceptionalEdge, hasNormalEdge, init, isCatchBlock, iterateNodes, iterator, removeAllIncidentEdges, removeEdge, removeIncomingEdges, removeNode, removeNodeAndEdges, removeOutgoingEdges, setCatchBlock, streamMethods inherited from interface Iterable
forEach, spliterator
-
Constructor Details
-
InducedCFG
TODO: we do not yet support induced CFGS with exception handlers.NOTE: SIDE EFFECT!!! ... nulls out phi instructions and pi instructions in the instruction array!
- Throws:
IllegalArgumentException- if instructions is null
-
-
Method Details
-
hashCode
public int hashCode()- Specified by:
hashCodein classAbstractCFG<SSAInstruction, InducedCFG.BasicBlock>
-
equals
- Specified by:
equalsin classAbstractCFG<SSAInstruction, InducedCFG.BasicBlock>
-
getInstructions
- Returns:
- the instructions of this CFG, as an array.
-
makeBranchVisitor
-
makePEIVisitor
-
getBlockForInstruction
- Parameters:
index- an instruction index- Returns:
- the basic block which contains this instruction.
-
toString
- Overrides:
toStringin classAbstractCFG<SSAInstruction, InducedCFG.BasicBlock>
-
getProgramCounter
public int getProgramCounter(int index) Since this CFG is synthetic, for now we assume the instruction index is the same as the program counter- Parameters:
index- an instruction index- Returns:
- the program counter (bytecode index) corresponding to that instruction
- See Also:
-
getIndexFromIIndex
public int getIndexFromIIndex(int iindex) Get the position of a instruction with a given iindex in the internal list.- Parameters:
iindex- The iindex used when generating the SSAInstruction- Returns:
- index into the internal list of instructions
- Throws:
IllegalStateException- if no instruction exists with iindex or it's not in the internal array (Phi)
-
getAllPhiInstructions
-