decompiler
1.0.0
|
A collection of overlapping Datatype objects: A union of component fields. More...
#include <type.hh>
Public Member Functions | |
TypeUnion (const TypeUnion &op) | |
Construct from another TypeUnion. | |
TypeUnion (void) | |
Construct incomplete TypeUnion. | |
const TypeField * | getField (int4 i) const |
Get the i-th field of the union. | |
virtual const TypeField * | findTruncation (int8 offset, int4 sz, const PcodeOp *op, int4 slot, int8 &newoff) const |
virtual int4 | numDepend (void) const |
Return number of component sub-types. | |
virtual Datatype * | getDepend (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 Datatype * | clone (void) const |
Clone the data-type. | |
virtual void | encode (Encoder &encoder) const |
Encode the data-type to a stream. 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... | |
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. | |
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 Datatype * | getSubType (int8 off, int8 *newoff) const |
Recover component data-type one-level down. More... | |
virtual Datatype * | nearestArrayedComponentForward (int8 off, int8 *newoff, int8 *elSize) const |
virtual Datatype * | nearestArrayedComponentBackward (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 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 Datatype * | getStripped (void) const |
Get a stripped version of this for formal use in formal declarations. 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... | |
Protected Member Functions | |
void | setFields (const vector< TypeField > &fd) |
Establish fields for this. 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< TypeField > | field |
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. | |
Datatype * | typedefImm |
The immediate data-type being typedefed by this. | |
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 } |
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] |
A collection of overlapping Datatype objects: A union of component fields.
The individual components have field names, as with a structure, but for a union, the components all share the same memory.
|
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.
op | is the data-type to compare with this |
level | is maximum level to descend when recursively comparing |
Reimplemented from ghidra::Datatype.
References ghidra::Datatype::compare(), field, and ghidra::Datatype::getId().
Referenced by ghidra::TypePartialUnion::compare().
|
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.
op | is the data-type to compare with this |
Reimplemented from ghidra::Datatype.
References ghidra::Datatype::compareDependency(), and field.
|
protected |
Restore fields from a stream.
Parse children of the <type> element describing each field.
decoder | is the stream decoder |
typegrp | is the factory owning the new union |
References ghidra::TypeStruct::field, ghidra::Datatype::flags, ghidra::Datatype::markComplete(), ghidra::Datatype::name, ghidra::Decoder::peekElement(), ghidra::Datatype::size, and ghidra::Datatype::type_incomplete.
Referenced by ghidra::TypeFactory::decodeUnion().
|
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.
encoder | is 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.
|
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.
ct | is the given data-type |
Reimplemented from ghidra::Datatype.
References field, ghidra::Datatype::findCompatibleResolve(), ghidra::Datatype::getSize(), and ghidra::Datatype::needsResolution().
Referenced by ghidra::TypePartialUnion::findCompatibleResolve().
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.
op | is the PcodeOp using the Varnode assigned with this data-type |
slot | is the slot reading or writing the Varnode |
Reimplemented from ghidra::Datatype.
References ghidra::ResolvedUnion::getDatatype(), ghidra::BlockBasic::getFuncdata(), ghidra::PcodeOp::getParent(), and ghidra::Funcdata::getUnionField().
|
virtual |
offset | is the byte offset of the truncation |
sz | is the number of bytes in the resulting truncation |
op | is the PcodeOp reading the truncated value |
slot | is the input slot being read |
newoff | is used to pass back any remaining offset into the field which still must be resolved |
Reimplemented from ghidra::Datatype.
References field, getField(), ghidra::ResolvedUnion::getFieldNum(), ghidra::BlockBasic::getFuncdata(), ghidra::PcodeOp::getParent(), ghidra::Datatype::getSize(), ghidra::Funcdata::getUnionField(), ghidra::TypeField::offset, and ghidra::TypeField::type.
Referenced by ghidra::TypePartialUnion::findTruncation().
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.
op | is the specific PcodeOp |
slot | indicates the input operand, or the output |
Reimplemented from ghidra::Datatype.
References ghidra::Funcdata::getArch(), ghidra::ResolvedUnion::getDatatype(), ghidra::BlockBasic::getFuncdata(), ghidra::PcodeOp::getParent(), ghidra::Funcdata::getUnionField(), ghidra::Funcdata::setUnionField(), and ghidra::Architecture::types.
|
virtual |
Resolve which union field is being used for a given PcodeOp when a truncation is involved.
This method applies to the TYPE_UNION and TYPE_PARTIALUNION data-types, when a Varnode is backed by a larger Symbol with a union data-type, or if the Varnode is produced by a CPUI_SUBPIECE where the input Varnode has a union data-type. Scoring is done to compute the best field and the result is cached with the function. The record of the best field is returned or null if there is no appropriate field
offset | is the byte offset into the union we are truncating to |
op | is either the PcodeOp reading the truncated Varnode or the CPUI_SUBPIECE doing the truncation |
slot | is either the input slot of the reading PcodeOp or the artificial SUBPIECE slot: 1 |
newoff | is used to pass back how much offset is left to resolve |
Reimplemented from ghidra::Datatype.
References ghidra::PcodeOp::code(), ghidra::CPUI_SUBPIECE, field, ghidra::Funcdata::getArch(), getField(), ghidra::ResolvedUnion::getFieldNum(), ghidra::BlockBasic::getFuncdata(), ghidra::PcodeOp::getParent(), ghidra::Funcdata::getUnionField(), ghidra::TypeField::offset, ghidra::Funcdata::setUnionField(), and ghidra::Architecture::types.
Referenced by ghidra::TypePartialUnion::resolveTruncation().
|
protected |
Establish fields for this.
Copy a list of fields into this union, establishing its size. Should only be called once when constructing the type. TypeField offset is assumed to be 0.
fd | is the list of fields to copy in |
References ghidra::TypeStruct::field.
Referenced by ghidra::TypeFactory::setFields(), and TypeUnion().