public class SSAValueManager
extends java.lang.Object
| Modifier and Type | Field and Description |
|---|---|
java.lang.String |
breadCrumb
User-Defined debugging info
|
| Constructor and Description |
|---|
SSAValueManager(ParameterAccessor acc) |
| Modifier and Type | Method and Description |
|---|---|
java.util.List<SSAValue> |
getAllForPhi(SSAValue.VariableKey key)
Returns all "free" and "allocated" variables and the invalid ones in a sub-scope.
|
SSAValue |
getCurrent(SSAValue.VariableKey key)
Retrieve the SSA-Number that is valid for a type in the current scope.
|
SSAValue |
getException()
Create new SSAValue with UniqueKey and Exception-Type.
|
SSAValue |
getFree(TypeReference type,
SSAValue.VariableKey key)
Returns and registers a free SSA-Number to a Type.
|
SSAValue |
getSuper(SSAValue.VariableKey key)
Retrieve the SSA-Number that is valid for a type in the super-ordinate scope.
|
SSAValue |
getUnallocated(TypeReference type,
SSAValue.VariableKey key)
Get an unused number to assign to.
|
SSAValue |
getUnmanaged(TypeReference type,
SSAValue.VariableKey key)
Retrieve a SSA-Value that is not under management.
|
SSAValue |
getUnmanaged(TypeReference type,
java.lang.String name) |
void |
invalidate(SSAValue.VariableKey key)
Marks all known instances of VariableKey invalid.
|
boolean |
isSeen(SSAValue.VariableKey key)
Return if the type is managed by this class.
|
boolean |
isSeen(SSAValue.VariableKey key,
boolean withSuper)
Return if the type is managed by this class.
|
java.util.Map<java.lang.Integer,Atom> |
makeLocalNames()
Collect the variable-names of all known variables.
|
boolean |
needsAllocation(SSAValue.VariableKey key)
Returns if an instance for that type needs to be allocated.
|
boolean |
needsPhi(SSAValue.VariableKey key)
Returns if a PhiInstruction (still) has to be added.
|
int |
scopeDown(boolean doesLoop)
Enter a subordinate scope.
|
int |
scopeUp()
Leave a subordinate scope.
|
void |
setAllocation(SSAValue value,
SSAInstruction setBy)
Register a variable _after_ allocation.
|
void |
setPhi(SSAValue value,
SSAInstruction setBy)
Register a Phi-Instruction _after_ added to the model.
|
java.lang.String |
toString() |
public SSAValueManager(ParameterAccessor acc)
public void setAllocation(SSAValue value, SSAInstruction setBy)
The proper way to add an allocation is to get a Variable using getUnallocated(com.ibm.wala.types.TypeReference, com.ibm.wala.util.ssa.SSAValue.VariableKey). 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.
value - an unallocated SSA-Variable to assign the allocation tosetBy - The instruction that set the value (optional)java.lang.IllegalStateException - if you set more than one allocation for that type (TODO better
check!)java.lang.IllegalArgumentException - if type is null or ssaValue is zero or negativepublic void setPhi(SSAValue value, SSAInstruction setBy)
value - the number the SSA-Instruction assigns tosetBy - the Phi-Instruction itself - may be nulljava.lang.IllegalArgumentException - if you assign to a number requested using getFree(com.ibm.wala.types.TypeReference, com.ibm.wala.util.ssa.SSAValue.VariableKey) but
types mismatch.java.lang.IllegalStateException - if you forgot to close some Phispublic SSAValue getFree(TypeReference type, SSAValue.VariableKey key)
You have to set the type using a Phi-Instruction. Also you don't have to add that instruction immediately it is required that it is added before the Model gets finished.
You can request the List of unmet Phi-Instructions by using XXX
java.lang.IllegalArgumentException - if type is nullpublic SSAValue getUnallocated(TypeReference type, SSAValue.VariableKey key)
There may only be one unallocated value for each type at a time. XXX: Really?
java.lang.IllegalStateException - if there is already an unallocated variable of that typejava.lang.IllegalArgumentException - if type is nullpublic SSAValue getUnmanaged(TypeReference type, SSAValue.VariableKey key)
Use instead of 'nextLocal++', else SSA-Values will clash!
public SSAValue getUnmanaged(TypeReference type, java.lang.String name)
public SSAValue getCurrent(SSAValue.VariableKey key)
Either that number origins from an allocation or a PhiInstruction (to be).
java.lang.IllegalStateException - if no number is assignablejava.lang.IllegalArgumentException - if type was not seen before or is nullpublic SSAValue getSuper(SSAValue.VariableKey key)
Either that number origins from an allocation or a PhiInstruction (to be).
java.lang.IllegalStateException - if no number is assignablejava.lang.IllegalArgumentException - if type was not seen before or is nullpublic java.util.List<SSAValue> getAllForPhi(SSAValue.VariableKey key)
This is a suggestion which variables to considder as parameter to a Phi-Function.
java.lang.IllegalArgumentException - if type was not seen before or is nullpublic boolean isSeen(SSAValue.VariableKey key, boolean withSuper)
withSuper - when true return true if a managed key may be cast to type, when false type
has to match exactlykey - the type in questionjava.lang.IllegalArgumentException - if key is nullpublic boolean isSeen(SSAValue.VariableKey key)
This variant respects super-types. Use isSeen(VariableKey, boolean) with a setting for withSuper of false to enforce exact matches.
public boolean needsAllocation(SSAValue.VariableKey key)
However this function does not respect weather a PhiInstruction is needed.
java.lang.IllegalArgumentException - if type is nullpublic boolean needsPhi(SSAValue.VariableKey key)
This is true if the Value has changed in a deeper scope, has been invalidated or requested using getFree
java.lang.IllegalArgumentException - if type is null or has not been seen beforepublic void invalidate(SSAValue.VariableKey key)
A call to this method is useful before a call to setAllocation. This methods sets all known instances to invalid, setAllocation will assign the new "current" instance to use.
key - Which variables to invalidate.java.lang.IllegalArgumentException - if type was not seen before or is nullpublic int scopeDown(boolean doesLoop)
Call this whenever a new code block starts i.e. when ever you would have to put a left curly-bracket in the java code.
This function influences the placement of Phi-Functions. Thus if you don't change values you don't have to call it.
doesLoop - set to true if the scope is introduced for a looppublic int scopeUp()
All changes are marked invalid thus to be expected to be collected by a PhiInstruction.
java.lang.IllegalStateException - if already at top levelpublic java.lang.String toString()
toString in class java.lang.Objectpublic SSAValue getException()
The generated SSAValue will be unmanaged. It is mainly useful for SSAInvokeInstructions.
public java.util.Map<java.lang.Integer,Atom> makeLocalNames()