|
decompiler 1.0.0
|
The base datatype class for the decompiler. More...
#include <type.hh>
Public Member Functions | |
| 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. | |
| uint4 | getInheritable (void) const |
| Get properties pointers inherit. | |
| 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. | |
| 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 (uintb off, uintb *newoff) const |
| Recover component data-type one-level down. More... | |
| virtual Datatype * | nearestArrayedComponentForward (uintb off, uintb *newoff, int4 *elSize) const |
| virtual Datatype * | nearestArrayedComponentBackward (uintb off, uintb *newoff, int4 *elSize) const |
| virtual int4 | numDepend (void) const |
| Return number of component sub-types. More... | |
| virtual Datatype * | getDepend (int4 index) const |
| Return the i-th component sub-type. More... | |
| virtual void | printNameBase (ostream &s) const |
| Print name as short prefix. 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 | saveXml (ostream &s) const |
| Serialize the data-type to XML. More... | |
| 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 | saveXmlRef (ostream &s) const |
| Write an XML reference of this to stream. More... | |
Protected Types | |
| 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 } |
| Boolean properties of datatypes. More... | |
Protected Member Functions | |
| void | restoreXmlBasic (const Element *el) |
| Recover basic data-type properties. More... | |
| void | saveXmlBasic (type_metatype meta, ostream &s) const |
| Save basic data-type properties. More... | |
| void | saveXmlTypedef (ostream &s) const |
| Write this as a typedef tag to stream. More... | |
| void | markComplete (void) |
| Mark this data-type as completely defined. | |
| virtual Datatype * | clone (void) const =0 |
| Clone the data-type. More... | |
Static Protected Member Functions | |
| 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... | |
Protected Attributes | |
| int4 | size |
| Size (of variable holding a value of this type) | |
| string | name |
| Name of type. | |
| type_metatype | metatype |
| Meta-type - type disregarding size. | |
| sub_metatype | submeta |
| Sub-type of of the meta-type, for comparisons. | |
| uint4 | flags |
| Boolean properties of the type. | |
| uint8 | id |
| A unique id for the type (or 0 if an id is not assigned) | |
| Datatype * | typedefImm |
| The immediate data-type being typedefed by this. | |
Static Protected Attributes | |
| static sub_metatype | base2sub [13] |
Friends | |
| class | TypeFactory |
| struct | DatatypeCompare |
The base datatype class for the decompiler.
Used for symbols, function prototypes, type propagation etc.
|
protected |
Boolean properties of datatypes.
| Enumerator | |
|---|---|
| coretype | This is a basic type which will never be redefined. |
| chartype | ASCII character data. |
| enumtype | An enumeration type (as well as an integer) |
| poweroftwo | An enumeration type where all values are of 2^^n form. |
| utf16 | 16-bit wide chars in unicode UTF16 |
| utf32 | 32-bit wide chars in unicode UTF32 |
| opaque_string | Structure that should be treated as a string. |
| variable_length | May be other structures with same name different lengths. |
| has_stripped | Datatype has a stripped form for formal declarations. |
| is_ptrrel | Datatype is a TypePointerRel. |
| type_incomplete | Set if this (recursive) data-type has not been fully defined yet. |
|
protectedpure virtual |
Clone the data-type.
Implemented in TypeBase, TypeChar, TypeUnicode, TypeVoid, TypePointer, TypeArray, TypeEnum, TypeStruct, TypePointerRel, TypeCode, and TypeSpacebase.
Referenced by TypeFactory::findAdd(), and TypeFactory::getTypedef().
|
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 in TypePointer, TypeArray, TypeEnum, TypeStruct, TypeCode, and TypeSpacebase.
Referenced by TypePointer::compare(), TypeArray::compare(), TypeCode::compare(), typeOrder(), and typeOrderBool().
|
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 in TypePointer, TypeArray, TypeEnum, TypeStruct, TypePointerRel, TypeCode, and TypeSpacebase.
Referenced by TypeCode::compareDependency(), TypeSpacebase::compareDependency(), TypeFactory::findAdd(), DatatypeCompare::operator()(), TypeFactory::restoreCode(), and TypeFactory::restoreStruct().
|
inlinevirtual |
Return the i-th component sub-type.
Reimplemented in TypePointer, TypeArray, and TypeStruct.
Referenced by TypeFactory::orderRecurse().
|
virtual |
Get a stripped version of this for formal use in formal declarations.
Some data-types are ephemeral, and, in the final decompiler output, get replaced with a formal version that is a stripped down version of the original. This method returns this stripped down version, if it exists, or null otherwise. A non-null return should correspond with hasStripped returning true.
Reimplemented in TypePointerRel.
Referenced by TypeFactory::getTypePointer(), TypeFactory::getTypePointerStripArray(), and HighVariable::updateType().
|
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
| off | is the offset into this data-type |
| newoff | is a pointer to the passed-back offset |
Reimplemented in TypeArray, TypeStruct, TypeCode, and TypeSpacebase.
Referenced by RuleStructOffset0::applyOp(), TypePointerRel::getPtrToFromParent(), SymbolEntry::getSizedType(), AddTreeState::hasMatchingSubType(), TypePointer::isPtrsubMatching(), ActionInferTypes::propagateRef(), RangeHint::reconcile(), and Funcdata::syncVarnodesWithSymbols().
|
staticprotected |
Produce a data-type id by hashing the type name.
If a type id is explicitly provided for a data-type, this routine is used to produce an id based on a hash of the name. IDs produced this way will have their sign-bit set to distinguish it from other IDs.
| nm | is the type name to be hashed |
Referenced by TypeFactory::getBase(), TypeFactory::getTypeChar(), TypeFactory::getTypeCode(), TypeFactory::getTypedef(), TypeFactory::getTypeEnum(), TypeFactory::getTypePointer(), TypeFactory::getTypePointerRel(), TypeFactory::getTypeStruct(), TypeFactory::getTypeUnicode(), TypeFactory::getTypeVoid(), restoreXmlBasic(), TypeFactory::restoreXmlType(), and TypeFactory::setName().
|
staticprotected |
Reversibly hash size into id.
This allows IDs for variable length structures to be uniquefied based on size. A base ID is given and a size of the specific instance. A unique ID is returned. The hashing is reversible by feeding the output ID back into this function with the same size.
| id | is the given ID to (de)uniquify |
| size | is the instance size of the structure |
Referenced by TypeFactory::findById(), hasSameVariableBase(), TypeFactory::restoreTypedef(), restoreXmlBasic(), saveXmlBasic(), and saveXmlRef().
| bool Datatype::hasSameVariableBase | ( | const Datatype * | ct | ) | const |
Are these the same variable length data-type.
If this and the other given data-type are both variable length and come from the the same base data-type, return true.
| ct | is the other given data-type to compare with this |
References hashSize(), id, isVariableLength(), and size.
Referenced by CastStrategyC::castStandard().
|
virtual |
Is this data-type suitable as input to a CPUI_PTRSUB op.
A CPUI_PTRSUB must act on a pointer data-type where the given offset addresses a component. Perform this check.
| off | is the given offset |
Reimplemented in TypePointer, and TypePointerRel.
Referenced by ActionSetCasts::apply(), and RulePtrsubUndo::applyOp().
|
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.
| off | is the given offset into this data-type |
| newoff | is used to pass back the offset difference |
| elSize | is used to pass back the array element size |
Reimplemented in TypeStruct, and TypeSpacebase.
Referenced by AddTreeState::hasMatchingSubType(), and TypeSpacebase::nearestArrayedComponentBackward().
|
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.
| off | is the given offset into this data-type |
| newoff | is used to pass back the offset difference |
| elSize | is used to pass back the array element size |
Reimplemented in TypeStruct, and TypeSpacebase.
Referenced by AddTreeState::hasMatchingSubType(), and TypeSpacebase::nearestArrayedComponentForward().
|
inlinevirtual |
Return number of component sub-types.
Reimplemented in TypePointer, TypeArray, and TypeStruct.
Referenced by TypeFactory::orderRecurse().
|
inlinevirtual |
Print name as short prefix.
Reimplemented in TypePointer, and TypeArray.
References name.
Referenced by ScopeInternal::buildVariableName(), ScopeLocal::buildVariableName(), TypePointer::printNameBase(), and TypeArray::printNameBase().
|
virtual |
Print a description of the type to stream.
Print a raw description of the type to stream. Intended for debugging. Not intended to produce parsable C.
| s | is the output stream |
Reimplemented in TypePointer, TypeArray, TypePointerRel, and TypeCode.
Referenced by MapState::addRange(), TypeFactory::insert(), SymbolEntry::printEntry(), HighVariable::printInfo(), Varnode::printInfo(), FuncProto::printRaw(), TypePointer::printRaw(), TypeArray::printRaw(), and TypePointerRel::printRaw().
|
protected |
Recover basic data-type properties.
Restore the basic properties (name,size,id) of a data-type from an XML element Properties are read from the attributes of the element
| el | is the XML element |
References base2sub, coretype, flags, Element::getAttributeName(), Element::getAttributeValue(), Element::getNumAttributes(), hashName(), hashSize(), id, isVariableLength(), metatype, name, opaque_string, size, string2metatype(), submeta, variable_length, and xml_readbool().
Referenced by TypeFactory::restoreStruct(), TypeCode::restoreStub(), TypeChar::restoreXml(), TypeUnicode::restoreXml(), TypeFactory::restoreXmlTypeNoRef(), and TypeFactory::restoreXmlTypeWithCodeFlags().
|
virtual |
Serialize the data-type to XML.
Write out a formal description of the data-type as an XML <type> tag. For composite data-types, the description goes down one level, describing the component types only by reference.
| s | is the stream to write to |
Reimplemented in TypeChar, TypeUnicode, TypeVoid, TypePointer, TypeArray, TypeEnum, TypeStruct, TypePointerRel, TypeCode, and TypeSpacebase.
References metatype, and saveXmlBasic().
Referenced by CPoolRecord::saveXml(), ProtoStoreInternal::saveXml(), FuncProto::saveXml(), TypePointerRel::saveXml(), TypeFactory::saveXmlCoreTypes(), and saveXmlRef().
|
protected |
Save basic data-type properties.
Write out basic data-type properties (name,size,id) as XML attributes. This routine presumes the initial tag is already written to the stream.
| meta | is the metatype to put in the XML |
| s | is the stream to write to |
References a_v(), a_v_b(), a_v_i(), coretype, flags, hashSize(), id, isVariableLength(), metatype2string(), name, opaque_string, and size.
Referenced by saveXml(), TypeChar::saveXml(), TypeUnicode::saveXml(), TypePointer::saveXml(), TypeArray::saveXml(), TypePointerRel::saveXml(), TypeCode::saveXml(), and TypeSpacebase::saveXml().
| void Datatype::saveXmlRef | ( | ostream & | s | ) | const |
Write an XML reference of this to stream.
Write a simple reference to this data-type as an XML <typeref> tag, which only encodes the name and id.
| s | is the stream to write to |
References a_v(), a_v_i(), a_v_u(), hashSize(), isVariableLength(), metatype, name, saveXml(), size, and TYPE_VOID.
Referenced by TypePointerRel::saveXml(), Symbol::saveXmlBody(), and saveXmlTypedef().
|
protected |
Write this as a typedef tag to stream.
Called only if the typedefImm field is non-null. Write the data-type to the stream as a simple <typedef> tag including only the names and ids of this and the data-type it typedefs.
| s | is the output stream |
References a_v(), a_v_u(), name, saveXmlRef(), and typedefImm.
Referenced by TypeChar::saveXml(), TypeUnicode::saveXml(), TypeVoid::saveXml(), TypePointer::saveXml(), TypeArray::saveXml(), TypeCode::saveXml(), and TypeSpacebase::saveXml().
|
inline |
Order this with -op-, treating bool data-type as special.
Order data-types, with special handling of the bool data-type. Data-types are compared using the normal ordering, but bool is ordered after all other data-types. A return value of 0 indicates the data-types are the same, -1 indicates that this is prefered (ordered earlier), and 1 indicates this is ordered later.
| op | is the other data-type to compare with this |
References compare(), metatype, and TYPE_BOOL.
Referenced by HighVariable::getTypeRepresentative().
|
staticprotected |
The base propagation ordering associated with each meta-type. The array elements correspond to the ordering of type_metatype.
Referenced by Datatype(), and restoreXmlBasic().