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.