|
Ghidra Decompiler Analysis Engine
|
Container class for all Datatype objects in an Architecture. More...
#include <type.hh>


Public Member Functions | |
| TypeFactory (Architecture *g) | |
| Construct a factory. More... | |
| void | setupSizes (void) |
| Derive some size information from Architecture. More... | |
| void | clear (void) |
| Clear out all types. More... | |
| void | clearNoncore (void) |
| Clear out non-core types. More... | |
| virtual | ~TypeFactory (void) |
| Destructor. | |
| Datatype * | findByName (const string &n) |
| Return type of given name. More... | |
| Datatype * | setName (Datatype *ct, const string &n) |
| Set the given types name. More... | |
| bool | setFields (vector< TypeField > &fd, TypeStruct *ot, int4 fixedsize, uint4 flags) |
| Set fields on a TypeStruct. More... | |
| bool | setEnumValues (const vector< string > &namelist, const vector< uintb > &vallist, const vector< bool > &assignlist, TypeEnum *te) |
| Set named values for an enumeration. More... | |
| Datatype * | restoreXmlType (const Element *el) |
| Restore Datatype from XML. More... | |
| Datatype * | restoreXmlTypeWithCodeFlags (const Element *el, bool isConstructor, bool isDestructor) |
| Restore data-type from XML with extra "code" flags. More... | |
| TypeVoid * | getTypeVoid (void) |
| Get the "void" data-type. More... | |
| Datatype * | getBaseNoChar (int4 s, type_metatype m) |
| Get atomic type excluding "char". More... | |
| Datatype * | getBase (int4 s, type_metatype m) |
| Get atomic type. More... | |
| Datatype * | getBase (int4 s, type_metatype m, const string &n) |
| Get named atomic type. More... | |
| TypeCode * | getTypeCode (void) |
| Get an "anonymous" function data-type. More... | |
| TypePointer * | getTypePointerStripArray (int4 s, Datatype *pt, uint4 ws) |
| Construct a pointer data-type, stripping an ARRAY level. More... | |
| TypePointer * | getTypePointer (int4 s, Datatype *pt, uint4 ws) |
| Construct an absolute pointer data-type. More... | |
| TypePointer * | getTypePointerNoDepth (int4 s, Datatype *pt, uint4 ws) |
| Construct a depth limited pointer data-type. More... | |
| TypeArray * | getTypeArray (int4 as, Datatype *ao) |
| Construct an array data-type. More... | |
| TypeStruct * | getTypeStruct (const string &n) |
| Create an (empty) structure. More... | |
| TypeEnum * | getTypeEnum (const string &n) |
| Create an (empty) enumeration. More... | |
| TypeSpacebase * | getTypeSpacebase (AddrSpace *id, const Address &addr) |
| Create a "spacebase" type. More... | |
| TypeCode * | getTypeCode (ProtoModel *model, Datatype *outtype, const vector< Datatype * > &intypes, bool dotdotdot) |
| Create a "function" datatype. More... | |
| void | destroyType (Datatype *ct) |
| Remove a data-type from this. More... | |
| Datatype * | downChain (Datatype *ptrtype, uintb &off) |
| Find a sub-type matching a pointer and offset. More... | |
| Datatype * | concretize (Datatype *ct) |
| Convert given data-type to concrete form. More... | |
| void | dependentOrder (vector< Datatype * > &deporder) const |
| Place all data-types in dependency order. More... | |
| void | saveXml (ostream &s) const |
| Save this container to stream. More... | |
| void | saveXmlCoreTypes (ostream &s) const |
| Save core types to stream. More... | |
| void | restoreXml (const Element *el) |
| Restore this container from a stream. More... | |
| void | restoreXmlCoreTypes (const Element *el) |
| Initialize basic type names. More... | |
| void | parseDataOrganization (const Element *el) |
| Parse the <data_organization> tag. More... | |
| void | parseEnumConfig (const Element *el) |
| Parse the <enum> tag. More... | |
| void | setCoreType (const string &name, int4 size, type_metatype meta, bool chartp) |
| Create a core data-type. More... | |
| void | cacheCoreTypes (void) |
| Cache common types. More... | |
Protected Member Functions | |
| Datatype * | findByIdLocal (const string &nm, uint8 id) const |
| Search locally by name and id. More... | |
| virtual Datatype * | findById (const string &n, uint8 id) |
| Search by name and id. More... | |
Protected Attributes | |
| Architecture * | glb |
| The Architecture object that owns this TypeFactory. | |
Container class for all Datatype objects in an Architecture.
| TypeFactory::TypeFactory | ( | Architecture * | g | ) |
| void TypeFactory::cacheCoreTypes | ( | void | ) |
Cache common types.
Run through the list of "core" data-types and cache the most commonly accessed ones for quick access (avoiding the tree lookup). The "core" data-types must have been previously initialized.
| void TypeFactory::clear | ( | void | ) |
Clear out all types.
Remove all Datatype objects owned by this TypeFactory.
| void TypeFactory::clearNoncore | ( | void | ) |
Clear out non-core types.
Delete anything that isn't a core type.
Convert given data-type to concrete form.
The data-type propagation system can push around data-types that are partial or are otherwise unrepresentable in the source language. This method substitutes those data-types with a concrete data-type that is representable, or returns the same data-type if is already concrete. Its important that the returned data-type have the same size as the original data-type regardless.
| ct | is the given data-type |
| void TypeFactory::dependentOrder | ( | vector< Datatype * > & | deporder | ) | const |
Place all data-types in dependency order.
Place data-types in an order such that if the definition of data-type "a" depends on the definition of data-type "b", then "b" occurs earlier in the order
| deporder | will hold the generated dependency list of data-types |
| void TypeFactory::destroyType | ( | Datatype * | ct | ) |
Remove a data-type from this.
The indicated Datatype object is removed from this container. Indirect references (via TypeArray TypeStruct etc.) are not affected
| ct | is the data-type to destroy |
Find a sub-type matching a pointer and offset.
Add a constant offset to a pointer with known data-type. 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
| ptrtype | is the pointer data-type being added to |
| off | is a reference to the offset to add |
|
protectedvirtual |
Search by name and id.
Search for a Datatype by name and/or id. Derived classes may search outside this container.
| n | is the name of the data-type |
| id | is the type id of the data-type |
Reimplemented in TypeFactoryGhidra.
|
protected |
| Datatype * TypeFactory::findByName | ( | const string & | n | ) |
Return type of given name.
Find type with given name. If there are more than, return first.
| n | is the name to search for |
| Datatype * TypeFactory::getBase | ( | int4 | s, |
| type_metatype | m | ||
| ) |
Get atomic type.
Get one of the "base" datatypes. This routine is called a lot, so we go through a cache first.
| s | is the desired size |
| m | is the desired meta-type |
| Datatype * TypeFactory::getBase | ( | int4 | s, |
| type_metatype | m, | ||
| const string & | n | ||
| ) |
Get named atomic type.
Get or create a "base" type with a specified name and properties
| s | is the desired size |
| m | is the desired meta-type |
| n | is the desired name |
| Datatype * TypeFactory::getBaseNoChar | ( | int4 | s, |
| type_metatype | m | ||
| ) |
Construct an array data-type.
| as | is the number of elements in the desired array |
| ao | is the data-type of the array element |
| TypeCode * TypeFactory::getTypeCode | ( | ProtoModel * | model, |
| Datatype * | outtype, | ||
| const vector< Datatype * > & | intypes, | ||
| bool | dotdotdot | ||
| ) |
Create a "function" datatype.
Creates a TypeCode object and associates a specific function prototype with it.
| model | is the prototype model associated with the function |
| outtype | is the return type of the function |
| intypes | is the array of input parameters of the function |
| dotdotdot | is true if the function takes variable arguments |
| TypeCode * TypeFactory::getTypeCode | ( | void | ) |
| TypeEnum * TypeFactory::getTypeEnum | ( | const string & | n | ) |
Create an (empty) enumeration.
The created enumeration will have no named values and a default configuration Named values must be added later.
| n | is the name of the enumeration |
| TypePointer * TypeFactory::getTypePointer | ( | int4 | s, |
| Datatype * | pt, | ||
| uint4 | ws | ||
| ) |
Construct an absolute pointer data-type.
Allows "pointer to array" to be constructed
| s | is the size of the pointer |
| pt | is the pointed-to data-type |
| ws | is the wordsize associated with the pointer |
| TypePointer * TypeFactory::getTypePointerNoDepth | ( | int4 | s, |
| Datatype * | pt, | ||
| uint4 | ws | ||
| ) |
Construct a depth limited pointer data-type.
| s | is the size of the pointer |
| pt | is the pointed-to data-type |
| ws | is the wordsize associated with the pointer |
| TypePointer * TypeFactory::getTypePointerStripArray | ( | int4 | s, |
| Datatype * | pt, | ||
| uint4 | ws | ||
| ) |
Construct a pointer data-type, stripping an ARRAY level.
This creates a pointer to a given data-type. If the given data-type is an array, the TYPE_ARRAY property is stripped off, and a pointer to the array element data-type is returned.
| s | is the size of the pointer |
| pt | is the pointed-to data-type |
| ws | is the wordsize associated with the pointer |
| TypeSpacebase * TypeFactory::getTypeSpacebase | ( | AddrSpace * | id, |
| const Address & | addr | ||
| ) |
Create a "spacebase" type.
Creates the special TypeSpacebase with an associated address space and scope
| id | is the address space |
| addr | specifies the function scope, or isInvalid() for global scope |
| TypeStruct * TypeFactory::getTypeStruct | ( | const string & | n | ) |
Create an (empty) structure.
The created structure will have no fields. They must be added later.
| n | is the name of the structure |
| TypeVoid * TypeFactory::getTypeVoid | ( | void | ) |
Get the "void" data-type.
There should be exactly one instance of the "void" Datatype object, which this fetches
| void TypeFactory::parseDataOrganization | ( | const Element * | el | ) |
Parse the <data_organization> tag.
Recover various sizes relevant to this container, such as the default size of "int" and structure alignment, by parsing the <data_organization> tag.
| el | is the XML element |
| void TypeFactory::parseEnumConfig | ( | const Element * | el | ) |
Parse the <enum> tag.
Recover default enumeration properties (size and meta-type) from an <enum> XML tag. Should probably consider this deprecated. These values are only used by the internal C parser. param el is the XML element
| void TypeFactory::restoreXml | ( | const Element * | el | ) |
Restore this container from a stream.
Read data-types into this container from an XML stream
| el | is the root XML element |
| void TypeFactory::restoreXmlCoreTypes | ( | const Element * | el | ) |
Initialize basic type names.
Restore data-types from an XML stream into this container This stream is presumed to contain "core" datatypes and the cached matrix will be populated from this set.
| el | is the root XML element |
| Datatype * TypeFactory::restoreXmlTypeWithCodeFlags | ( | const Element * | el, |
| bool | isConstructor, | ||
| bool | isDestructor | ||
| ) |
Restore data-type from XML with extra "code" flags.
Kludge to get flags into code pointer types, when they can't come through XML
| el | is the XML element describing the Datatype |
| isConstructor | toggles "constructor" property on "function" datatypes |
| isDestructor | toggles "destructor" property on "function" datatypes |
| void TypeFactory::saveXml | ( | ostream & | s | ) | const |
Save this container to stream.
All data-types, in dependency order, are written out to an XML stream
| s | is the output stream |
| void TypeFactory::saveXmlCoreTypes | ( | ostream & | s | ) | const |
Save core types to stream.
Any data-type within this container marked as "core" will be written to an XML <coretypes> stream.
| s | is the output stream |
| void TypeFactory::setCoreType | ( | const string & | name, |
| int4 | size, | ||
| type_metatype | meta, | ||
| bool | chartp | ||
| ) |
Create a core data-type.
Manually create a "base" core type. This currently must be called before any pointers or arrays are defined off of the type.
| name | is the data-type name |
| size | is the size of the data-type |
| meta | is the meta-type of the data-type |
| chartp | is true if a character type should be created |
| bool TypeFactory::setEnumValues | ( | const vector< string > & | namelist, |
| const vector< uintb > & | vallist, | ||
| const vector< bool > & | assignlist, | ||
| TypeEnum * | te | ||
| ) |
Set named values for an enumeration.
Set the list of enumeration values and identifiers for a TypeEnum Fill in any values for any names that weren't explicitly assigned and check for duplicates.
| namelist | is the list of names in the enumeration |
| vallist | is the corresponding list of values assigned to names in namelist |
| assignlist | is true if the corresponding name in namelist has an assigned value |
| te | is the enumeration object to modify |
| bool TypeFactory::setFields | ( | vector< TypeField > & | fd, |
| TypeStruct * | ot, | ||
| int4 | fixedsize, | ||
| uint4 | flags | ||
| ) |
Set fields on a TypeStruct.
Make sure all the offsets are fully established then set fields of the structure If -fixedsize- is greater than 0, force the final structure to have that size
| fd | is the list of fields to set |
| ot | is the TypeStruct object to modify |
| fixedsize | is 0 or the forced size of the structure |
| flags | are other flags to set on the structure |
| void TypeFactory::setupSizes | ( | void | ) |
Derive some size information from Architecture.
Set up default values for size of "int", structure alignment, and enums.
1.8.17