edu.umd.cs.findbugs.ba
Class ValueNumberFrameModelingVisitor

java.lang.Object
  extended by edu.umd.cs.findbugs.ba.AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
      extended by edu.umd.cs.findbugs.ba.ValueNumberFrameModelingVisitor
All Implemented Interfaces:
Debug, ValueNumberAnalysisFeatures, org.apache.bcel.generic.Visitor

public class ValueNumberFrameModelingVisitor
extends AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
implements Debug, ValueNumberAnalysisFeatures

Visitor which models the effects of bytecode instructions on value numbers of values in the operand stack frames.

Author:
David Hovemeyer
See Also:
ValueNumber, ValueNumberFrame, ValueNumberAnalysis

Field Summary
private  ValueNumberCache cache
           
private  java.util.HashMap<java.lang.String,ValueNumber> classObjectValueMap
           
private  java.util.IdentityHashMap<org.apache.bcel.generic.InstructionHandle,ValueNumber> constantValueMap
           
private static ValueNumber[] EMPTY_INPUT_VALUE_LIST
           
private  ValueNumberFactory factory
           
private  org.apache.bcel.generic.InstructionHandle handle
           
private  LoadedFieldSet loadedFieldSet
           
private  RepositoryLookupFailureCallback lookupFailureCallback
           
private  org.apache.bcel.generic.MethodGen methodGen
           
private  java.util.HashMap<ValueNumber,java.lang.String> stringConstantMap
           
 
Fields inherited from interface edu.umd.cs.findbugs.ba.Debug
CHECK_ASSERTIONS, VERIFY_INTEGRITY
 
Fields inherited from interface edu.umd.cs.findbugs.ba.ValueNumberAnalysisFeatures
REDUNDANT_LOAD_ELIMINATION, RLE_DEBUG
 
Constructor Summary
ValueNumberFrameModelingVisitor(org.apache.bcel.generic.MethodGen methodGen, ValueNumberFactory factory, ValueNumberCache cache, LoadedFieldSet loadedFieldSet, RepositoryLookupFailureCallback lookupFailureCallback)
          Constructor.
 
Method Summary
private  void checkConsumedAndProducedValues(org.apache.bcel.generic.Instruction ins, ValueNumber[] consumedValueList, ValueNumber[] producedValueList)
           
private  boolean doForwardSubstitution()
          Determine whether forward substitution should be performed for the heap location referenced by the current instruction.
private  boolean doRedundantLoadElimination()
          Determine whether redundant load elimination should be performed for the heap location referenced by the current instruction.
private  ValueNumber getClassObjectValue(java.lang.String className)
          Get the ValueNumber for given class's Class object.
 ValueNumber getDefaultValue()
          Produce a "default" value.
private  ValueNumber[] getOutputValues(ValueNumber[] inputValueList, int numWordsProduced)
          Get output values for current instruction from the ValueNumberCache.
private  ValueNumber[] getOutputValues(ValueNumber[] inputValueList, int numWordsProduced, int flags)
           
private  void loadInstanceField(InstanceField instanceField, org.apache.bcel.generic.Instruction obj)
          Load an instance field.
private  void loadStaticField(StaticField staticField, org.apache.bcel.generic.Instruction obj)
          Load a static field.
 void modelNormalInstruction(org.apache.bcel.generic.Instruction ins, int numWordsConsumed, int numWordsProduced)
          This is the default instruction modeling method.
private  ValueNumber[] popInputValues(int numWordsConsumed)
          Pop the input values for the given instruction from the current frame.
private  void pushOutputValues(ValueNumber[] outputValueList)
          Push given output values onto the current frame.
 void setHandle(org.apache.bcel.generic.InstructionHandle handle)
          Set the instruction handle of the instruction currently being visited.
private  void storeInstanceField(InstanceField instanceField, org.apache.bcel.generic.Instruction obj, boolean pushStoredValue)
          Store an instance field.
private  void storeStaticField(StaticField staticField, org.apache.bcel.generic.Instruction obj, boolean pushStoredValue)
          Store a static field.
 void visitGETFIELD(org.apache.bcel.generic.GETFIELD obj)
           
 void visitGETSTATIC(org.apache.bcel.generic.GETSTATIC obj)
           
 void visitINVOKESTATIC(org.apache.bcel.generic.INVOKESTATIC obj)
           
 void visitLDC(org.apache.bcel.generic.LDC obj)
           
 void visitPUTFIELD(org.apache.bcel.generic.PUTFIELD obj)
           
 void visitPUTSTATIC(org.apache.bcel.generic.PUTSTATIC obj)
           
private static java.lang.String vlts(ValueNumber[] vl)
           
 
Methods inherited from class edu.umd.cs.findbugs.ba.AbstractFrameModelingVisitor
getCPG, getFrame, getNumWordsConsumed, getNumWordsProduced, handleLoadInstruction, handleNormalInstruction, handleStoreInstruction, setFrame, visitAALOAD, visitAASTORE, visitACONST_NULL, visitAllocationInstruction, visitALOAD, visitANEWARRAY, visitARETURN, visitArithmeticInstruction, visitArrayInstruction, visitARRAYLENGTH, visitASTORE, visitATHROW, visitBALOAD, visitBASTORE, visitBIPUSH, visitBranchInstruction, visitBREAKPOINT, visitCALOAD, visitCASTORE, visitCHECKCAST, visitConstantPushInstruction, visitConversionInstruction, visitCPInstruction, visitD2F, visitD2I, visitD2L, visitDADD, visitDALOAD, visitDASTORE, visitDCMPG, visitDCMPL, visitDCONST, visitDDIV, visitDLOAD, visitDMUL, visitDNEG, visitDREM, visitDRETURN, visitDSTORE, visitDSUB, visitDUP_X1, visitDUP_X2, visitDUP, visitDUP2_X1, visitDUP2_X2, visitDUP2, visitExceptionThrower, visitF2D, visitF2I, visitF2L, visitFADD, visitFALOAD, visitFASTORE, visitFCMPG, visitFCMPL, visitFCONST, visitFDIV, visitFieldInstruction, visitFieldOrMethod, visitFLOAD, visitFMUL, visitFNEG, visitFREM, visitFRETURN, visitFSTORE, visitFSUB, visitGOTO_W, visitGOTO, visitGotoInstruction, visitI2B, visitI2C, visitI2D, visitI2F, visitI2L, visitI2S, visitIADD, visitIALOAD, visitIAND, visitIASTORE, visitICONST, visitIDIV, visitIF_ACMPEQ, visitIF_ACMPNE, visitIF_ICMPEQ, visitIF_ICMPGE, visitIF_ICMPGT, visitIF_ICMPLE, visitIF_ICMPLT, visitIF_ICMPNE, visitIFEQ, visitIFGE, visitIFGT, visitIfInstruction, visitIFLE, visitIFLT, visitIFNE, visitIFNONNULL, visitIFNULL, visitIINC, visitILOAD, visitIMPDEP1, visitIMPDEP2, visitIMUL, visitINEG, visitINSTANCEOF, visitInvokeInstruction, visitINVOKEINTERFACE, visitINVOKESPECIAL, visitINVOKEVIRTUAL, visitIOR, visitIREM, visitIRETURN, visitISHL, visitISHR, visitISTORE, visitISUB, visitIUSHR, visitIXOR, visitJSR_W, visitJSR, visitJsrInstruction, visitL2D, visitL2F, visitL2I, visitLADD, visitLALOAD, visitLAND, visitLASTORE, visitLCMP, visitLCONST, visitLDC2_W, visitLDIV, visitLLOAD, visitLMUL, visitLNEG, visitLoadClass, visitLoadInstruction, visitLocalVariableInstruction, visitLOOKUPSWITCH, visitLOR, visitLREM, visitLRETURN, visitLSHL, visitLSHR, visitLSTORE, visitLSUB, visitLUSHR, visitLXOR, visitMONITORENTER, visitMONITOREXIT, visitMULTIANEWARRAY, visitNEW, visitNEWARRAY, visitNOP, visitPOP, visitPOP2, visitPopInstruction, visitPushInstruction, visitRET, visitRETURN, visitReturnInstruction, visitSALOAD, visitSASTORE, visitSelect, visitSIPUSH, visitStackConsumer, visitStackInstruction, visitStackProducer, visitStoreInstruction, visitSWAP, visitTABLESWITCH, visitTypedInstruction, visitUnconditionalBranch, visitVariableLengthInstruction
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

methodGen

private org.apache.bcel.generic.MethodGen methodGen

factory

private ValueNumberFactory factory

cache

private ValueNumberCache cache

loadedFieldSet

private LoadedFieldSet loadedFieldSet

classObjectValueMap

private java.util.HashMap<java.lang.String,ValueNumber> classObjectValueMap

constantValueMap

private java.util.IdentityHashMap<org.apache.bcel.generic.InstructionHandle,ValueNumber> constantValueMap

stringConstantMap

private java.util.HashMap<ValueNumber,java.lang.String> stringConstantMap

lookupFailureCallback

private RepositoryLookupFailureCallback lookupFailureCallback

handle

private org.apache.bcel.generic.InstructionHandle handle

EMPTY_INPUT_VALUE_LIST

private static final ValueNumber[] EMPTY_INPUT_VALUE_LIST
Constructor Detail

ValueNumberFrameModelingVisitor

public ValueNumberFrameModelingVisitor(org.apache.bcel.generic.MethodGen methodGen,
                                       ValueNumberFactory factory,
                                       ValueNumberCache cache,
                                       LoadedFieldSet loadedFieldSet,
                                       RepositoryLookupFailureCallback lookupFailureCallback)
Constructor.

Parameters:
methodGen - the method being analyzed
factory - factory for ValueNumbers for the method
cache - cache of input/output transformations for each instruction
loadedFieldSet - fields loaded/stored by each instruction and entire method
lookupFailureCallback - callback to use to report class lookup failures
Method Detail

getDefaultValue

public ValueNumber getDefaultValue()
Description copied from class: AbstractFrameModelingVisitor
Produce a "default" value. This is what is pushed onto the stack by the handleNormalInstruction() method for instructions which produce stack values.

Specified by:
getDefaultValue in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>

setHandle

public void setHandle(org.apache.bcel.generic.InstructionHandle handle)
Set the instruction handle of the instruction currently being visited. This must be called before the instruction accepts this visitor!


doRedundantLoadElimination

private boolean doRedundantLoadElimination()
Determine whether redundant load elimination should be performed for the heap location referenced by the current instruction.

Returns:
true if we should do redundant load elimination for the current instruction, false if not

doForwardSubstitution

private boolean doForwardSubstitution()
Determine whether forward substitution should be performed for the heap location referenced by the current instruction.

Returns:
true if we should do forward substitution for the current instruction, false if not

checkConsumedAndProducedValues

private void checkConsumedAndProducedValues(org.apache.bcel.generic.Instruction ins,
                                            ValueNumber[] consumedValueList,
                                            ValueNumber[] producedValueList)

modelNormalInstruction

public void modelNormalInstruction(org.apache.bcel.generic.Instruction ins,
                                   int numWordsConsumed,
                                   int numWordsProduced)
This is the default instruction modeling method.

Overrides:
modelNormalInstruction in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>

visitGETFIELD

public void visitGETFIELD(org.apache.bcel.generic.GETFIELD obj)
Specified by:
visitGETFIELD in interface org.apache.bcel.generic.Visitor
Overrides:
visitGETFIELD in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>

visitPUTFIELD

public void visitPUTFIELD(org.apache.bcel.generic.PUTFIELD obj)
Specified by:
visitPUTFIELD in interface org.apache.bcel.generic.Visitor
Overrides:
visitPUTFIELD in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>

visitGETSTATIC

public void visitGETSTATIC(org.apache.bcel.generic.GETSTATIC obj)
Specified by:
visitGETSTATIC in interface org.apache.bcel.generic.Visitor
Overrides:
visitGETSTATIC in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>

visitPUTSTATIC

public void visitPUTSTATIC(org.apache.bcel.generic.PUTSTATIC obj)
Specified by:
visitPUTSTATIC in interface org.apache.bcel.generic.Visitor
Overrides:
visitPUTSTATIC in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>

visitINVOKESTATIC

public void visitINVOKESTATIC(org.apache.bcel.generic.INVOKESTATIC obj)
Specified by:
visitINVOKESTATIC in interface org.apache.bcel.generic.Visitor
Overrides:
visitINVOKESTATIC in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>

visitLDC

public void visitLDC(org.apache.bcel.generic.LDC obj)
Specified by:
visitLDC in interface org.apache.bcel.generic.Visitor
Overrides:
visitLDC in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>

popInputValues

private ValueNumber[] popInputValues(int numWordsConsumed)
Pop the input values for the given instruction from the current frame.


pushOutputValues

private void pushOutputValues(ValueNumber[] outputValueList)
Push given output values onto the current frame.


getOutputValues

private ValueNumber[] getOutputValues(ValueNumber[] inputValueList,
                                      int numWordsProduced)
Get output values for current instruction from the ValueNumberCache.


getOutputValues

private ValueNumber[] getOutputValues(ValueNumber[] inputValueList,
                                      int numWordsProduced,
                                      int flags)

vlts

private static java.lang.String vlts(ValueNumber[] vl)

loadInstanceField

private void loadInstanceField(InstanceField instanceField,
                               org.apache.bcel.generic.Instruction obj)
Load an instance field.

Parameters:
instanceField - the field
obj - the Instruction loading the field

loadStaticField

private void loadStaticField(StaticField staticField,
                             org.apache.bcel.generic.Instruction obj)
Load a static field.

Parameters:
staticField - the field
obj - the Instruction loading the field

storeInstanceField

private void storeInstanceField(InstanceField instanceField,
                                org.apache.bcel.generic.Instruction obj,
                                boolean pushStoredValue)
Store an instance field.

Parameters:
instanceField - the field
obj - the instruction which stores the field
pushStoredValue - push the stored value onto the stack (because we are modeling an inner-class field access method)

storeStaticField

private void storeStaticField(StaticField staticField,
                              org.apache.bcel.generic.Instruction obj,
                              boolean pushStoredValue)
Store a static field.

Parameters:
staticField - the static field
obj - the instruction which stores the field
pushStoredValue - push the stored value onto the stack (because we are modeling an inner-class field access method)

getClassObjectValue

private ValueNumber getClassObjectValue(java.lang.String className)
Get the ValueNumber for given class's Class object.

Parameters:
className - the class