soot.shimple
Class ShimpleBody

java.lang.Object
  |
  +--soot.tagkit.AbstractHost
        |
        +--soot.Body
              |
              +--soot.jimple.StmtBody
                    |
                    +--soot.shimple.ShimpleBody

public class ShimpleBody
extends StmtBody

Implementation of the Body class for the Shimple (SSA Jimple) IR. This class provides methods for maintaining SSA form as well as eliminating SSA form.

We decided to hide all the intelligence in internal.ShimpleBodyBuilder for clarity of API. Eventually we will likely switch to an explicit Strategy pattern that will allow us to select different SSA behaviours and algorithms.

See Also:
ShimpleBodyBuilder, Efficiently Computing Static Single Assignment Form and the Control Dependence Graph, Serialized Form

Field Summary
protected  boolean isSSA
          Set isSSA boolean to indicate whether a ShimpleBody is still in SSA form or not.
protected  ShimpleLocalDefs localDefs
           
protected  LocalUses localUses
           
protected  ShimpleOptions options
          Holds our options map...
 
Fields inherited from class soot.Body
localChain, method, trapChain, unitChain
 
Method Summary
 java.lang.Object clone()
          Returns a copy of the current ShimpleBody.
 void eliminatePhiNodes()
          Remove Phi nodes from body.
 boolean getIsSSA()
          Returns value of, optional, user-maintained SSA boolean.
 ShimpleLocalDefs getLocalDefs()
          Returns a ShimpleLocalDefs interface for this body.
 LocalUses getLocalUses()
          Returns a LocalUses interface for this body.
 ShimpleOptions getOptions()
          Returns the Shimple options applicable to this body.
 void makeUniqueLocalNames()
          Make sure the locals in this body all have unique String names.
 void rebuild()
          Recompute SSA form.
 void rebuild(boolean hasPhiNodes)
          Rebuild SSA form.
 void setIsSSA(boolean isSSA)
          Sets a flag that indicates whether ShimpleBody is still in SSA form after a transformation or not.
 JimpleBody toJimpleBody()
          Returns an equivalent unbacked JimpleBody of the current Body by eliminating the Phi nodes.
 
Methods inherited from class soot.Body
getAllUnitBoxes, getDefBoxes, getLocalCount, getLocals, getMethod, getParameterLocal, getThisLocal, getTraps, getUnitBoxes, getUnits, getUseAndDefBoxes, getUseBoxes, importBodyContentsFrom, setMethod, validate, validateLocals, validateTraps, validateUnitBoxes, validateUses
 
Methods inherited from class soot.tagkit.AbstractHost
addAllTagsOf, addTag, getTag, getTags, hasTag, removeAllTags, removeTag
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

options

protected ShimpleOptions options
Holds our options map...

localDefs

protected ShimpleLocalDefs localDefs

localUses

protected LocalUses localUses

isSSA

protected boolean isSSA
Set isSSA boolean to indicate whether a ShimpleBody is still in SSA form or not. Could be useful for book-keeping purposes.
Method Detail

rebuild

public void rebuild()
Recompute SSA form.

Note: assumes presence of Phi nodes in body that require elimination. If you *know* there are no Phi nodes present, you may prefer to use rebuild(false) in order to skip some transformations during the Phi elimination process.


rebuild

public void rebuild(boolean hasPhiNodes)
Rebuild SSA form.

If there are Phi nodes already present in the body, it is imperative that we specify this so that the algorithm can eliminate them before rebuilding SSA.

The eliminate Phi nodes stage is harmless, but if you *know* that no Phi nodes are present and you wish to avoid the transformations involved in eliminating Phi nodes, use rebuild(false).


toJimpleBody

public JimpleBody toJimpleBody()
Returns an equivalent unbacked JimpleBody of the current Body by eliminating the Phi nodes.

Currently available option is "naive-phi-elimination", typically specified in the "shimple" phase (eg, -p shimple naive-phi-elimination) which skips the dead code elimination and register allocation phase before eliminating Phi nodes. This can be useful for understanding the effect of analyses.

Remember to setActiveBody() if necessary in your SootMethod.

See Also:
eliminatePhiNodes()

eliminatePhiNodes

public void eliminatePhiNodes()
Remove Phi nodes from body. SSA form is no longer a given once done.

Currently available option is "naive-phi-elimination", typically specified in the "shimple" phase (eg, -p shimple naive-phi-elimination) which skips the dead code elimination and register allocation phase before eliminating Phi nodes. This can be useful for understanding the effect of analyses.

See Also:
toJimpleBody()

clone

public java.lang.Object clone()
Returns a copy of the current ShimpleBody.
Overrides:
clone in class Body

getLocalDefs

public ShimpleLocalDefs getLocalDefs()
Returns a ShimpleLocalDefs interface for this body.

getLocalUses

public LocalUses getLocalUses()
Returns a LocalUses interface for this body.

setIsSSA

public void setIsSSA(boolean isSSA)
Sets a flag that indicates whether ShimpleBody is still in SSA form after a transformation or not. It is often up to the user to indicate if a body is no longer in SSA form. Could be useful for book-keeping purposes.

getIsSSA

public boolean getIsSSA()
Returns value of, optional, user-maintained SSA boolean.
See Also:
setIsSSA(boolean)

getOptions

public ShimpleOptions getOptions()
Returns the Shimple options applicable to this body.

makeUniqueLocalNames

public void makeUniqueLocalNames()
Make sure the locals in this body all have unique String names. If the standard-local-names option is specified to Shimple, this results in the LocalNameStandardizer being applied. Otherwise, renaming is kept to a minimum and an underscore notation is used to differentiate locals previously of the same name.
See Also:
LocalNameStandardizer