Ghidra 11.3.2
Ghidra internal decompiler documentation.
Loading...
Searching...
No Matches
ghidra::TypePointerRel Class Reference

Relative pointer: A pointer with a fixed offset into a specific structure or other data-type. More...

#include <type.hh>

Inheritance diagram for ghidra::TypePointerRel:
[legend]
Collaboration diagram for ghidra::TypePointerRel:
[legend]

Public Member Functions

 TypePointerRel (const TypePointerRel &op)
 Construct from another TypePointerRel.
 
 TypePointerRel (int4 sz, Datatype *pt, uint4 ws, Datatype *par, int4 off)
 Construct given a size, pointed-to type, parent, and offset.
 
DatatypegetParent (void) const
 Get the parent data-type to which this pointer is offset.
 
bool evaluateThruParent (uintb addrOff) const
 Do we display given address offset as coming from the parent data-type.
 
int4 getAddressOffset (void) const
 Get offset of this pointer relative to start of the containing data-type.
 
int4 getByteOffset (void) const
 Get offset of this pointer relative to start of the containing data-type.
 
virtual void printRaw (ostream &s) const
 Print a description of the type to stream.
 
virtual int4 compare (const Datatype &op, int4 level) const
 Order types for propagation.
 
virtual int4 compareDependency (const Datatype &op) const
 Compare for storage in tree structure.
 
virtual Datatypeclone (void) const
 Clone the data-type.
 
virtual void encode (Encoder &encoder) const
 Encode the data-type to a stream.
 
virtual TypePointerdownChain (int8 &off, TypePointer *&par, int8 &parOff, bool allowArrayWrap, TypeFactory &typegrp)
 Find a sub-type pointer given an offset into this.
 
virtual bool isPtrsubMatching (int8 off, int8 extra, int8 multiplier) const
 Is this data-type suitable as input to a CPUI_PTRSUB op.
 
virtual DatatypegetStripped (void) const
 Get the plain form of the pointer.
 
- Public Member Functions inherited from ghidra::TypePointer
 TypePointer (const TypePointer &op)
 Construct from another TypePointer.
 
 TypePointer (int4 s, Datatype *pt, uint4 ws)
 Construct from a size, pointed-to type, and wordsize.
 
 TypePointer (Datatype *pt, AddrSpace *spc)
 Construct from a pointed-to type and an address space attribute.
 
DatatypegetPtrTo (void) const
 Get the pointed-to Datatype.
 
uint4 getWordSize (void) const
 Get the size of the addressable unit being pointed to.
 
AddrSpacegetSpace (void) const
 Get any address space associated with this pointer.
 
virtual DatatypegetSubType (int8 off, int8 *newoff) const
 Recover component data-type one-level down.
 
virtual int4 numDepend (void) const
 Get the number of component sub-types making up this data-type.
 
virtual DatatypegetDepend (int4 index) const
 Get a specific component sub-type by index.
 
virtual void printNameBase (ostream &s) const
 Print (part of) the name of this data-type as short prefix for a label.
 
virtual DatatyperesolveInFlow (PcodeOp *op, int4 slot)
 Tailor data-type propagation based on Varnode use.
 
virtual DatatypefindResolve (const PcodeOp *op, int4 slot)
 Find a previously resolved sub-type.
 
- Public Member Functions inherited from ghidra::Datatype
 Datatype (const Datatype &op)
 Construct the base data-type copying low-level properties of another.
 
 Datatype (int4 s, int4 align, type_metatype m)
 Construct the base data-type providing size and meta-type.
 
virtual ~Datatype (void)
 Destructor.
 
bool isCoreType (void) const
 Is this a core data-type.
 
bool isCharPrint (void) const
 Does this print as a 'char'.
 
bool isEnumType (void) const
 Is this an enumerated type.
 
bool isASCII (void) const
 Does this print as an ASCII 'char'.
 
bool isUTF16 (void) const
 Does this print as UTF16 'wchar'.
 
bool isUTF32 (void) const
 Does this print as UTF32 'wchar'.
 
bool isVariableLength (void) const
 Is this a variable length structure.
 
bool hasSameVariableBase (const Datatype *ct) const
 Are these the same variable length data-type.
 
bool isOpaqueString (void) const
 Is this an opaquely encoded string.
 
bool isPointerToArray (void) const
 Is this a pointer to an array.
 
bool isPointerRel (void) const
 Is this a TypePointerRel.
 
bool isFormalPointerRel (void) const
 Is this a non-ephemeral TypePointerRel.
 
bool hasStripped (void) const
 Return true if this has a stripped form.
 
bool isIncomplete (void) const
 Is this an incompletely defined data-type.
 
bool needsResolution (void) const
 Is this a union or a pointer to union.
 
bool hasWarning (void) const
 Has a warning been issued about this data-type.
 
uint4 getInheritable (void) const
 Get properties pointers inherit.
 
uint4 getDisplayFormat (void) const
 Get the display format for constants with this data-type.
 
type_metatype getMetatype (void) const
 Get the type meta-type.
 
sub_metatype getSubMeta (void) const
 Get the sub-metatype.
 
uint8 getId (void) const
 Get the type id.
 
uint8 getUnsizedId (void) const
 Get the type id, without variable length size adjustment.
 
int4 getSize (void) const
 Get the type size.
 
int4 getAlignSize (void) const
 Get size rounded up to multiple of alignment.
 
int4 getAlignment (void) const
 Get the expected byte alignment.
 
const string & getName (void) const
 Get the type name.
 
const string & getDisplayName (void) const
 Get string to use in display.
 
DatatypegetTypedef (void) const
 Get the data-type immediately typedefed by this (or null)
 
virtual const TypeFieldfindTruncation (int8 off, int4 sz, const PcodeOp *op, int4 slot, int8 &newoff) const
 Find an immediate subfield of this data-type.
 
virtual DatatypenearestArrayedComponentForward (int8 off, int8 *newoff, int8 *elSize) const
 
virtual DatatypenearestArrayedComponentBackward (int8 off, int8 *newoff, int8 *elSize) const
 
virtual int4 getHoleSize (int4 off) const
 Get number of bytes at the given offset that are padding.
 
virtual int4 findCompatibleResolve (Datatype *ct) const
 Find a resolution compatible with the given data-type.
 
virtual const TypeFieldresolveTruncation (int8 offset, PcodeOp *op, int4 slot, int8 &newoff)
 Resolve which union field is being used for a given PcodeOp when a truncation is involved.
 
int4 typeOrder (const Datatype &op) const
 Order this with -op- datatype.
 
int4 typeOrderBool (const Datatype &op) const
 Order this with -op-, treating bool data-type as special.
 
void encodeRef (Encoder &encoder) const
 Encode a reference of this to a stream.
 
bool isPieceStructured (void) const
 Does this data-type consist of separate pieces?
 
bool isPrimitiveWhole (void) const
 Is this made up of a single primitive.
 

Static Public Member Functions

static DatatypegetPtrToFromParent (Datatype *base, int4 off, TypeFactory &typegrp)
 Given a containing data-type and offset, find the "pointed to" data-type suitable for a TypePointerRel.
 
- Static Public Member Functions inherited from ghidra::Datatype
static uint4 encodeIntegerFormat (const string &val)
 Encode the format attribute from an XML element.
 
static string decodeIntegerFormat (uint4 val)
 Decode the given format value into an XML attribute string.
 

Protected Member Functions

void markEphemeral (TypeFactory &typegrp)
 Mark this as an ephemeral data-type, to be replaced in the final output.
 
void decode (Decoder &decoder, TypeFactory &typegrp)
 
 TypePointerRel (void)
 Internal constructor for decode.
 
- Protected Member Functions inherited from ghidra::TypePointer
void decode (Decoder &decoder, TypeFactory &typegrp)
 Restore this pointer data-type from a stream.
 
void calcSubmeta (void)
 Calculate specific submeta for this pointer.
 
void calcTruncate (TypeFactory &typegrp)
 
 TypePointer (void)
 Internal constructor for use with decode.
 
- Protected Member Functions inherited from ghidra::Datatype
void decodeBasic (Decoder &decoder)
 Recover basic data-type properties.
 
void encodeBasic (type_metatype meta, int4 align, Encoder &encoder) const
 Encode basic data-type properties.
 
void encodeTypedef (Encoder &encoder) const
 Encode this as a typedef element to a stream.
 
void markComplete (void)
 Mark this data-type as completely defined.
 
void setDisplayFormat (uint4 format)
 Set a specific display format.
 

Protected Attributes

TypePointerstripped
 Same data-type with container info stripped.
 
Datatypeparent
 Parent structure or array which this is pointing into.
 
int4 offset
 Byte offset within the parent where this points to.
 
- Protected Attributes inherited from ghidra::TypePointer
Datatypeptrto
 Type being pointed to.
 
AddrSpacespaceid
 If non-null, the address space this is intented to point into.
 
TypePointertruncate
 Truncated form of the pointer (if not null)
 
uint4 wordsize
 What size unit does the pointer address.
 
- Protected Attributes inherited from ghidra::Datatype
uint8 id
 A unique id for the type (or 0 if an id is not assigned)
 
int4 size
 Size (of variable holding a value of this type)
 
uint4 flags
 Boolean properties of the type.
 
string name
 Name of type.
 
string displayName
 Name to display in output.
 
type_metatype metatype
 Meta-type - type disregarding size.
 
sub_metatype submeta
 Sub-type of of the meta-type, for comparisons.
 
DatatypetypedefImm
 The immediate data-type being typedefed by this.
 
int4 alignment
 Byte alignment expected for this data-type in addressable memory.
 
int4 alignSize
 Size of data-type rounded up to a multiple of alignment.
 

Friends

class TypeFactory
 

Additional Inherited Members

- Protected Types inherited from ghidra::Datatype
enum  {
  coretype = 1 , chartype = 2 , enumtype = 4 , poweroftwo = 8 ,
  utf16 = 16 , utf32 = 32 , opaque_string = 64 , variable_length = 128 ,
  has_stripped = 0x100 , is_ptrrel = 0x200 , type_incomplete = 0x400 , needs_resolution = 0x800 ,
  force_format = 0x7000 , truncate_bigendian = 0x8000 , pointer_to_array = 0x10000 , warning_issued = 0x20000
}
 Boolean properties of datatypes. More...
 
- Static Protected Member Functions inherited from ghidra::TypePointer
static bool testForArraySlack (Datatype *dt, int8 off)
 Test if an out-of-bounds offset makes sense as array slack.
 
- Static Protected Member Functions inherited from ghidra::Datatype
static uint8 hashName (const string &nm)
 Produce a data-type id by hashing the type name.
 
static uint8 hashSize (uint8 id, int4 size)
 Reversibly hash size into id.
 
static int4 calcAlignSize (int4 sz, int4 align)
 Calculate aligned size, given size and alignment of data-type.
 
- Static Protected Attributes inherited from ghidra::Datatype
static sub_metatype base2sub [18]
 

Detailed Description

Relative pointer: A pointer with a fixed offset into a specific structure or other data-type.

The other data-type, the container, is typically a TypeStruct or TypeArray. Even though this pointer does not point directly to the start of the container, it is possible to access the container through this, as the distance (the offset) to the start of the container is explicitly known.

Member Function Documentation

◆ clone()

virtual Datatype * ghidra::TypePointerRel::clone ( void  ) const
inlinevirtual

Clone the data-type.

Reimplemented from ghidra::TypePointer.

References TypePointerRel().

◆ compare()

int4 ghidra::TypePointerRel::compare ( const Datatype op,
int4  level 
) const
virtual

Order types for propagation.

Order this with another data-type, in a way suitable for the type propagation algorithm. Bigger types come earlier. More specific types come earlier.

Parameters
opis the data-type to compare with this
levelis maximum level to descend when recursively comparing
Returns
negative, 0, positive depending on ordering of types

Reimplemented from ghidra::TypePointer.

References ghidra::TypePointer::compare(), and stripped.

◆ compareDependency()

int4 ghidra::TypePointerRel::compareDependency ( const Datatype op) const
virtual

Compare for storage in tree structure.

Sort data-types for the main TypeFactory container. The sort needs to be based on the data-type structure so that an example data-type, constructed outside the factory, can be used to find the equivalent object inside the factory. This means the comparison should not examine the data-type id. In practice, the comparison only needs to go down one level in the component structure before just comparing component pointers.

Parameters
opis the data-type to compare with this
Returns
negative, 0, positive depending on ordering of types

Reimplemented from ghidra::TypePointer.

References ghidra::Datatype::getSize(), ghidra::Datatype::getSubMeta(), offset, parent, ghidra::TypePointer::ptrto, ghidra::Datatype::size, ghidra::Datatype::submeta, and ghidra::TypePointer::wordsize.

◆ decode()

◆ downChain()

TypePointer * ghidra::TypePointerRel::downChain ( int8 &  off,
TypePointer *&  par,
int8 &  parOff,
bool  allowArrayWrap,
TypeFactory typegrp 
)
virtual

Find a sub-type pointer given an offset into this.

Add a constant offset to this pointer. If there is a valid component at that offset, return a pointer to the data-type of the component or NULL otherwise. This routine only goes down one level at most. Pass back the renormalized offset relative to the new data-type. If this is a pointer to (into) a container, the data-type of the container is passed back, with the offset into the container.

Parameters
offis a reference to the offset to add
paris used to pass back the container
parOffis used to pass back the offset into the container
allowArrayWrapis true if the pointer should be treated as a pointer to an array
typegrpis the factory producing the (possibly new) data-type
Returns
a pointer datatype for the component or NULL

Reimplemented from ghidra::TypePointer.

References ghidra::calc_mask(), ghidra::TypePointer::downChain(), ghidra::Datatype::getMetatype(), ghidra::Datatype::getSize(), ghidra::TypeFactory::getTypePointer(), offset, parent, ghidra::TypePointer::ptrto, ghidra::Datatype::size, ghidra::TYPE_ARRAY, ghidra::TYPE_STRUCT, and ghidra::TypePointer::wordsize.

◆ encode()

void ghidra::TypePointerRel::encode ( Encoder encoder) const
virtual

Encode the data-type to a stream.

Encode a formal description of the data-type as a <type> element. For composite data-types, the description goes down one level, describing the component types only by reference.

Parameters
encoderis the stream encoder

Reimplemented from ghidra::TypePointer.

References ghidra::Encoder::closeElement(), ghidra::Datatype::encode(), ghidra::Datatype::encodeBasic(), ghidra::Datatype::encodeRef(), offset, ghidra::Encoder::openElement(), parent, ghidra::TypePointer::ptrto, ghidra::TYPE_PTRREL, ghidra::TypePointer::wordsize, ghidra::Encoder::writeSignedInteger(), and ghidra::Encoder::writeUnsignedInteger().

◆ evaluateThruParent()

bool ghidra::TypePointerRel::evaluateThruParent ( uintb  addrOff) const

Do we display given address offset as coming from the parent data-type.

For a variable that is a relative pointer, constant offsets relative to the variable can be displayed either as coming from the variable itself or from the parent object.

Parameters
addrOffis the given offset in address units
Returns
true if the variable should be displayed as coming from the parent

References ghidra::AddrSpace::addressToByte(), ghidra::calc_mask(), ghidra::Datatype::getMetatype(), ghidra::Datatype::getSize(), offset, ghidra::TypePointer::ptrto, ghidra::Datatype::size, ghidra::TYPE_STRUCT, and ghidra::TypePointer::wordsize.

Referenced by ghidra::AddTreeState::calcSubtype().

◆ getAddressOffset()

int4 ghidra::TypePointerRel::getAddressOffset ( void  ) const
inline

Get offset of this pointer relative to start of the containing data-type.

Returns
the offset value in address units

References ghidra::AddrSpace::byteToAddressInt(), offset, and ghidra::TypePointer::wordsize.

Referenced by ghidra::AddTreeState::AddTreeState(), ghidra::AddTreeState::calcSubtype(), and ghidra::PrintC::opPtrsub().

◆ getByteOffset()

int4 ghidra::TypePointerRel::getByteOffset ( void  ) const
inline

Get offset of this pointer relative to start of the containing data-type.

Returns
the offset value in byte units

References offset.

Referenced by ghidra::RuleStructOffset0::applyOp(), ghidra::SplitDatatype::getValueDatatype(), ghidra::TypeOpEqual::propagateAcrossCompare(), and ghidra::TypeOp::propagateFromPointer().

◆ getPtrToFromParent()

Datatype * ghidra::TypePointerRel::getPtrToFromParent ( Datatype base,
int4  off,
TypeFactory typegrp 
)
static

Given a containing data-type and offset, find the "pointed to" data-type suitable for a TypePointerRel.

The biggest contained data-type that starts at the exact offset is returned. If the offset is negative or the is no data-type starting exactly there, an xunknown1 data-type is returned.

Parameters
baseis the given container data-type
offis the offset relative to the start of the container
typegrpis the factory owning the data-types
Returns
the "pointed to" data-type

References ghidra::TypeFactory::getBase(), ghidra::Datatype::getSubType(), and ghidra::TYPE_UNKNOWN.

◆ getStripped()

virtual Datatype * ghidra::TypePointerRel::getStripped ( void  ) const
inlinevirtual

Get the plain form of the pointer.

Reimplemented from ghidra::Datatype.

References stripped.

◆ isPtrsubMatching()

bool ghidra::TypePointerRel::isPtrsubMatching ( int8  off,
int8  extra,
int8  multiplier 
) const
virtual

Is this data-type suitable as input to a CPUI_PTRSUB op.

A CPUI_PTRSUB must act on a pointer data-type where the given offset addresses a component. Perform this check.

Parameters
offis the given offset
extrais any additional constant being added to the pointer
multiplieris the size of any index multiplier being added to the pointer
Returns
true if this is a suitable PTRSUB data-type

Reimplemented from ghidra::TypePointer.

References ghidra::AddrSpace::addressToByteInt(), ghidra::Datatype::getSize(), ghidra::TypePointer::isPtrsubMatching(), offset, stripped, and ghidra::TypePointer::wordsize.

◆ markEphemeral()

void ghidra::TypePointerRel::markEphemeral ( TypeFactory typegrp)
inlineprotected

Mark this as an ephemeral data-type, to be replaced in the final output.

A base data-type is cached, which is a stripped version of the relative pointer, leaving just a plain TypePointer object with the same underlying ptrto. The base data-type replaces this relative pointer for formal variable declarations in source code output. This TypePointerRel is not considered a formal data-type but is only used to provide extra context for the pointer during propagation.

Parameters
typegrpis the factory from which to fetch the base pointer

References ghidra::Datatype::flags, ghidra::Datatype::getMetatype(), ghidra::TypeFactory::getTypePointer(), ghidra::Datatype::has_stripped, ghidra::TypePointer::ptrto, ghidra::Datatype::size, stripped, ghidra::SUB_PTRREL_UNK, ghidra::Datatype::submeta, ghidra::TYPE_UNKNOWN, and ghidra::TypePointer::wordsize.

Referenced by decode(), and ghidra::TypeFactory::getTypePointerRel().

◆ printRaw()

void ghidra::TypePointerRel::printRaw ( ostream &  s) const
virtual

Print a description of the type to stream.

Print a raw description of the type to stream. Intended for debugging. Not intended to produce parsable C.

Parameters
sis the output stream

Reimplemented from ghidra::TypePointer.

References offset, parent, ghidra::Datatype::printRaw(), and ghidra::TypePointer::ptrto.


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