decompiler  1.0.0
Public Member Functions | Static Public Attributes | Static Private Attributes | List of all members
ghidra::JoinSpace Class Reference

The pool of logically joined variables. More...

#include <space.hh>

Inheritance diagram for ghidra::JoinSpace:
ghidra::AddrSpace

Public Member Functions

 JoinSpace (AddrSpaceManager *m, const Translate *t, int4 ind)
 
virtual int4 overlapJoin (uintb offset, int4 size, AddrSpace *pointSpace, uintb pointOff, int4 pointSkip) const
 Determine if a given point is contained in an address range in this address space. More...
 
virtual void encodeAttributes (Encoder &encoder, uintb offset) const
 
virtual void encodeAttributes (Encoder &encoder, uintb offset, int4 size) const
 
virtual uintb decodeAttributes (Decoder &decoder, uint4 &size) const
 
virtual void printRaw (ostream &s, uintb offset) const
 Write an address in this space to a stream. More...
 
virtual uintb read (const string &s, int4 &size) const
 Read in an address (and possible size) from a string. More...
 
virtual void saveXml (ostream &s) const
 Write the details of this space as XML. More...
 
virtual void decode (Decoder &decoder)
 Recover the details of this space from XML.
 
- Public Member Functions inherited from ghidra::AddrSpace
 AddrSpace (AddrSpaceManager *m, const Translate *t, spacetype tp, const string &nm, uint4 size, uint4 ws, int4 ind, uint4 fl, int4 dl)
 
 AddrSpace (AddrSpaceManager *m, const Translate *t, spacetype tp)
 For use with decode. More...
 
virtual ~AddrSpace (void)
 The address space destructor.
 
const string & getName (void) const
 Get the name. More...
 
AddrSpaceManagergetManager (void) const
 Get the space manager. More...
 
const TranslategetTrans (void) const
 Get the processor translator. More...
 
spacetype getType (void) const
 Get the type of space. More...
 
int4 getDelay (void) const
 Get number of heritage passes being delayed. More...
 
int4 getDeadcodeDelay (void) const
 Get number of passes before deadcode removal is allowed. More...
 
int4 getIndex (void) const
 Get the integer identifier. More...
 
uint4 getWordSize (void) const
 Get the addressable unit size. More...
 
uint4 getAddrSize (void) const
 Get the size of the space. More...
 
uintb getHighest (void) const
 Get the highest byte-scaled address. More...
 
uintb getPointerLowerBound (void) const
 Get lower bound for assuming an offset is a pointer. More...
 
uintb getPointerUpperBound (void) const
 Get upper bound for assuming an offset is a pointer. More...
 
int4 getMinimumPtrSize (void) const
 Get the minimum pointer size for this space. More...
 
uintb wrapOffset (uintb off) const
 Wrap -off- to the offset that fits into this space. More...
 
char getShortcut (void) const
 Get the shortcut character. More...
 
bool isHeritaged (void) const
 Return true if dataflow has been traced. More...
 
bool doesDeadcode (void) const
 Return true if dead code analysis should be done on this space. More...
 
bool hasPhysical (void) const
 Return true if data is physically stored in this. More...
 
bool isBigEndian (void) const
 Return true if values in this space are big endian. More...
 
bool isReverseJustified (void) const
 Return true if alignment justification does not match endianness. More...
 
bool isFormalStackSpace (void) const
 Return true if this is attached to the formal stack pointer. More...
 
bool isOverlay (void) const
 Return true if this is an overlay space.
 
bool isOverlayBase (void) const
 Return true if other spaces overlay this space.
 
bool isOtherSpace (void) const
 Return true if this is the other address space.
 
bool isTruncated (void) const
 Return true if this space is truncated from its original size. More...
 
bool hasNearPointers (void) const
 Return true if near (truncated) pointers into this space are possible.
 
void printOffset (ostream &s, uintb offset) const
 Write an address offset to a stream. More...
 
virtual int4 numSpacebase (void) const
 Number of base registers associated with this space. More...
 
virtual const VarnodeDatagetSpacebase (int4 i) const
 Get a base register that creates this virtual space. More...
 
virtual const VarnodeDatagetSpacebaseFull (int4 i) const
 Return original spacebase register before truncation. More...
 
virtual bool stackGrowsNegative (void) const
 Return true if a stack in this space grows negative. More...
 
virtual AddrSpacegetContain (void) const
 Return this space's containing space (if any) More...
 

Static Public Attributes

static const string NAME = "join"
 Reserved name for the join space.
 

Static Private Attributes

static const int4 MAX_PIECES = 64
 Maximum number of pieces that can be marshaled in one join address.
 

Additional Inherited Members

- Public Types inherited from ghidra::AddrSpace
enum  {
  big_endian = 1, heritaged = 2, does_deadcode = 4, programspecific = 8,
  reverse_justification = 16, formal_stackspace = 0x20, overlay = 0x40, overlaybase = 0x80,
  truncated = 0x100, hasphysical = 0x200, is_otherspace = 0x400, has_nearpointers = 0x800
}
 
- Static Public Member Functions inherited from ghidra::AddrSpace
static uintb addressToByte (uintb val, uint4 ws)
 Scale from addressable units to byte units. More...
 
static uintb byteToAddress (uintb val, uint4 ws)
 Scale from byte units to addressable units. More...
 
static int8 addressToByteInt (int8 val, uint4 ws)
 Scale int4 from addressable units to byte units. More...
 
static int8 byteToAddressInt (int8 val, uint4 ws)
 Scale int4 from byte units to addressable units. More...
 
static bool compareByIndex (const AddrSpace *a, const AddrSpace *b)
 Compare two spaces by their index. More...
 
- Protected Member Functions inherited from ghidra::AddrSpace
void calcScaleMask (void)
 Calculate scale and mask. More...
 
void setFlags (uint4 fl)
 Set a cached attribute. More...
 
void clearFlags (uint4 fl)
 Clear a cached attribute. More...
 
void saveBasicAttributes (ostream &s) const
 Write the XML attributes of this space. More...
 
void decodeBasicAttributes (Decoder &decoder)
 Read attributes for this space from an open XML element. More...
 
void truncateSpace (uint4 newsize)
 
- Protected Attributes inherited from ghidra::AddrSpace
string name
 Name of this space.
 
uint4 addressSize
 Size of an address into this space in bytes.
 
uint4 wordsize
 Size of unit being addressed (1=byte)
 
int4 minimumPointerSize
 Smallest size of a pointer into this space (in bytes)
 
int4 index
 An integer identifier for the space.
 
int4 delay
 Delay in heritaging this space.
 
int4 deadcodedelay
 Delay before deadcode removal is allowed on this space.
 

Detailed Description

The pool of logically joined variables.

Some logical variables are split across non-contiguous regions of memory. This space creates a virtual place for these logical variables to exist. Any memory location within this space is backed by 2 or more memory locations in other spaces that physically hold the pieces of the logical value. The database controlling symbols is responsible for keeping track of mapping the logical address in this space to its physical pieces. Offsets into this space do not have an absolute meaning, the database may vary what offset is assigned to what set of pieces.

Constructor & Destructor Documentation

◆ JoinSpace()

ghidra::JoinSpace::JoinSpace ( AddrSpaceManager m,
const Translate t,
int4  ind 
)

This is the constructor for the join space, which is automatically constructed by the analysis engine, and constructed only once. The name should always be join.

Parameters
mis the associated address space manager
tis the associated processor translator
indis the integer identifier

References ghidra::AddrSpace::clearFlags(), ghidra::AddrSpace::heritaged, and ghidra::IPTR_JOIN.

Member Function Documentation

◆ decodeAttributes()

uintb ghidra::JoinSpace::decodeAttributes ( Decoder decoder,
uint4 &  size 
) const
virtual

Parse a join address the current element. Pieces of the join are encoded as a sequence of attributes. The Translate::findAddJoin method is used to construct a logical address within the join space.

Parameters
decoderis the stream decoder
sizeis a reference to be filled in as the size encoded by the tag
Returns
the offset of the final address encoded by the tag

Reimplemented from ghidra::AddrSpace.

References ghidra::AddrSpaceManager::findAddJoin(), ghidra::Decoder::getIndexedAttributeId(), ghidra::AddrSpace::getManager(), ghidra::Decoder::getNextAttributeId(), ghidra::Translate::getRegister(), ghidra::AddrSpaceManager::getSpaceByName(), ghidra::AddrSpace::getTrans(), ghidra::JoinRecord::getUnified(), MAX_PIECES, ghidra::VarnodeData::offset, ghidra::Decoder::readString(), ghidra::Decoder::readUnsignedInteger(), ghidra::VarnodeData::size, and ghidra::VarnodeData::space.

◆ encodeAttributes() [1/2]

void ghidra::JoinSpace::encodeAttributes ( Encoder encoder,
uintb  offset 
) const
virtual

Encode a join address to the stream. This method in the interface only outputs attributes for a single element, so we are forced to encode what should probably be recursive elements into an attribute.

Parameters
encoderis the stream encoder
offsetis the offset within the address space to encode

Reimplemented from ghidra::AddrSpace.

References ghidra::AddrSpaceManager::findJoin(), ghidra::AddrSpace::getManager(), ghidra::AddrSpace::getName(), ghidra::JoinRecord::getPiece(), ghidra::JoinRecord::getUnified(), MAX_PIECES, ghidra::JoinRecord::numPieces(), ghidra::VarnodeData::size, ghidra::VarnodeData::space, ghidra::Encoder::writeSpace(), ghidra::Encoder::writeStringIndexed(), and ghidra::Encoder::writeUnsignedInteger().

Referenced by encodeAttributes().

◆ encodeAttributes() [2/2]

void ghidra::JoinSpace::encodeAttributes ( Encoder encoder,
uintb  offset,
int4  size 
) const
virtual

Encode a join address to the stream. This method in the interface only outputs attributes for a single element, so we are forced to encode what should probably be recursive elements into an attribute.

Parameters
encoderis the stream encoder
offsetis the offset within the address space to encode
sizeis the size of the memory location being encoded

Reimplemented from ghidra::AddrSpace.

References encodeAttributes().

◆ overlapJoin()

int4 ghidra::JoinSpace::overlapJoin ( uintb  offset,
int4  size,
AddrSpace pointSpace,
uintb  pointOff,
int4  pointSkip 
) const
virtual

Determine if a given point is contained in an address range in this address space.

The point is specified as an address space and offset pair plus an additional number of bytes to "skip". A non-negative value is returned if the point falls in the address range. If the point falls on the first byte of the range, 0 is returned. For the second byte, 1 is returned, etc. Otherwise -1 is returned.

Parameters
offsetis the starting offset of the address range within this space
sizeis the size of the address range in bytes
pointSpaceis the address space of the given point
pointOffis the offset of the given point
pointSkipis the additional bytes to skip
Returns
a non-negative value indicating where the point falls in the range, or -1

Reimplemented from ghidra::AddrSpace.

References ghidra::AddrSpaceManager::findJoin(), ghidra::JoinRecord::getEquivalentAddress(), ghidra::AddrSpace::getManager(), ghidra::Address::getOffset(), ghidra::JoinRecord::getPiece(), ghidra::Address::getSpace(), ghidra::AddrSpace::getType(), ghidra::IPTR_CONSTANT, ghidra::AddrSpace::isBigEndian(), ghidra::JoinRecord::numPieces(), ghidra::VarnodeData::size, and ghidra::AddrSpace::wrapOffset().

◆ printRaw()

void ghidra::JoinSpace::printRaw ( ostream &  s,
uintb  offset 
) const
virtual

Write an address in this space to a stream.

This is a printing method for the debugging routines. It prints taking into account the wordsize, adding a "+n" if the offset is not on-cut with wordsize. It also returns the expected/typical size of values from this space.

Parameters
sis the stream being written
offsetis the offset to be printed

Reimplemented from ghidra::AddrSpace.

References ghidra::AddrSpaceManager::findJoin(), ghidra::AddrSpace::getManager(), ghidra::JoinRecord::getPiece(), ghidra::JoinRecord::getUnified(), ghidra::JoinRecord::numPieces(), and ghidra::VarnodeData::size.

◆ read()

uintb ghidra::JoinSpace::read ( const string &  s,
int4 &  size 
) const
virtual

Read in an address (and possible size) from a string.

For the console mode, an address space can tailor how it converts user strings into offsets within the space. The base routine can read and convert register names as well as absolute hex addresses. A size can be indicated by appending a ':' and integer, .i.e. 0x1000:2. Offsets within a register can be indicated by appending a '+' and integer, i.e. eax+2

Parameters
sis the string to be parsed
sizeis a reference to the size being returned
Returns
the parsed offset

Reimplemented from ghidra::AddrSpace.

References ghidra::AddrSpaceManager::findAddJoin(), ghidra::AddrSpace::getManager(), ghidra::Translate::getRegister(), ghidra::AddrSpaceManager::getSpaceByShortcut(), ghidra::AddrSpace::getTrans(), ghidra::JoinRecord::getUnified(), ghidra::VarnodeData::offset, and ghidra::AddrSpace::read().

◆ saveXml()

void ghidra::JoinSpace::saveXml ( ostream &  s) const
virtual

Write the details of this space as XML.

Write a tag fully describing the details of this space suitable for later recovery via decode.

Parameters
sis the stream being written

Reimplemented from ghidra::AddrSpace.


The documentation for this class was generated from the following files: