Class AndroidModelParameterManager

java.lang.Object
com.ibm.wala.dalvik.ipa.callgraph.androidModel.parameters.AndroidModelParameterManager

public class AndroidModelParameterManager extends Object
Manages SSA-Numbers for the arguments to Entrypoints.

This class comes in handy if you want to use loops or mix a return value of a function into the parameter of a later function. It supports multiple levels of cascading code blocks and delivers information which SSA-Value is the latest to use or which aught to be combined using a Phi-Statement.

However it does no allocations or Phi-Statements on its own. It just juggles with the numbers.

Since:
2013-09-19

TODO:

  • Track if a variable has been refered to to be able to prune unused Phi-Instructions later
  • Trim Memory consumption? The whole class should not be in * memory for long time so this might be not neccessary.
Author:
Tobias Blaschke <code@toiasblaschke.de>
See Also:
  • Constructor Details

    • AndroidModelParameterManager

      public AndroidModelParameterManager(IInstantiationBehavior behaviour)
      Setting the behaviour may be handy in the later model.

      However it brings no benefit to the AndroidModelParameterManager.

    • AndroidModelParameterManager

      public AndroidModelParameterManager(MethodReference mRef, boolean isStatic)
    • AndroidModelParameterManager

      public AndroidModelParameterManager(ParameterAccessor acc)
  • Method Details

    • setAllocation

      public void setAllocation(TypeReference type, int ssaValue, SSAInstruction setBy)
      Register a variable _after_ allocation.

      The proper way to add an allocation is to get a Variable using getUnallocated(com.ibm.wala.types.TypeReference). Then assign it a value. And at last call this function.

      You can however directly call the function if the type has not been seen before.

      Parameters:
      type - The type allocated
      ssaValue - an unallocated SSA-Variable to assign the allocation to
      setBy - The instruction that set the value
      Throws:
      IllegalStateException - if you set more than one allocation for that type (TODO better check!)
      IllegalArgumentException - if type is null or ssaValue is zero or negative
    • setAllocation

      public void setAllocation(TypeReference type, int ssaValue)
    • setAllocation

      public void setAllocation(SSAValue val)
    • setPhi

      public void setPhi(TypeReference type, int ssaValue, SSAInstruction setBy)
      Register a Phi-Instruction _after_ added to the model.
      Parameters:
      type - the type the Phi-Instruction sets
      ssaValue - the number the SSA-Instruction assignes to
      setBy - the Phi-Instruction itself - may be null
      Throws:
      IllegalArgumentException - if you assign to a number requested using getFree(TypeReference) but types mismach.
      IllegalStateException - if you forgot to close some Phis
    • getFree

      public int getFree(TypeReference type)
      Returns and registers a free SSA-Number to a Type.

      You have to set the type using a Phi-Instruction. Also you don't have to add that instruction immediatly it is required that it is added before the Model gets finished.

      You can request the List of unmet Phi-Instructions by using XXX

      Returns:
      an unused SSA-Number
      Throws:
      IllegalArgumentException - if type is null
    • getUnallocated

      public int getUnallocated(TypeReference type)
      Get an unused number to assign to.

      There may only be one unallocated value for each type at a time. XXX: Really?

      Returns:
      SSA-Variable
      Throws:
      IllegalStateException - if there is already an unallocated variable of that type
      IllegalArgumentException - if type is null
    • getUnmanaged

      public int getUnmanaged()
      Retreive a SSA-Value that is not under management.

      Use instead of 'nextLocal++', else SSA-Values will clash!

      Returns:
      SSA-Variable
    • getCurrent

      public int getCurrent(TypeReference type)
      Retreive the SSA-Number that is valid for a type in the current scope.

      Either that number origins from an allocation or a PhiInstruction (to be).

      Returns:
      a ssa number
      Throws:
      IllegalStateException - if no number is assignable
      IllegalArgumentException - if type was not seen before or is null
    • getSuper

      public int getSuper(TypeReference type)
      Retreive the SSA-Number that is valid for a type in the super-ordinate scope.

      Either that number origins from an allocation or a PhiInstruction (to be).

      Returns:
      a ssa number
      Throws:
      IllegalStateException - if no number is assignable
      IllegalArgumentException - if type was not seen before or is null
    • getAllForPhi

      public List<Integer> getAllForPhi(TypeReference type)
      Throws:
      IllegalArgumentException - if type was not seen before or is null
    • isSeen

      public boolean isSeen(TypeReference type, boolean withSuper)
      Return if the type is managed by this class.
      Parameters:
      withSuper - when true return true if a managed key may be cast to type, when false type has to match exactly
      type - the type in question
      Throws:
      IllegalArgumentException - if type is null
    • isSeen

      public boolean isSeen(TypeReference type)
    • needsAllocation

      public boolean needsAllocation(TypeReference type)
      Returns if an instance for that type needs to be allocated.

      However this function does not respect weather a PhiInstruction is needed.

      Throws:
      IllegalArgumentException - if type is null
    • needsPhi

      public boolean needsPhi(TypeReference type)
      Returns if a PhiInstruction (still) has to be added.

      This is true if the Value has changed in a deeper scope, has been invalidated or requested using getFree

      Throws:
      IllegalArgumentException - if type is null or has not been seen before
    • invalidate

      public void invalidate(TypeReference type)
      Throws:
      IllegalArgumentException - if type was not seen before or is null
    • scopeDown

      public int scopeDown(boolean doesLoop)
      Enter a subordinate scope.

      Call this whenever a new code block starts i.e. when ever you would have to put a left curly-bracket in yout java code.

      This function influences the placement of Phi-Functions. Thus if you don't change values you don't have to call it.

      Parameters:
      doesLoop - set to true if the scope is introduced for a loop
      Returns:
      The depth
    • scopeUp

      public int scopeUp()
      Leave a subordinate scope.

      All changes are marked invalid thus to be expected to be collected by a PhiInstruction.

      Throws:
      IllegalStateException - if already at top level
    • isReuse

      public boolean isReuse(TypeReference type)
      Handed through to an IInstantiationBehavior if set in the constructor.
      Returns:
      true if Type is a REUSE type
      Throws:
      IllegalStateException - if AndroidModelParameterManager was constructed without an IInstanciationBehavior
    • isCreate

      public boolean isCreate(TypeReference type)
      Shorthand for not(isReuse(TypeReference).
      Returns:
      true if type is a CREATE-Type
      Throws:
      IllegalStateException - if AndroidModelParameterManager was constructed without an IInstanciationBehavior
    • toString

      public String toString()
      Overrides:
      toString in class Object