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

Special Datatype object used to describe pointers that index into the symbol table. More...

#include <type.hh>

Inheritance diagram for ghidra::TypeSpacebase:
ghidra::Datatype

Public Member Functions

 TypeSpacebase (const TypeSpacebase &op)
 Construct from another TypeSpacebase.
 
 TypeSpacebase (Architecture *g)
 Constructor for use with decode.
 
 TypeSpacebase (AddrSpace *id, uint8 scope, Architecture *g)
 Construct given an address space, scope, and architecture.
 
Scope * getMap (void) const
 Get the symbol table indexed by this. More...
 
Address getAddress (uintb off, int4 sz, const Address &point) const
 Construct an Address given an offset. More...
 
virtual Datatype * getSubType (int8 off, int8 *newoff) const
 Recover component data-type one-level down. More...
 
virtual bool nearestArrayedComponentForward (int8 off, Nearest &res) const
 
virtual bool nearestArrayedComponentBackward (int8 off, Nearest &res) const
 
virtual int4 compare (const Datatype &op, int4 level) const
 Order types for propagation. More...
 
virtual int4 compareDependency (const Datatype &op) const
 Compare for storage in tree structure. More...
 
virtual bool isOffsetValid (int8 off, int8 extra, int8 multiplier) const
 Is a given offset into this valid, given sub-offset info. More...
 
virtual Datatype * clone (void) const
 Clone the data-type. More...
 
virtual void encode (Encoder &encoder) const
 Encode the data-type to a stream. More...
 
- 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)
 Constructor. More...
 
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. More...
 
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.
 
bool hasBitfields (void) const
 Return true if this contains/overlaps bitfields.
 
uint4 inheritForPointer (void) const
 Get properties pointers inherit.
 
uint4 inheritForPartial (void) const
 Get properties partial data-types inherit.
 
uint4 getDisplayFormat (void) const
 Get the display format for constants with this data-type. More...
 
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. More...
 
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.
 
Datatype * getTypedef (void) const
 Get the data-type immediately typedefed by this (or null)
 
virtual void printRaw (ostream &s) const
 Print a description of the type to stream. More...
 
virtual const TypeField * findTruncation (int8 off, int4 sz, const PcodeOp *op, int4 slot, int8 &newoff) const
 Find an immediate subfield of this data-type. More...
 
virtual Datatype * getSubType (int8 off, int8 *newoff) const
 Recover component data-type one-level down. More...
 
virtual bool nearestArrayedComponentForward (int8 off, Nearest &res) const
 
virtual bool nearestArrayedComponentBackward (int8 off, Nearest &res) const
 
virtual int4 getHoleSize (int4 off) const
 Get number of bytes at the given offset that are padding. More...
 
virtual int4 numDepend (void) const
 Get the number of component sub-types making up this data-type. More...
 
virtual Datatype * getDepend (int4 index) const
 Get a specific component sub-type by index. More...
 
virtual Datatype * getPtrInto (int4 &off) const
 If this is a pointer, return the large data-type this points into. More...
 
virtual void printNameBase (ostream &s) const
 Print (part of) the name of this data-type as short prefix for a label. More...
 
virtual int4 compare (const Datatype &op, int4 level) const
 Order types for propagation. More...
 
virtual int4 compareDependency (const Datatype &op) const
 Compare for storage in tree structure. More...
 
virtual void encode (Encoder &encoder) const
 Encode the data-type to a stream. More...
 
virtual bool isPtrsubMatching (int8 off, int8 extra, int8 multiplier) const
 Is this data-type suitable as input to a CPUI_PTRSUB op. More...
 
virtual bool isOffsetValid (int8 off, int8 extra, int8 multiplier) const
 Is a given offset into this valid, given sub-offset info. More...
 
virtual Datatype * getStripped (void) const
 Get a stripped version of this for formal use in formal declarations. More...
 
virtual Datatype * resolveInFlow (PcodeOp *op, int4 slot)
 Tailor data-type propagation based on Varnode use. More...
 
virtual Datatype * findResolve (const PcodeOp *op, int4 slot)
 Find a previously resolved sub-type. More...
 
virtual int4 findCompatibleResolve (Datatype *ct) const
 Find a resolution compatible with the given data-type. More...
 
virtual const TypeField * resolveTruncation (int8 offset, PcodeOp *op, int4 slot, int8 &newoff)
 Resolve which union field is being used for a given PcodeOp when a truncation is involved. More...
 
virtual Datatype * getPartialBase (void) const
 If this is a partial data-type, return the whole data-type. More...
 
int4 typeOrder (const Datatype &op) const
 Order this with -op- datatype.
 
int4 typeOrderFormal (const Datatype &op) const
 Order this with op for selecting a formal high-level data-type. More...
 
void encodeRef (Encoder &encoder) const
 Encode a reference of this to a stream. More...
 
bool isPieceStructured (void) const
 Does this data-type consist of separate pieces? More...
 
bool isPrimitiveWhole (void) const
 Is this made up of a single primitive. More...
 
bool nearestArrayedComponent (int8 off, uint4 arrayHint, int8 *newoff) const
 Find the array subcomponent nearest to the given offset. More...
 
bool testForArraySlack (int8 off)
 Test if an out-of-bounds offset makes sense as array slack. More...
 
Datatype * findSmallestContainer (int8 off, int8 sz, int8 *newoff)
 Find the smallest component containing the given range. More...
 

Private Member Functions

void decode (Decoder &decoder, TypeFactory &typegrp)
 Restore this spacebase data-type from a stream. More...
 

Private Attributes

AddrSpace * spaceid
 The address space we are treating as a structure.
 
uint8 scopeId
 Id of the Scope this data-type is associated with.
 
Architecture * glb
 Architecture for accessing symbol table.
 

Static Private Attributes

static constexpr int4 MAX_ARRAY_SLACK_FORWARD = 128
 Maximum bytes to search forward for an array.
 
static constexpr int4 MAX_ARRAY_SLACK_BACKWARD = 8
 Maximum bytes to search backward for an array.
 

Friends

class TypeFactory
 

Additional Inherited Members

- Static Public Member Functions inherited from ghidra::Datatype
static uint4 encodeIntegerFormat (const string &val)
 Encode the format attribute from an XML element. More...
 
static string decodeIntegerFormat (uint4 val)
 Decode the given format value into an XML attribute string. More...
 
- 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 ,
  has_bitfields = 0x40000
}
 Boolean properties of datatypes. More...
 
- Protected Member Functions inherited from ghidra::Datatype
void decodeBasic (Decoder &decoder)
 Recover basic data-type properties. More...
 
void encodeBasic (type_metatype meta, int4 align, Encoder &encoder) const
 Encode basic data-type properties. More...
 
void encodeTypedef (Encoder &encoder) const
 Encode this as a typedef element to a stream. More...
 
void markComplete (void)
 Mark this data-type as completely defined.
 
void setDisplayFormat (uint4 format)
 Set a specific display format. More...
 
virtual Datatype * clone (void) const =0
 Clone the data-type. More...
 
- Static Protected Member Functions inherited from ghidra::Datatype
static uint8 hashName (const string &nm)
 Produce a data-type id by hashing the type name. More...
 
static uint8 hashSize (uint8 id, int4 size)
 Reversibly hash size into id. More...
 
static int4 calcAlignSize (int4 sz, int4 align)
 Calculate aligned size, given size and alignment of data-type. More...
 
- 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 the meta-type, for comparisons.
 
Datatype * typedefImm
 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.
 
- Static Protected Attributes inherited from ghidra::Datatype
static sub_metatype base2sub [18]
 

Detailed Description

Special Datatype object used to describe pointers that index into the symbol table.

A TypeSpacebase treats a specific AddrSpace as "structure" that will get indexed in to. This facilitates type propagation from local symbols into the stack space and from global symbols into the RAM space.

Member Function Documentation

◆ clone()

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

Clone the data-type.

Implements ghidra::Datatype.

References TypeSpacebase().

◆ compare()

int4 ghidra::TypeSpacebase::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::Datatype.

References compareDependency().

◆ compareDependency()

int4 ghidra::TypeSpacebase::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::Datatype.

References ghidra::Datatype::compareDependency(), scopeId, and spaceid.

Referenced by compare().

◆ decode()

void ghidra::TypeSpacebase::decode ( Decoder &  decoder,
TypeFactory &  typegrp 
)
private

◆ encode()

void ghidra::TypeSpacebase::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::Datatype.

References ghidra::Encoder::closeElement(), ghidra::Address::encode(), ghidra::Datatype::encodeBasic(), ghidra::Datatype::encodeTypedef(), ghidra::Funcdata::getAddress(), ghidra::Scope::getFunction(), getMap(), ghidra::Scope::isGlobal(), ghidra::Datatype::metatype, ghidra::Encoder::openElement(), spaceid, ghidra::Datatype::typedefImm, and ghidra::Encoder::writeSpace().

◆ getAddress()

Address ghidra::TypeSpacebase::getAddress ( uintb  off,
int4  sz,
const Address &  point 
) const

Construct an Address given an offset.

Return the Address being referred to by a specific offset relative to a pointer with this Datatype

Parameters
offis the offset relative to the pointer
szis the size of offset (as a pointer)
pointis a "context" reference for the request
Returns
the referred to Address

References glb, ghidra::AddrSpaceManager::resolveConstant(), scopeId, and spaceid.

Referenced by ghidra::RulePtrsubCharConstant::applyOp(), ghidra::ActionInputPrototype::gatherParamSpacebaseRefs(), ghidra::Funcdata::linkSymbolReference(), ghidra::PrintC::opPtrsub(), and ghidra::ActionInferTypes::propagateSpacebaseRef().

◆ getMap()

Scope * ghidra::TypeSpacebase::getMap ( void  ) const

Get the symbol table indexed by this.

This data-type can index either a local or the global scope

Returns
the symbol table Scope

References glb, ghidra::Database::resolveScope(), scopeId, and ghidra::Architecture::symboltab.

Referenced by ghidra::RulePtrsubCharConstant::applyOp(), encode(), getSubType(), ghidra::Funcdata::linkSymbolReference(), nearestArrayedComponentBackward(), and nearestArrayedComponentForward().

◆ getSubType()

Datatype * ghidra::TypeSpacebase::getSubType ( int8  off,
int8 *  newoff 
) const
virtual

Recover component data-type one-level down.

Given an offset into this data-type, return the component data-type at that offset. Also, pass back a "renormalized" offset suitable for recursize getSubType() calls: i.e. if the original offset hits the exact start of the sub-type, 0 is passed back. If there is no valid component data-type at the offset, return NULL and pass back the original offset

Parameters
offis the offset into this data-type
newoffis a pointer to the passed-back offset
Returns
a pointer to the component data-type or NULL

Reimplemented from ghidra::Datatype.

References ghidra::AddrSpace::byteToAddress(), ghidra::MapEntry::getAddr(), ghidra::TypeFactory::getBase(), getMap(), ghidra::Address::getOffset(), ghidra::SymbolEntry::getOffset(), ghidra::SymbolEntry::getSymbol(), ghidra::Symbol::getType(), ghidra::AddrSpace::getWordSize(), glb, ghidra::Scope::inScope(), ghidra::Scope::queryContainer(), ghidra::AddrSpaceManager::resolveConstant(), spaceid, ghidra::TYPE_UNKNOWN, and ghidra::Architecture::types.

Referenced by isOffsetValid().

◆ isOffsetValid()

bool ghidra::TypeSpacebase::isOffsetValid ( int8  off,
int8  extra,
int8  multiplier 
) const
virtual

Is a given offset into this valid, given sub-offset info.

A companion to isPtrsubMatching().

Parameters
offis the given byte offset into this
extrais a sub-offset into the component reached by the main offset
multiplieris the size of any index multiplier to reach into the component
Returns
true if the offset is considered valid

Reimplemented from ghidra::Datatype.

References ghidra::Datatype::getMetatype(), ghidra::Datatype::getSize(), getSubType(), ghidra::Datatype::testForArraySlack(), and ghidra::TYPE_CODE.

◆ nearestArrayedComponentBackward()

bool ghidra::TypeSpacebase::nearestArrayedComponentBackward ( int8  off,
Nearest &  res 
) const
virtual

◆ nearestArrayedComponentForward()

bool ghidra::TypeSpacebase::nearestArrayedComponentForward ( int8  off,
Nearest &  res 
) const
virtual

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