com.ibm.wala.cfg
Class InducedCFG

java.lang.Object
  extended by com.ibm.wala.cfg.AbstractCFG<SSAInstruction,InducedCFG.BasicBlock>
      extended by com.ibm.wala.cfg.InducedCFG
All Implemented Interfaces:
ControlFlowGraph<SSAInstruction,InducedCFG.BasicBlock>, Constants, EdgeManager<InducedCFG.BasicBlock>, Graph<InducedCFG.BasicBlock>, NodeManager<InducedCFG.BasicBlock>, NumberedEdgeManager<InducedCFG.BasicBlock>, NumberedGraph<InducedCFG.BasicBlock>, NumberedNodeManager<InducedCFG.BasicBlock>, java.lang.Iterable<InducedCFG.BasicBlock>
Direct Known Subclasses:
AstInducedCFG

public class InducedCFG
extends AbstractCFG<SSAInstruction,InducedCFG.BasicBlock>

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
 class InducedCFG.BasicBlock
           
 class InducedCFG.BranchVisitor
          This visitor identifies basic block boundaries induced by branch instructions.
 class InducedCFG.PEIVisitor
           
 
Field Summary
 
Fields inherited from interface com.ibm.wala.shrikeBT.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, CONSTANT_Class, CONSTANT_Double, CONSTANT_FieldRef, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodRef, CONSTANT_Long, CONSTANT_MethodRef, 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_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, OP_xxxunusedxxx, 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_null, TYPE_Object, TYPE_Object_index, TYPE_RuntimeException, TYPE_short, TYPE_short_index, TYPE_String, TYPE_Throwable, TYPE_unknown, TYPE_void, YES
 
Constructor Summary
InducedCFG(SSAInstruction[] instructions, IMethod method, Context context)
          TODO: we do not yet support induced CFGS with exception handlers.
 
Method Summary
 boolean equals(java.lang.Object o)
           
 java.util.Collection<SSAPhiInstruction> getAllPhiInstructions()
           
 InducedCFG.BasicBlock getBlockForInstruction(int index)
           
 SSAInstruction[] getInstructions()
           
 int getProgramCounter(int index)
          Since this CFG is synthetic, for now we assume the instruction index is the same as the program counter
 int hashCode()
           
protected  InducedCFG.BranchVisitor makeBranchVisitor(boolean[] r)
           
protected  InducedCFG.PEIVisitor makePEIVisitor(boolean[] r)
           
 java.lang.String toString()
           
 
Methods inherited from class com.ibm.wala.cfg.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
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Constructor Detail

InducedCFG

public InducedCFG(SSAInstruction[] instructions,
                  IMethod method,
                  Context context)
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:
java.lang.IllegalArgumentException - if instructions is null
Method Detail

hashCode

public int hashCode()
Specified by:
hashCode in class AbstractCFG<SSAInstruction,InducedCFG.BasicBlock>

equals

public boolean equals(java.lang.Object o)
Specified by:
equals in class AbstractCFG<SSAInstruction,InducedCFG.BasicBlock>

getInstructions

public SSAInstruction[] getInstructions()
Returns:
the instructions of this CFG, as an array.

makeBranchVisitor

protected InducedCFG.BranchVisitor makeBranchVisitor(boolean[] r)

makePEIVisitor

protected InducedCFG.PEIVisitor makePEIVisitor(boolean[] r)

getBlockForInstruction

public InducedCFG.BasicBlock getBlockForInstruction(int index)
Parameters:
index - an instruction index
Returns:
the basic block which contains this instruction.

toString

public java.lang.String toString()
Overrides:
toString in class AbstractCFG<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:
ControlFlowGraph.getProgramCounter(int)

getAllPhiInstructions

public java.util.Collection<SSAPhiInstruction> getAllPhiInstructions()