Class AbstractDBTraceProgramViewReferenceManager

java.lang.Object
ghidra.trace.database.program.AbstractDBTraceProgramViewReferenceManager
All Implemented Interfaces:
ReferenceManager
Direct Known Subclasses:
DBTraceProgramViewReferenceManager

public abstract class AbstractDBTraceProgramViewReferenceManager extends Object implements ReferenceManager
  • Field Details

  • Constructor Details

    • AbstractDBTraceProgramViewReferenceManager

      public AbstractDBTraceProgramViewReferenceManager(DBTraceProgramView program)
  • Method Details

    • getReferenceOperations

      protected abstract TraceReferenceOperations getReferenceOperations(boolean createIfAbsent)
    • getCodeOperations

      protected abstract TraceCodeOperations getCodeOperations(boolean createIfAbsent)
    • chooseLifespan

      protected Lifespan chooseLifespan(Address fromAddr)
    • addReference

      public Reference addReference(Reference reference)
      Description copied from interface: ReferenceManager
      Add a memory, stack, register or external reference
      Specified by:
      addReference in interface ReferenceManager
      Parameters:
      reference - reference to be added
      Returns:
      new reference
    • addStackReference

      public Reference addStackReference(Address fromAddr, int opIndex, int stackOffset, RefType type, SourceType source)
      Description copied from interface: ReferenceManager
      Add a reference to a stack location. If a reference already exists for the fromAddr and opIndex, the existing reference is replaced with the new reference.
      Specified by:
      addStackReference in interface ReferenceManager
      Parameters:
      fromAddr - "from" address within a function
      opIndex - operand index
      stackOffset - stack offset of the reference
      type - reference type - how the location is being referenced.
      source - the source of this reference
      Returns:
      new stack reference
    • addRegisterReference

      public Reference addRegisterReference(Address fromAddr, int opIndex, Register register, RefType type, SourceType source)
      Description copied from interface: ReferenceManager
      Add a reference to a register. If a reference already exists for the fromAddr and opIndex, the existing reference is replaced with the new reference.
      Specified by:
      addRegisterReference in interface ReferenceManager
      Parameters:
      fromAddr - "from" address
      opIndex - operand index
      register - register to add the reference to
      type - reference type - how the location is being referenced.
      source - the source of this reference
      Returns:
      new register reference
    • addMemoryReference

      public Reference addMemoryReference(Address fromAddr, Address toAddr, RefType type, SourceType source, int opIndex)
      Description copied from interface: ReferenceManager
      Adds a memory reference. The first memory reference placed on an operand will be made primary by default. All non-memory references will be removed from the specified operand. Certain reference types may not be specified (e.g., RefType.FALL_THROUGH).
      Specified by:
      addMemoryReference in interface ReferenceManager
      Parameters:
      fromAddr - address of the code unit where the reference occurs
      toAddr - address of the location being referenced. Memory, stack, and register addresses are all permitted.
      type - reference type - how the location is being referenced.
      source - the source of this reference
      opIndex - the operand index display of the operand making this reference
      Returns:
      new memory reference
    • addOffsetMemReference

      public Reference addOffsetMemReference(Address fromAddr, Address toAddr, boolean toAddrIsBase, long offset, RefType type, SourceType source, int opIndex)
      Description copied from interface: ReferenceManager
      Add an offset memory reference. The first memory reference placed on an operand will be made primary by default. All non-memory references will be removed from the specified operand. If toAddr corresponds to the EXTERNAL memory block (see MemoryBlock.EXTERNAL_BLOCK_NAME) the resulting offset reference will report to/base address as the same regardless of specified offset.
      Specified by:
      addOffsetMemReference in interface ReferenceManager
      Parameters:
      fromAddr - address for the "from"
      toAddr - address of the location being referenced.
      toAddrIsBase - if true toAddr is treated as base address, else treated as (base+offet). It is generally preferred to specify as a base address to ensure proper handling of EXTERNAL block case.
      offset - value added to a base address to get the toAddr
      type - reference type - how the location is being referenced
      source - the source of this reference
      opIndex - the operand index
      Returns:
      new offset reference
    • addShiftedMemReference

      public Reference addShiftedMemReference(Address fromAddr, Address toAddr, int shiftValue, RefType type, SourceType source, int opIndex)
      Description copied from interface: ReferenceManager
      Add a shifted memory reference; the "to" address is computed as the value at the operand at opIndex shifted by some number of bits, specified in the shiftValue parameter. The first memory reference placed on an operand will be made primary by default. All non-memory references will be removed from the specified operand.
      Specified by:
      addShiftedMemReference in interface ReferenceManager
      Parameters:
      fromAddr - source/from memory address
      toAddr - destination/to memory address computed as some base offset value shifted left by the number of bits specified by shiftValue. The least-significant bits of toAddr offset should be 0's based upon the specified shiftValue since this value is shifted right to calculate the base offset value.
      shiftValue - number of bits to shift
      type - reference type - how the location is being referenced
      source - the source of this reference
      opIndex - the operand index
      Returns:
      new shifted reference
    • addExternalReference

      public Reference addExternalReference(Address fromAddr, String libraryName, String extLabel, Address extAddr, SourceType source, int opIndex, RefType type) throws InvalidInputException, DuplicateNameException
      Description copied from interface: ReferenceManager
      Adds an external reference to an external symbol. If a reference already exists at fromAddr and opIndex the existing reference is replaced with a new reference. If the external symbol cannot be found, a new Library and/or ExternalLocation symbol will be created which corresponds to the specified library/file named libraryName and the location within that file identified by extLabel and/or its memory address extAddr. Either or both extLabel or extAddr must be specified.
      Specified by:
      addExternalReference in interface ReferenceManager
      Parameters:
      fromAddr - from memory address (source of the reference)
      libraryName - name of external program
      extLabel - label within the external program, may be null if extAddr is not null
      extAddr - memory address within the external program, may be null
      source - the source of this reference
      opIndex - operand index
      type - reference type - how the location is being referenced
      Returns:
      new external space reference
      Throws:
      InvalidInputException - if libraryName is invalid or null, or an invalid extlabel is specified. Names with spaces or the empty string are not permitted. Neither extLabel nor extAddr was specified properly.
      DuplicateNameException - if another non-Library namespace has the same name
    • addExternalReference

      public Reference addExternalReference(Address fromAddr, Namespace extNamespace, String extLabel, Address extAddr, SourceType source, int opIndex, RefType type) throws InvalidInputException, DuplicateNameException
      Description copied from interface: ReferenceManager
      Adds an external reference. If a reference already exists for the fromAddr and opIndex, the existing reference is replaced with the new reference.
      Specified by:
      addExternalReference in interface ReferenceManager
      Parameters:
      fromAddr - from memory address (source of the reference)
      extNamespace - external namespace containing the named external label.
      extLabel - label within the external program, may be null if extAddr is not null
      extAddr - address within the external program, may be null
      source - the source of this reference
      opIndex - operand index
      type - reference type - how the location is being referenced
      Returns:
      new external space reference
      Throws:
      InvalidInputException - if an invalid extlabel is specified. Names with spaces or the empty string are not permitted. Neither extLabel nor extAddr was specified properly.
      DuplicateNameException - if another non-Library namespace has the same name
    • addExternalReference

      public Reference addExternalReference(Address fromAddr, int opIndex, ExternalLocation location, SourceType source, RefType type) throws InvalidInputException
      Description copied from interface: ReferenceManager
      Adds an external reference. If a reference already exists for the fromAddr and opIndex, the existing reference is replaced with the new reference.
      Specified by:
      addExternalReference in interface ReferenceManager
      Parameters:
      fromAddr - from memory address (source of the reference)
      opIndex - operand index
      location - external location
      source - the source of this reference
      type - reference type - how the location is being referenced
      Returns:
      external reference
      Throws:
      InvalidInputException - if the input is invalid
    • removeAllReferencesFrom

      public void removeAllReferencesFrom(Address beginAddr, Address endAddr)
      Description copied from interface: ReferenceManager
      Removes all references where "From address" is in the given range.
      Specified by:
      removeAllReferencesFrom in interface ReferenceManager
      Parameters:
      beginAddr - the first address in the range.
      endAddr - the last address in the range.
    • removeAllReferencesFrom

      public void removeAllReferencesFrom(Address fromAddr)
      Description copied from interface: ReferenceManager
      Remove all stack, external, and memory references for the given from address.
      Specified by:
      removeAllReferencesFrom in interface ReferenceManager
      Parameters:
      fromAddr - the address of the code unit from which to remove all references.
    • removeAllReferencesTo

      public void removeAllReferencesTo(Address toAddr)
      Description copied from interface: ReferenceManager
      Remove all stack, external, and memory references for the given to address.
      Specified by:
      removeAllReferencesTo in interface ReferenceManager
      Parameters:
      toAddr - the address for which all references to should be removed.
    • getReferencesTo

      public Reference[] getReferencesTo(Variable var)
      Description copied from interface: ReferenceManager
      Returns all references to the given variable. Only data references to storage are considered.
      Specified by:
      getReferencesTo in interface ReferenceManager
      Parameters:
      var - variable to retrieve references to
      Returns:
      array of variable references, or zero length array if no references exist
    • getReferencedVariable

      public Variable getReferencedVariable(Reference reference)
      Description copied from interface: ReferenceManager
      Returns the referenced function variable.
      Specified by:
      getReferencedVariable in interface ReferenceManager
      Parameters:
      reference - variable reference
      Returns:
      function variable or null if variable not found
    • setPrimary

      public void setPrimary(Reference ref, boolean isPrimary)
      Description copied from interface: ReferenceManager
      Set the given reference's primary attribute
      Specified by:
      setPrimary in interface ReferenceManager
      Parameters:
      ref - the reference to make primary.
      isPrimary - true to make the reference primary, false to make it non-primary
    • any

      protected boolean any(boolean noSpace, Predicate<Long> predicate)
    • collect

      protected Collection<Reference> collect(Function<Long,Collection<? extends Reference>> refFunc)
    • hasFlowReferencesFrom

      public boolean hasFlowReferencesFrom(Address addr)
      Description copied from interface: ReferenceManager
      Return whether the given address has flow references from it.
      Specified by:
      hasFlowReferencesFrom in interface ReferenceManager
      Parameters:
      addr - the address to test for flow references.
      Returns:
      true if the given address has flow references from it, else false
    • getFlowReferencesFrom

      public Reference[] getFlowReferencesFrom(Address addr)
      Description copied from interface: ReferenceManager
      Get all flow references from the given address.
      Specified by:
      getFlowReferencesFrom in interface ReferenceManager
      Parameters:
      addr - the address of the code unit to get all flows from.
      Returns:
      get all flow references from the given address.
    • getExternalReferences

      public ReferenceIterator getExternalReferences()
      Description copied from interface: ReferenceManager
      Returns an iterator over all external space references
      Specified by:
      getExternalReferences in interface ReferenceManager
      Returns:
      reference iterator over all external space references
    • getReferencesTo

      public ReferenceIterator getReferencesTo(Address addr)
      Description copied from interface: ReferenceManager
      Get an iterator over all references that have the given address as their "To" address.
      Specified by:
      getReferencesTo in interface ReferenceManager
      Parameters:
      addr - the address that all references in the iterator refer to.
      Returns:
      reference iterator over all references to the specified address.
    • getReferenceFromComparator

      protected Comparator<Reference> getReferenceFromComparator(boolean forward)
    • getReferenceIteratorForSnap

      protected Iterator<Reference> getReferenceIteratorForSnap(long snap, Address startAddr)
    • getReferenceIterator

      public ReferenceIterator getReferenceIterator(Address startAddr)
      Description copied from interface: ReferenceManager
      Get an iterator over references starting with the specified fromAddr. A forward iterator is returned with references sorted on the from address.
      Specified by:
      getReferenceIterator in interface ReferenceManager
      Parameters:
      startAddr - the first from address to consider.
      Returns:
      a forward memory reference iterator.
    • getReference

      public Reference getReference(Address fromAddr, Address toAddr, int opIndex)
      Description copied from interface: ReferenceManager
      Get the reference that has the given from and to address, and operand index.
      Specified by:
      getReference in interface ReferenceManager
      Parameters:
      fromAddr - the address of the code unit making the reference.
      toAddr - the address being referred to.
      opIndex - the operand index.
      Returns:
      reference which satisfies the specified criteria or null
    • getReferencesFrom

      public Reference[] getReferencesFrom(Address addr)
      Description copied from interface: ReferenceManager
      Get all references "from" the specified addr.
      Specified by:
      getReferencesFrom in interface ReferenceManager
      Parameters:
      addr - address of code-unit making the references.
      Returns:
      array of all references "from" the specified addr.
    • getReferencesFrom

      public Reference[] getReferencesFrom(Address fromAddr, int opIndex)
      Description copied from interface: ReferenceManager
      Returns all references "from" the given fromAddr and operand (specified by opIndex).
      Specified by:
      getReferencesFrom in interface ReferenceManager
      Parameters:
      fromAddr - the from which to get references
      opIndex - the operand from which to get references
      Returns:
      all references "from" the given fromAddr and operand.
    • hasReferencesFrom

      public boolean hasReferencesFrom(Address fromAddr, int opIndex)
      Description copied from interface: ReferenceManager
      Returns true if there are any memory references at the given address/opIndex. Keep in mind this is a rather inefficient method as it must examine all references from the specified fromAddr.
      Specified by:
      hasReferencesFrom in interface ReferenceManager
      Parameters:
      fromAddr - the address of the code unit being tested
      opIndex - the index of the operand being tested.
      Returns:
      true if one or more reference from the specified address and opindex are defined, else false
    • hasReferencesFrom

      public boolean hasReferencesFrom(Address fromAddr)
      Description copied from interface: ReferenceManager
      Returns true if there are any memory references at the given address.
      Specified by:
      hasReferencesFrom in interface ReferenceManager
      Parameters:
      fromAddr - the address of the code unit being tested
      Returns:
      true if one or more reference from the specified address are defined, else false
    • getPrimaryReferenceFrom

      public Reference getPrimaryReferenceFrom(Address addr, int opIndex)
      Description copied from interface: ReferenceManager
      Get the primary reference from the given address.
      Specified by:
      getPrimaryReferenceFrom in interface ReferenceManager
      Parameters:
      addr - from address
      opIndex - operand index
      Returns:
      the primary reference from the specified address and opindex if it exists, else null
    • getReferenceSourceIterator

      public AddressIterator getReferenceSourceIterator(Address startAddr, boolean forward)
      Description copied from interface: ReferenceManager
      Returns an iterator over addresses that are the "From" address in a reference
      Specified by:
      getReferenceSourceIterator in interface ReferenceManager
      Parameters:
      startAddr - address to position iterator.
      forward - true means to iterate in the forward direction
      Returns:
      address iterator where references from exist
    • getReferenceSourceIterator

      public AddressIterator getReferenceSourceIterator(AddressSetView addrSet, boolean forward)
      Description copied from interface: ReferenceManager
      Returns an iterator over all addresses that are the "From" address in a reference, restricted by the given address set.
      Specified by:
      getReferenceSourceIterator in interface ReferenceManager
      Parameters:
      addrSet - the set of address to restrict the iterator or null for all addresses.
      forward - true means to iterate in the forward direction address iterator where references from exist
      Returns:
      address iterator where references from exist constrained by addrSet
    • getReferenceDestinationIterator

      public AddressIterator getReferenceDestinationIterator(Address startAddr, boolean forward)
      Description copied from interface: ReferenceManager
      Returns an iterator over all addresses that are the "To" address in a reference.
      Specified by:
      getReferenceDestinationIterator in interface ReferenceManager
      Parameters:
      startAddr - start of iterator
      forward - true means to iterate in the forward direction address iterator where references to exist
      Returns:
      address iterator where references to exist
    • getReferenceDestinationIterator

      public AddressIterator getReferenceDestinationIterator(AddressSetView addrSet, boolean forward)
      Description copied from interface: ReferenceManager
      Returns an iterator over all addresses that are the "To" address in a memory reference, restricted by the given address set.
      Specified by:
      getReferenceDestinationIterator in interface ReferenceManager
      Parameters:
      addrSet - the set of address to restrict the iterator or null for all addresses.
      forward - true means to iterate in the forward direction
      Returns:
      address iterator where references to exist constrained by addrSet
    • getReferenceCountTo

      public int getReferenceCountTo(Address toAddr)
      Description copied from interface: ReferenceManager
      Returns the number of references to the specified toAddr.
      Specified by:
      getReferenceCountTo in interface ReferenceManager
      Parameters:
      toAddr - the address being referenced
      Returns:
      the number of references to the specified toAddr.
    • getReferenceCountFrom

      public int getReferenceCountFrom(Address fromAddr)
      Description copied from interface: ReferenceManager
      Returns the number of references from the specified fromAddr.
      Specified by:
      getReferenceCountFrom in interface ReferenceManager
      Parameters:
      fromAddr - the address of the code unit making the reference.
      Returns:
      the number of references from the specified fromAddr.
    • getReferenceDestinationCount

      public int getReferenceDestinationCount()
      Description copied from interface: ReferenceManager
      Return the number of references for "to" addresses.
      Specified by:
      getReferenceDestinationCount in interface ReferenceManager
      Returns:
      the number of references for "to" addresses.
    • getReferenceSourceCount

      public int getReferenceSourceCount()
      Description copied from interface: ReferenceManager
      Return the number of references for "from" addresses.
      Specified by:
      getReferenceSourceCount in interface ReferenceManager
      Returns:
      the number of references for "from" addresses.
    • hasReferencesTo

      public boolean hasReferencesTo(Address toAddr)
      Description copied from interface: ReferenceManager
      Return true if a memory reference exists with the given "to" address.
      Specified by:
      hasReferencesTo in interface ReferenceManager
      Parameters:
      toAddr - address being referred to.
      Returns:
      true if specified toAddr has one or more references to it, else false.
    • updateRefType

      public Reference updateRefType(Reference ref, RefType refType)
      Description copied from interface: ReferenceManager
      Update the reference type on a memory reference.
      Specified by:
      updateRefType in interface ReferenceManager
      Parameters:
      ref - reference to be updated
      refType - new reference type
      Returns:
      updated reference
    • setAssociation

      public void setAssociation(Symbol s, Reference ref)
      Description copied from interface: ReferenceManager
      Associates the given reference with the given symbol. Applies to memory references only where a specified label symbol must have an address which matches the reference to-address. Stack and register reference associations to variable symbols are always inferred.
      Specified by:
      setAssociation in interface ReferenceManager
      Parameters:
      s - the symbol to associate with the given reference.
      ref - the reference to associate with the given symbol
    • removeAssociation

      public void removeAssociation(Reference ref)
      Description copied from interface: ReferenceManager
      Removes any symbol associations with the given reference.
      Specified by:
      removeAssociation in interface ReferenceManager
      Parameters:
      ref - the reference for which any symbol association is to be removed.
    • delete

      public void delete(Reference ref)
      Description copied from interface: ReferenceManager
      Deletes the given reference object
      Specified by:
      delete in interface ReferenceManager
      Parameters:
      ref - the reference to be deleted.
    • getRefLevel

      public static byte getRefLevel(RefType rt)
      Get the reference level for a given reference type

      TODO: Why is this not a property of RefType, or a static method of SymbolUtilities?

      Note that this was copy-pasted from BigRefListV0, and there's an exact copy also in RefListV0.

      Parameters:
      rt - the reference type
      Returns:
      the reference level
    • getReferenceLevel

      public byte getReferenceLevel(Address toAddr)
      Returns the reference level for the references to the given address

      To clarify, "reference level" is a sort of priority assigned to each reference type. See, e.g., SymbolUtilities.SUB_LEVEL. Each is a byte constant, and greater values imply higher priority. This method returns the highest priority of any reference to the given address.

      TODO: Track this in the database?

      Specified by:
      getReferenceLevel in interface ReferenceManager
      Parameters:
      toAddr - the address at which to find the highest reference level
      Returns:
      reference level for specified to address.