Class StorageEntry

java.lang.Object
com.pnfsoftware.jeb.core.units.code.asm.type.StorageEntry

@Ser public class StorageEntry extends Object
Representation of an immutable storage entry (input/output) for sub-routine calls. Used to define ICallingConvention objects.

Types of storage entries:

  • stack entries (any slot count)
  • platform register (single slot)
  • pair of platform registers (double slot)
  • double-pair of platform registers (quad slot)
  • a mixed entry, made up of registers and stack slots (any slot count)
  • Method Details

    • createStackSlot

      public static StorageEntry createStackSlot(long slotIndex)
      Create a single-slot stack storage entry. Stack entries are relative to the stack pointer at the called routine entry-point.
      Parameters:
      slotIndex - stack slot index
      Returns:
      stack storage entry
    • createStackEntry

      public static StorageEntry createStackEntry(long slotIndex, int slotCount)
      Create a stack storage entry. Stack entries are relative to the stack pointer at the called routine entry-point.
      Parameters:
      slotIndex - stack slot index
      slotCount - number of stack slots
      Returns:
      stack storage entry
    • createRegister

      public static StorageEntry createRegister(long regId)
      Create a single-register storage entry.
      Parameters:
      regId - register id (refer to register banks)
      Returns:
      register storage entry
    • createRegisterPair

      public static StorageEntry createRegisterPair(long regId1, long regId2)
      Create a double-register storage entry.
      Parameters:
      regId1 - low register id (refer to register banks)
      regId2 - high register id (refer to register banks)
      Returns:
      register-pair storage entry
    • createRegisterPairEndianDep

      public static StorageEntry createRegisterPairEndianDep(long regId1, long regId2)
      Create a double-register storage entry. Register order (which one stores the LSB, which one stores the MSB) depends on external parameters.
      Parameters:
      regId1 - first register id (refer to register banks)
      regId2 - second register id (refer to register banks)
      Returns:
      endian-dependent register-pair storage entry
    • createRegisterQuad

      public static StorageEntry createRegisterQuad(long regId1, long regId2, long regId3, long regId4)
      Create a quad-register storage entry.
      Parameters:
      regId1 - first register id
      regId2 - second register id
      regId3 - third register id
      regId4 - fourth register id
      Returns:
      quad-register storage entry
    • createRegisterQuadEndianDep

      public static StorageEntry createRegisterQuadEndianDep(long regId1, long regId2, long regId3, long regId4)
      Create an endian-dependent quad-register storage entry.
      Parameters:
      regId1 - first register id
      regId2 - second register id
      regId3 - third register id
      regId4 - fourth register id
      Returns:
      endian-dependent quad-register storage entry
    • createMixed

      public static StorageEntry createMixed(StorageEntry... items)
      Create a mixed storage entry.
      Parameters:
      items - a 2+ items list of one or more StorageEntry.Type.REGISTER entries, followed by an optional StorageEntry.Type.STACK entry.
      Returns:
      mixed storage entry
    • createMixed

      public static StorageEntry createMixed(Collection<StorageEntry> items)
      Create a mixed storage entry.
      Parameters:
      items - a 2+ items list of one or more StorageEntry.Type.REGISTER entries, followed by an optional StorageEntry.Type.STACK entry.
      Returns:
      mixed storage entry
    • withCount

      public StorageEntry withCount(int count)
      Duplicate this STACK entry, and set a custom slot count.
      Parameters:
      count - slot count
      Returns:
      duplicated stack entry
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
    • equals

      public boolean equals(Object obj)
      Overrides:
      equals in class Object
    • getType

      public StorageEntry.Type getType()
      Retrieve the storage entry type.
      Returns:
      storage entry type
    • getValueAsStackIndex

      public int getValueAsStackIndex()
      Retrieve this stack entry's slot index.
      Returns:
      stack slot index
    • getRegisters

      public Collection<Long> getRegisters()
      Retrieve all registers referenced by this storage entry.
      Returns:
      register ids
    • collectRegisters

      public void collectRegisters(Set<Long> sink)
      Add all referenced registers to a sink.
      Parameters:
      sink - register-id sink
    • getValue

      public long getValue()
      Get the slot index or native register id, depending on the type of this object.
      Returns:
      slot index or register id
    • getValue

      public long getValue(Endianness endian)
      Get the slot index or native register id, depending on the type of this object. To be used for StorageEntry.Type.REGISTER_PAIR over getValue() which may return the wrong slot index.
      Parameters:
      endian - byte order used for endian-dependent register pairs
      Returns:
      slot index or register id
    • getValue2

      public long getValue2()
      For register pairs, retrieve the native register id of the second register of the pair.
      Returns:
      second register id
    • getValue2

      public long getValue2(Endianness endian)
      For register pairs, retrieve the native register id of the second register of the pair.
      Parameters:
      endian - byte order used for endian-dependent register pairs
      Returns:
      second register id
    • getValue3

      public long getValue3()
      For register quads, retrieve the native register id of the third register.
      Returns:
      third register id
    • getValue4

      public long getValue4()
      For register quads, retrieve the native register id of the fourth register.
      Returns:
      fourth register id
    • getMixedItems

      public List<StorageEntry> getMixedItems()
      Retrieve the items of a mixed storage entry.
      Returns:
      mixed storage items
    • getMixedItem

      public StorageEntry getMixedItem(int index)
      Retrieve an item of a mixed storage entry.
      Parameters:
      index - item index
      Returns:
      mixed storage item
    • nextSlotIndex

      public int nextSlotIndex(int currentSlotIndex, int requestedSlotCount)
      Calculate the next slot index given the slot index of the current storage entry.
      Parameters:
      currentSlotIndex - slot index of this storage entry
      requestedSlotCount - the amount of slots used to accommodate this entry, unless it was a register-based entry
      Returns:
      the next available slot for storage
    • isStackBased

      public boolean isStackBased()
      Determine whether this storage entry uses stack storage.
      Returns:
      true if stack-based
    • isRegisterBased

      public boolean isRegisterBased()
      Determine whether this storage entry uses register storage.
      Returns:
      true if register-based
    • nextStackEntry

      public StorageEntry nextStackEntry(int slotcount)
      Create the next stack entry after this entry.
      Parameters:
      slotcount - number of slots in the next entry
      Returns:
      next stack entry
    • nextStackEntry

      public StorageEntry nextStackEntry(int slotcount, int slotalign)
      Create the next aligned stack entry after this entry.
      Parameters:
      slotcount - number of slots in the next entry
      slotalign - stack slot alignment
      Returns:
      next stack entry
    • getSlotCount

      public int getSlotCount()
      Retrieve the number of storage slots used by this entry.
      Returns:
      slot count
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • formatLong

      public String formatLong(IRegisterBank rbl)
      Format this storage entry using register names.
      Parameters:
      rbl - register bank layout
      Returns:
      formatted storage entry
    • formatParseable

      public String formatParseable(IRegisterBank rbl)
      Format this storage entry in a parseable form.
      Parameters:
      rbl - register bank layout
      Returns:
      parseable storage entry