Class PcodeSyntaxTree

java.lang.Object
ghidra.program.model.pcode.PcodeSyntaxTree
All Implemented Interfaces:
PcodeFactory
Direct Known Subclasses:
HighFunction, HighParamID

public class PcodeSyntaxTree extends Object implements PcodeFactory
Varnodes and PcodeOps in a coherent graph structure
  • Constructor Details

  • Method Details

    • clear

      public void clear()
    • getJoinAddress

      public Address getJoinAddress(VariableStorage storage)
      Description copied from interface: PcodeFactory
      Get the address (in the "join" space) corresponding to the given multi-piece storage. The storage must have been previously registered by a previous call to getJoinStorage(). If the storage is not multi-piece or was not registered, null is returned.
      Specified by:
      getJoinAddress in interface PcodeFactory
      Parameters:
      storage - is the multi-piece storage
      Returns:
      the corresponding "join" address
    • getJoinStorage

      public VariableStorage getJoinStorage(Varnode[] pieces) throws InvalidInputException
      Description copied from interface: PcodeFactory
      Create a storage object representing a value split across multiple physical locations. The sequence of physical locations are passed in as an array of Varnodes and the storage object is returned. The storage is also assigned an Address in the join address space, which can be retrieved by calling the getJoinAddress() method. The join Address can be used to create a Varnode that represents the logical whole created by concatenating the Varnode pieces.
      Specified by:
      getJoinStorage in interface PcodeFactory
      Parameters:
      pieces - is the array of Varnode pieces to join
      Returns:
      the VariableStorage representing the whole
      Throws:
      InvalidInputException - if a valid storage object cannot be created
    • buildStorage

      public VariableStorage buildStorage(Varnode vn) throws InvalidInputException
      Description copied from interface: PcodeFactory
      Build a storage object for a particular Varnode
      Specified by:
      buildStorage in interface PcodeFactory
      Parameters:
      vn - is the Varnode
      Returns:
      the storage object
      Throws:
      InvalidInputException - if valid storage cannot be created
    • locRange

      public Iterator<VarnodeAST> locRange()
      Returns:
      an iterator for all Varnodes in the tree ordered by Address
    • getVarnodes

      public Iterator<VarnodeAST> getVarnodes(AddressSpace spc)
      return Iterator to all Varnodes in the indicated AddressSpace
      Parameters:
      spc - -- AddressSpace to restrict Iterator to
      Returns:
      -- Iterator to Varnodes
    • getVarnodes

      public Iterator<VarnodeAST> getVarnodes(Address addr)
      return all Varnodes that start at a given Address
      Parameters:
      addr - -- Address of Varnodes
      Returns:
      -- Iterator to Varnodes
    • getVarnodes

      public Iterator<VarnodeAST> getVarnodes(int sz, Address addr)
      return all Varnodes of a given size that start at a given Address
      Parameters:
      sz - -- Size of Varnodes
      addr - -- Starting Address of Varnodes
      Returns:
      -- Iterator to Varnodes
    • findVarnode

      public Varnode findVarnode(int sz, Address addr, Address pc)
      return first instance of a Varnode with given size, starting Address, and bound to an instruction at the given Address
      Parameters:
      sz - -- size of Varnode
      addr - -- starting Address of Varnode
      pc - -- Address of instruction writing to Varnode
      Returns:
      -- the Varnode
    • findVarnode

      public Varnode findVarnode(int sz, Address addr, SequenceNumber sq)
      return Varnode of given size and starting Address defined by a PcodeOp with a given SequenceNumber
      Parameters:
      sz - -- size of Varnode
      addr - -- starting Address of Varnode
      sq - -- SequenceNumber of PcodeOp defining the Varnode
      Returns:
      -- the Varnode
    • findInputVarnode

      public Varnode findInputVarnode(int sz, Address addr)
      return Varnode of given size and starting Address, which is also an input
      Parameters:
      sz - -- size of Varnode
      addr - -- starting Address of Varnode
      Returns:
      -- the Varnode
    • getNumVarnodes

      public int getNumVarnodes()
    • getPcodeOps

      public Iterator<PcodeOpAST> getPcodeOps()
      return all PcodeOps (alive or dead) ordered by SequenceNumber
      Returns:
      -- Iterator to PcodeOps
    • getPcodeOps

      public Iterator<PcodeOpAST> getPcodeOps(Address addr)
      return all PcodeOps associated with a particular instruction Address
      Parameters:
      addr - -- Address of instruction generating PcodeOps
      Returns:
      -- Iterator to PcodeOps
    • getPcodeOp

      public PcodeOp getPcodeOp(SequenceNumber sq)
    • getBasicBlocks

      public ArrayList<PcodeBlockBasic> getBasicBlocks()
    • getAddressFactory

      public AddressFactory getAddressFactory()
      Specified by:
      getAddressFactory in interface PcodeFactory
      Returns:
      Address factory
    • getDataTypeManager

      public PcodeDataTypeManager getDataTypeManager()
      Specified by:
      getDataTypeManager in interface PcodeFactory
      Returns:
      pcode data type manager used to convert strings to Ghidra data types
    • newVarnode

      public Varnode newVarnode(int sz, Address addr)
      Description copied from interface: PcodeFactory
      Create a new Varnode with the given size and location
      Specified by:
      newVarnode in interface PcodeFactory
      Parameters:
      sz - size of the Varnode
      addr - location of the Varnode
      Returns:
      a new varnode
    • newVarnode

      public Varnode newVarnode(int sz, Address addr, int id)
      Description copied from interface: PcodeFactory
      Create a new Varnode with the given size and location. Associate the Varnode with a specific reference id so that it can be retrieved, using just the id, via getRef();
      Specified by:
      newVarnode in interface PcodeFactory
      Parameters:
      sz - size of the Varnode
      addr - location of the Varnode
      id - is the specific reference id
      Returns:
      the new Varnode
    • setInput

      public Varnode setInput(Varnode vn, boolean val)
      Description copied from interface: PcodeFactory
      Mark (or unmark) the given Varnode as an input (to its function)
      Specified by:
      setInput in interface PcodeFactory
      Parameters:
      vn - is the given Varnode
      val - is true if the Varnode should be marked
      Returns:
      the altered Varnode, which may not be the same object passed in
    • getRef

      public Varnode getRef(int id)
      Description copied from interface: PcodeFactory
      Return a Varnode given its reference id, or null if the id is not registered. The id must have previously been registered via newVarnode().
      Specified by:
      getRef in interface PcodeFactory
      Parameters:
      id - is the reference id
      Returns:
      the matching Varnode or null
    • getSymbol

      public HighSymbol getSymbol(long symbolId)
      Description copied from interface: PcodeFactory
      Get the high symbol matching the given id that has been registered with this object
      Specified by:
      getSymbol in interface PcodeFactory
      Parameters:
      symbolId - is the given id
      Returns:
      the matching HighSymbol or null
    • setDataType

      public void setDataType(Varnode vn, DataType type)
      Description copied from interface: PcodeFactory
      Attach a data-type to the given Varnode
      Specified by:
      setDataType in interface PcodeFactory
      Parameters:
      vn - is the given Varnode
      type - is the data-type
    • setAddrTied

      public void setAddrTied(Varnode vn, boolean val)
      Description copied from interface: PcodeFactory
      Mark (or unmark) the given Varnode with the "address tied" property
      Specified by:
      setAddrTied in interface PcodeFactory
      Parameters:
      vn - is the given Varnode
      val - is true if the Varnode should be marked
    • setPersistent

      public void setPersistent(Varnode vn, boolean val)
      Description copied from interface: PcodeFactory
      Mark (or unmark) the given Varnode with the "persistent" property
      Specified by:
      setPersistent in interface PcodeFactory
      Parameters:
      vn - is the given Varnode
      val - is true if the Varnode should be marked
    • setUnaffected

      public void setUnaffected(Varnode vn, boolean val)
      Description copied from interface: PcodeFactory
      Mark (or unmark) the given Varnode with the "unaffected" property
      Specified by:
      setUnaffected in interface PcodeFactory
      Parameters:
      vn - is the given Varnode
      val - is true if the Varnode should be marked
    • setVolatile

      public void setVolatile(Varnode vn, boolean val)
      Description copied from interface: PcodeFactory
      Mark (or unmark) the given Varnode with the "volatile" property
      Specified by:
      setVolatile in interface PcodeFactory
      Parameters:
      vn - is the given Varnode
      val - is true if the Varnode should be marked volatile
    • setMergeGroup

      public void setMergeGroup(Varnode vn, short val)
      Description copied from interface: PcodeFactory
      Associate a specific merge group with the given Varnode
      Specified by:
      setMergeGroup in interface PcodeFactory
      Parameters:
      vn - is the given Varnode
      val - is the merge group
    • getOpRef

      public PcodeOp getOpRef(int id)
      Description copied from interface: PcodeFactory
      Get a PcodeOp given a reference id. The reference id corresponds to the op's SequenceNumber.getTime() field. Return null if no op matching the id has been registered via newOp().
      Specified by:
      getOpRef in interface PcodeFactory
      Parameters:
      id - is the reference id
      Returns:
      the matching PcodeOp or null
    • insertBefore

      public void insertBefore(PcodeOp newop, PcodeOp follow)
    • insertAfter

      public void insertAfter(PcodeOp newop, PcodeOp prev)
    • setOpcode

      public void setOpcode(PcodeOp op, int opc)
    • setOutput

      public void setOutput(PcodeOp op, Varnode vn)
    • unSetOutput

      public void unSetOutput(PcodeOp op)
    • setInput

      public void setInput(PcodeOp op, Varnode vn, int slot)
    • unSetInput

      public void unSetInput(PcodeOp op, int slot)
    • unInsert

      public void unInsert(PcodeOp op)
    • delete

      public void delete(PcodeOp op)
    • unlink

      public void unlink(PcodeOpAST op)
    • newOp

      public PcodeOp newOp(SequenceNumber sq, int opc, ArrayList<Varnode> inputs, Varnode output)
      Description copied from interface: PcodeFactory
      Create a new PcodeOp given its opcode, sequence number, and input and output Varnodes
      Specified by:
      newOp in interface PcodeFactory
      Parameters:
      sq - is the sequence number
      opc - is the opcode
      inputs - is the array of input Varnodes, which may be empty
      output - is the output Varnode, which may be null
      Returns:
      the new PcodeOp
    • decode

      public void decode(Decoder decoder) throws DecoderException
      Throws:
      DecoderException