Package soot.shimple

Interface PhiExpr

  • All Superinterfaces:
    EquivTo, Expr, Serializable, ShimpleExpr, Switchable, UnitBoxOwner, Value
    All Known Implementing Classes:
    SPhiExpr

    public interface PhiExpr
    extends ShimpleExpr
    A fully defined PhiExpr usually consists of a list of Values for the arguments alongst with the corresponding control flow predecessor for each argument. This may be provided either as a Soot CFG Block or more directly as the Unit at the end of the corresponding CFG block.

    As much as possible we try to conform to the semantics as described by Cytron et al., TOPLAS Oct. 91. A Phi node such as "x_1 = Phi(x_2, x_3)" is eliminated by respectively adding the statements "x_1 = x_2" and "x_1 = x_3" at the end of the corresponding control flow predecessor.

    However, due to the fact that each argument is explicitly associated with the control flow predecessor, there may be some subtle differences. We tried to make the behaviour as robust and transparent as possible by handling the common cases of Unit chain manipulations in the Shimple internal implementation of PatchingChain.

    Author:
    Navindra Umanee
    See Also:
    Efficiently Computing Static Single Assignment Form and the Control Dependence Graph, Shimple.newPhiExpr(List, List), Shimple.newPhiExpr(Local, List)
    • Method Summary

      All Methods Instance Methods Abstract Methods 
      Modifier and Type Method Description
      boolean addArg​(Value arg, Block pred)
      Add the given argument associated with the given CFG predecessor.
      boolean addArg​(Value arg, Unit predTailUnit)
      Add the given argument associated with the given CFG predecessor.
      ValueUnitPair getArgBox​(int index)
      Returns the argument pair for the given index.
      ValueUnitPair getArgBox​(Block pred)
      Returns the argument pair corresponding to the given CFG predecessor.
      ValueUnitPair getArgBox​(Unit predTailUnit)
      Returns the argument pair corresponding to the given CFG predecessor.
      int getArgCount()
      Returns the number of arguments in this PhiExpr.
      int getArgIndex​(Block pred)
      Returns the index of the argument associated with the given control flow predecessor.
      int getArgIndex​(Unit predTailUnit)
      Returns the index of the argument associated with the given control flow predecessor Unit.
      List<ValueUnitPair> getArgs()
      Returns an unmodifiable, backed view of the arguments to this PhiExpr.
      int getBlockId()
      Returns the id number of the block from which the Phi node originated from.
      Unit getPred​(int index)
      Returns the control flow predecessor Unit for the given index into the PhiExpr.
      List<Unit> getPreds()
      Returns a list of the control flow predecessor Units being tracked by this PhiExpr
      Value getValue​(int index)
      Returns the value for the given index into the PhiExpr.
      Value getValue​(Block pred)
      Get the PhiExpr argument corresponding to the given control flow predecessor, returns null if not available.
      Value getValue​(Unit predTailUnit)
      Get the PhiExpr argument corresponding to the given control flow predecessor, returns null if not available.
      List<Value> getValues()
      Returns a list of the values used by this PhiExpr.
      boolean removeArg​(int index)
      Remove the argument at the given index.
      boolean removeArg​(Block pred)
      Remove the argument corresponding to the given CFG predecessor.
      boolean removeArg​(ValueUnitPair arg)
      Remove the given argument.
      boolean removeArg​(Unit predTailUnit)
      Remove the argument corresponding to the given CFG predecessor.
      boolean setArg​(int index, Value arg, Block pred)
      Modify the PhiExpr argument at the given index with the given information.
      boolean setArg​(int index, Value arg, Unit predTailUnit)
      Modify the PhiExpr argument at the given index with the given information.
      void setBlockId​(int blockId)
      Set the block number of the Phi node.
      boolean setPred​(int index, Block pred)
      Update the CFG predecessor associated with the PhiExpr argument at the given index.
      boolean setPred​(int index, Unit predTailUnit)
      Update the CFG predecessor associated with the PhiExpr argument at the given index.
      boolean setValue​(int index, Value arg)
      Set the value at the given index into the PhiExpr.
      boolean setValue​(Block pred, Value arg)
      Locate the argument associated with the given CFG predecessor and set the value.
      boolean setValue​(Unit predTailUnit, Value arg)
      Locate the argument associated with the given CFG predecessor unit and set the value.
    • Method Detail

      • getArgs

        List<ValueUnitPair> getArgs()
        Returns an unmodifiable, backed view of the arguments to this PhiExpr. Each argument is a ValueUnitPair.
        See Also:
        ValueUnitPair
      • getValues

        List<Value> getValues()
        Returns a list of the values used by this PhiExpr.
      • getPreds

        List<Unit> getPreds()
        Returns a list of the control flow predecessor Units being tracked by this PhiExpr
      • getArgCount

        int getArgCount()
        Returns the number of arguments in this PhiExpr.
      • getArgBox

        ValueUnitPair getArgBox​(int index)
        Returns the argument pair for the given index. Null if out-of-bounds.
      • getValue

        Value getValue​(int index)
        Returns the value for the given index into the PhiExpr. Null if out-of-bounds.
      • getPred

        Unit getPred​(int index)
        Returns the control flow predecessor Unit for the given index into the PhiExpr. Null if out-of-bounds.
      • getArgIndex

        int getArgIndex​(Unit predTailUnit)
        Returns the index of the argument associated with the given control flow predecessor Unit. Returns -1 if not found.
      • getArgBox

        ValueUnitPair getArgBox​(Unit predTailUnit)
        Returns the argument pair corresponding to the given CFG predecessor. Returns null if not found.
      • getValue

        Value getValue​(Unit predTailUnit)
        Get the PhiExpr argument corresponding to the given control flow predecessor, returns null if not available.
      • getArgIndex

        int getArgIndex​(Block pred)
        Returns the index of the argument associated with the given control flow predecessor. Returns -1 if not found.
      • getArgBox

        ValueUnitPair getArgBox​(Block pred)
        Returns the argument pair corresponding to the given CFG predecessor. Returns null if not found.
      • getValue

        Value getValue​(Block pred)
        Get the PhiExpr argument corresponding to the given control flow predecessor, returns null if not available.
      • setArg

        boolean setArg​(int index,
                       Value arg,
                       Unit predTailUnit)
        Modify the PhiExpr argument at the given index with the given information. Returns false on failure.
      • setArg

        boolean setArg​(int index,
                       Value arg,
                       Block pred)
        Modify the PhiExpr argument at the given index with the given information. Returns false on failure.
      • setValue

        boolean setValue​(int index,
                         Value arg)
        Set the value at the given index into the PhiExpr. Returns false on failure.
      • setValue

        boolean setValue​(Unit predTailUnit,
                         Value arg)
        Locate the argument associated with the given CFG predecessor unit and set the value. Returns false on failure.
      • setValue

        boolean setValue​(Block pred,
                         Value arg)
        Locate the argument associated with the given CFG predecessor and set the value. Returns false on failure.
      • setPred

        boolean setPred​(int index,
                        Unit predTailUnit)
        Update the CFG predecessor associated with the PhiExpr argument at the given index. Returns false on failure.
      • setPred

        boolean setPred​(int index,
                        Block pred)
        Update the CFG predecessor associated with the PhiExpr argument at the given index. Returns false on failure.
      • removeArg

        boolean removeArg​(int index)
        Remove the argument at the given index. Returns false on failure.
      • removeArg

        boolean removeArg​(Unit predTailUnit)
        Remove the argument corresponding to the given CFG predecessor. Returns false on failure.
      • removeArg

        boolean removeArg​(Block pred)
        Remove the argument corresponding to the given CFG predecessor. Returns false on failure.
      • removeArg

        boolean removeArg​(ValueUnitPair arg)
        Remove the given argument. Returns false on failure.
      • addArg

        boolean addArg​(Value arg,
                       Block pred)
        Add the given argument associated with the given CFG predecessor. Returns false on failure.
      • addArg

        boolean addArg​(Value arg,
                       Unit predTailUnit)
        Add the given argument associated with the given CFG predecessor. Returns false on failure.
      • setBlockId

        void setBlockId​(int blockId)
        Set the block number of the Phi node.
      • getBlockId

        int getBlockId()
        Returns the id number of the block from which the Phi node originated from.