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

A composite Datatype object: A structure with component fields. More...

#include <type.hh>

Inheritance diagram for ghidra::TypeStruct:
ghidra::Datatype

Public Member Functions

 TypeStruct (const TypeStruct &op)
 Construct from another TypeStruct.
 
 TypeStruct (void)
 Construct incomplete/empty TypeStruct.
 
vector< TypeField >::const_iterator beginField (void) const
 Beginning of fields.
 
vector< TypeField >::const_iterator endField (void) const
 End of fields.
 
virtual const TypeFieldfindTruncation (int8 off, int4 sz, const PcodeOp *op, int4 slot, int8 &newoff) const
 Find an immediate subfield of this data-type. More...
 
virtual DatatypegetSubType (int8 off, int8 *newoff) const
 Recover component data-type one-level down. More...
 
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 numDepend (void) const
 Return number of component sub-types.
 
virtual DatatypegetDepend (int4 index) const
 Return the i-th component sub-type.
 
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 Datatypeclone (void) const
 Clone the data-type.
 
virtual void encode (Encoder &encoder) const
 Encode the data-type to a stream. More...
 
virtual DatatyperesolveInFlow (PcodeOp *op, int4 slot)
 Tailor data-type propagation based on Varnode use. More...
 
virtual DatatypefindResolve (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...
 
- 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, 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 isPowerOfTwo (void) const
 Is this a flag-based enumeration.
 
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 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.
 
uint4 getInheritable (void) const
 Get properties pointers 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.
 
int4 getSize (void) const
 Get the type size.
 
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 void printRaw (ostream &s) const
 Print a description of the type to stream. More...
 
virtual void printNameBase (ostream &s) const
 Print name as short prefix.
 
virtual bool isPtrsubMatching (uintb off) const
 Is this data-type suitable as input to a CPUI_PTRSUB op. More...
 
virtual DatatypegetStripped (void) const
 Get a stripped version of this for formal use in formal declarations. More...
 
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. More...
 
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. 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...
 

Static Public Member Functions

static void assignFieldOffsets (vector< TypeField > &list, int4 align)
 Assign field offsets given a byte alignment. More...
 
static int4 scoreSingleComponent (Datatype *parent, PcodeOp *op, int4 slot)
 Determine best type fit for given PcodeOp use. More...
 
- 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 Member Functions

void setFields (const vector< TypeField > &fd)
 Establish fields for this. More...
 
int4 getFieldIter (int4 off) const
 Get index into field list. More...
 
int4 getLowerBoundField (int4 off) const
 Get index of last field before or equal to given offset. More...
 
void decodeFields (Decoder &decoder, TypeFactory &typegrp)
 Restore fields from a stream. More...
 
- Protected Member Functions inherited from ghidra::Datatype
void decodeBasic (Decoder &decoder)
 Recover basic data-type properties. More...
 
void encodeBasic (type_metatype meta, 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...
 

Protected Attributes

vector< TypeFieldfield
 The list of fields.
 
- 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.
 

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
}
 Boolean properties of datatypes. 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 Protected Attributes inherited from ghidra::Datatype
static sub_metatype base2sub [15]
 

Detailed Description

A composite Datatype object: A structure with component fields.

Member Function Documentation

◆ assignFieldOffsets()

void ghidra::TypeStruct::assignFieldOffsets ( vector< TypeField > &  list,
int4  align 
)
static

Assign field offsets given a byte alignment.

Assign an offset to fields in order so that each field starts at an aligned offset within the structure

Parameters
listis the list of fields
alignis the given alignment

◆ compare()

int4 ghidra::TypeStruct::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 ghidra::Datatype::compare(), field, and ghidra::Datatype::getId().

◆ compareDependency()

int4 ghidra::TypeStruct::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(), and field.

◆ decodeFields()

void ghidra::TypeStruct::decodeFields ( Decoder decoder,
TypeFactory typegrp 
)
protected

Restore fields from a stream.

Children of the structure element describe each field.

Parameters
decoderis the stream decoder
typegrpis the factory owning the new structure

References field, ghidra::Datatype::flags, ghidra::Datatype::markComplete(), ghidra::Datatype::name, ghidra::Datatype::needs_resolution, ghidra::Decoder::peekElement(), ghidra::Datatype::size, and ghidra::Datatype::type_incomplete.

Referenced by ghidra::TypeFactory::decodeStruct().

◆ encode()

void ghidra::TypeStruct::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::Datatype::encodeBasic(), ghidra::Datatype::encodeTypedef(), field, ghidra::Encoder::openElement(), and ghidra::Datatype::typedefImm.

◆ findCompatibleResolve()

int4 ghidra::TypeStruct::findCompatibleResolve ( Datatype ct) const
virtual

Find a resolution compatible with the given data-type.

If this data-type has an alternate data-type form that matches the given data-type, return an index indicating this form, otherwise return -1.

Parameters
ctis the given data-type
Returns
the index of the matching form or -1

Reimplemented from ghidra::Datatype.

References field, ghidra::Datatype::findCompatibleResolve(), and ghidra::Datatype::needsResolution().

◆ findResolve()

Datatype * ghidra::TypeStruct::findResolve ( const PcodeOp op,
int4  slot 
)
virtual

Find a previously resolved sub-type.

This is the constant version of resolveInFlow. If a resulting subtype has already been calculated, for the particular read (slot >= 0) or write (slot == -1), then return it. Otherwise return the original data-type.

Parameters
opis the PcodeOp using the Varnode assigned with this data-type
slotis the slot reading or writing the Varnode
Returns
the resolved subtype or the original data-type

Reimplemented from ghidra::Datatype.

References field, ghidra::ResolvedUnion::getDatatype(), ghidra::BlockBasic::getFuncdata(), ghidra::PcodeOp::getParent(), and ghidra::Funcdata::getUnionField().

◆ findTruncation()

const TypeField * ghidra::TypeStruct::findTruncation ( int8  off,
int4  sz,
const PcodeOp op,
int4  slot,
int8 &  newoff 
) const
virtual

Find an immediate subfield of this data-type.

Given a byte range within this data-type, determine the field it is contained in and pass back the renormalized offset. This method applies to TYPE_STRUCT, TYPE_UNION, and TYPE_PARTIALUNION, data-types that have field components. For TYPE_UNION and TYPE_PARTIALUNION, the field may depend on the p-code op extracting or writing the value.

Parameters
offis the byte offset into this
szis the size of the byte range
opis the PcodeOp reading/writing the data-type
slotis the index of the Varnode being accessed, -1 for the output, >=0 for an input
newoffpoints to the renormalized offset to pass back
Returns
the containing field or NULL if the range is not contained

Reimplemented from ghidra::Datatype.

References field, getFieldIter(), ghidra::Datatype::getSize(), ghidra::TypeField::offset, and ghidra::TypeField::type.

◆ getFieldIter()

int4 ghidra::TypeStruct::getFieldIter ( int4  off) const
protected

Get index into field list.

Find the proper subfield given an offset. Return the index of that field or -1 if the offset is not inside a field.

Parameters
offis the offset into the structure
Returns
the index into the field list or -1

References field, ghidra::Datatype::getSize(), ghidra::TypeField::offset, and ghidra::TypeField::type.

Referenced by findTruncation(), and getSubType().

◆ getLowerBoundField()

int4 ghidra::TypeStruct::getLowerBoundField ( int4  off) const
protected

Get index of last field before or equal to given offset.

The field returned may or may not contain the offset. If there are no fields that occur earlier than the offset, return -1.

Parameters
offis the given offset
Returns
the index of the nearest field or -1

References field.

Referenced by getHoleSize(), nearestArrayedComponentBackward(), and nearestArrayedComponentForward().

◆ getSubType()

Datatype * ghidra::TypeStruct::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 field, getFieldIter(), ghidra::Datatype::getSubType(), ghidra::TypeField::offset, and ghidra::TypeField::type.

◆ nearestArrayedComponentBackward()

Datatype * ghidra::TypeStruct::nearestArrayedComponentBackward ( int8  off,
int8 *  newoff,
int8 *  elSize 
) const
virtual

Find the first component data-type before the given offset that is (or contains) an array, and pass back the difference between the component's start and the given offset. Return the component data-type or null if no array is found.

Parameters
offis the given offset into this data-type
newoffis used to pass back the offset difference
elSizeis used to pass back the array element size
Returns
the component data-type or null

Reimplemented from ghidra::Datatype.

References field, getLowerBoundField(), ghidra::Datatype::getMetatype(), ghidra::Datatype::getSize(), ghidra::Datatype::nearestArrayedComponentBackward(), ghidra::TypeField::offset, ghidra::TypeField::type, and ghidra::TYPE_ARRAY.

◆ nearestArrayedComponentForward()

Datatype * ghidra::TypeStruct::nearestArrayedComponentForward ( int8  off,
int8 *  newoff,
int8 *  elSize 
) const
virtual

Find the first component data-type after the given offset that is (or contains) an array, and pass back the difference between the component's start and the given offset. Return the component data-type or null if no array is found.

Parameters
offis the given offset into this data-type
newoffis used to pass back the offset difference
elSizeis used to pass back the array element size
Returns
the component data-type or null

Reimplemented from ghidra::Datatype.

References field, getLowerBoundField(), ghidra::Datatype::getMetatype(), ghidra::Datatype::getSize(), ghidra::Datatype::nearestArrayedComponentForward(), ghidra::TypeField::offset, ghidra::TypeField::type, and ghidra::TYPE_ARRAY.

◆ resolveInFlow()

Datatype * ghidra::TypeStruct::resolveInFlow ( PcodeOp op,
int4  slot 
)
virtual

Tailor data-type propagation based on Varnode use.

For certain data-types, particularly union, variables of that data-type are transformed into a subtype depending on the particular use. Each read or write of the variable may use a different subtype. This method returns the particular subtype required based on a specific PcodeOp. A slot index >=0 indicates which operand reads the variable, or if the index is -1, the variable is written.

Parameters
opis the specific PcodeOp
slotindicates the input operand, or the output
Returns
the resolved sub-type

Reimplemented from ghidra::Datatype.

References ghidra::Funcdata::getArch(), ghidra::ResolvedUnion::getDatatype(), ghidra::BlockBasic::getFuncdata(), ghidra::PcodeOp::getParent(), ghidra::Funcdata::getUnionField(), scoreSingleComponent(), ghidra::Funcdata::setUnionField(), and ghidra::Architecture::types.

◆ scoreSingleComponent()

int4 ghidra::TypeStruct::scoreSingleComponent ( Datatype parent,
PcodeOp op,
int4  slot 
)
static

Determine best type fit for given PcodeOp use.

If this method is called, the given data-type has a single component that fills it entirely (either a field or an element). The indicated Varnode can be resolved either by naming the data-type or naming the component. This method returns an indication of the best fit: either 0 for the component or -1 for the data-type.

Parameters
parentis the given data-type with a single component
opis the given PcodeOp using the Varnode
slotis -1 if the Varnode is an output or >=0 indicating the input slot
Returns
either 0 to indicate the field or -1 to indicate the structure

References ghidra::PcodeOp::code(), ghidra::CPUI_COPY, ghidra::CPUI_INDIRECT, ghidra::CPUI_LOAD, ghidra::CPUI_STORE, ghidra::Funcdata::getCallSpecs(), ghidra::BlockBasic::getFuncdata(), ghidra::PcodeOp::getIn(), ghidra::Datatype::getMetatype(), ghidra::PcodeOp::getOut(), ghidra::FuncProto::getOutput(), ghidra::FuncProto::getParam(), ghidra::PcodeOp::getParent(), ghidra::Varnode::getType(), ghidra::ProtoParameter::getType(), ghidra::Varnode::getTypeReadFacing(), ghidra::PcodeOp::isCall(), ghidra::FuncProto::isInputLocked(), ghidra::Varnode::isTypeLock(), and ghidra::TYPE_PTR.

Referenced by ghidra::TypeArray::resolveInFlow(), and resolveInFlow().

◆ setFields()

void ghidra::TypeStruct::setFields ( const vector< TypeField > &  fd)
protected

Establish fields for this.

Copy a list of fields into this structure, establishing its size. Should only be called once when constructing the type

Parameters
fdis the list of fields to copy in

References field, ghidra::Datatype::flags, ghidra::Datatype::needs_resolution, and ghidra::Datatype::size.

Referenced by ghidra::TypeFactory::setFields(), and TypeStruct().


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