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 -
      Returns:
    • 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 -
      slotCount -
      Returns:
    • createRegister

      public static StorageEntry createRegister(long regId)
      Create a single-register storage entry.
      Parameters:
      regId - register id (refer to register banks)
      Returns:
    • 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:
    • 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:
    • createRegisterQuad

      public static StorageEntry createRegisterQuad(long regId1, long regId2, long regId3, long regId4)
      Parameters:
      regId1 -
      regId2 -
      regId3 -
      regId4 -
      Returns:
    • createRegisterQuadEndianDep

      public static StorageEntry createRegisterQuadEndianDep(long regId1, long regId2, long regId3, long regId4)
      Parameters:
      regId1 -
      regId2 -
      regId3 -
      regId4 -
      Returns:
    • 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:
    • 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:
    • withCount

      public StorageEntry withCount(int count)
      Duplicate this STACK entry, and set a custom slot count.
      Parameters:
      count -
      Returns:
    • 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()
    • getValueAsStackIndex

      public int getValueAsStackIndex()
    • getRegisters

      public Collection<Long> getRegisters()
    • collectRegisters

      public void collectRegisters(Set<Long> sink)
    • getValue

      public long getValue()
      Get the slot index or native register id, depending on the type of this object.
      Returns:
    • 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.
      Returns:
    • getValue2

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

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

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

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

      public List<StorageEntry> getMixedItems()
      Returns:
    • getMixedItem

      public StorageEntry getMixedItem(int index)
      Parameters:
      index -
      Returns:
    • 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()
    • isRegisterBased

      public boolean isRegisterBased()
    • nextStackEntry

      public StorageEntry nextStackEntry(int slotcount)
    • nextStackEntry

      public StorageEntry nextStackEntry(int slotcount, int slotalign)
    • getSlotCount

      public int getSlotCount()
    • toString

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

      public String formatLong(IRegisterBank rbl)
    • formatParseable

      public String formatParseable(IRegisterBank rbl)