decompiler 1.0.0
Public Member Functions | Protected Types | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Static Protected Attributes | Friends | List of all members
Datatype Class Referenceabstract

The base datatype class for the decompiler. More...

#include <type.hh>

Inheritance diagram for Datatype:
TypeArray TypeBase TypeCode TypePointer TypeSpacebase TypeStruct TypeVoid TypeChar TypeEnum TypeUnicode TypePointerRel

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.
 
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 DatatypegetSubType (uintb off, uintb *newoff) const
 Recover component data-type one-level down. More...
 
virtual DatatypenearestArrayedComponentForward (uintb off, uintb *newoff, int4 *elSize) const
 
virtual DatatypenearestArrayedComponentBackward (uintb off, uintb *newoff, int4 *elSize) const
 
virtual int4 numDepend (void) const
 Return number of component sub-types. More...
 
virtual DatatypegetDepend (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 DatatypegetStripped (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 Datatypeclone (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)
 
DatatypetypedefImm
 The immediate data-type being typedefed by this.
 

Static Protected Attributes

static sub_metatype base2sub [13]
 

Friends

class TypeFactory
 
struct DatatypeCompare
 

Detailed Description

The base datatype class for the decompiler.

Used for symbols, function prototypes, type propagation etc.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
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.

Member Function Documentation

◆ clone()

virtual Datatype * Datatype::clone ( void  ) const
protectedpure virtual

◆ compare()

int4 Datatype::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 in TypePointer, TypeArray, TypeEnum, TypeStruct, TypeCode, and TypeSpacebase.

References size, and submeta.

Referenced by TypePointer::compare(), TypeArray::compare(), TypeCode::compare(), typeOrder(), and typeOrderBool().

◆ compareDependency()

int4 Datatype::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 in TypePointer, TypeArray, TypeEnum, TypeStruct, TypePointerRel, TypeCode, and TypeSpacebase.

References size, and submeta.

Referenced by TypeCode::compareDependency(), TypeSpacebase::compareDependency(), TypeFactory::findAdd(), DatatypeCompare::operator()(), TypeFactory::restoreCode(), and TypeFactory::restoreStruct().

◆ getDepend()

virtual Datatype * Datatype::getDepend ( int4  index) const
inlinevirtual

Return the i-th component sub-type.

Reimplemented in TypePointer, TypeArray, and TypeStruct.

Referenced by TypeFactory::orderRecurse().

◆ getStripped()

Datatype * Datatype::getStripped ( void  ) const
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.

Returns
the stripped version or null

Reimplemented in TypePointerRel.

Referenced by TypeFactory::getTypePointer(), TypeFactory::getTypePointerStripArray(), and HighVariable::updateType().

◆ getSubType()

Datatype * Datatype::getSubType ( uintb  off,
uintb *  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 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().

◆ hashName()

uint8 Datatype::hashName ( const string &  nm)
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.

Parameters
nmis 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().

◆ hashSize()

uint8 Datatype::hashSize ( uint8  id,
int4  size 
)
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.

Parameters
idis the given ID to (de)uniquify
sizeis the instance size of the structure
Returns
the (de)uniquified id

References id, and size.

Referenced by TypeFactory::findById(), hasSameVariableBase(), TypeFactory::restoreTypedef(), restoreXmlBasic(), saveXmlBasic(), and saveXmlRef().

◆ hasSameVariableBase()

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.

Parameters
ctis the other given data-type to compare with this
Returns
true if they are the same variable length data-type.

References hashSize(), id, isVariableLength(), and size.

Referenced by CastStrategyC::castStandard().

◆ isPtrsubMatching()

bool Datatype::isPtrsubMatching ( uintb  off) const
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.

Parameters
offis the given offset
Returns
true if this is a suitable PTRSUB data-type

Reimplemented in TypePointer, and TypePointerRel.

Referenced by ActionSetCasts::apply(), and RulePtrsubUndo::applyOp().

◆ nearestArrayedComponentBackward()

Datatype * Datatype::nearestArrayedComponentBackward ( uintb  off,
uintb *  newoff,
int4 *  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 in TypeStruct, and TypeSpacebase.

Referenced by AddTreeState::hasMatchingSubType(), and TypeSpacebase::nearestArrayedComponentBackward().

◆ nearestArrayedComponentForward()

Datatype * Datatype::nearestArrayedComponentForward ( uintb  off,
uintb *  newoff,
int4 *  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 in TypeStruct, and TypeSpacebase.

Referenced by AddTreeState::hasMatchingSubType(), and TypeSpacebase::nearestArrayedComponentForward().

◆ numDepend()

virtual int4 Datatype::numDepend ( void  ) const
inlinevirtual

Return number of component sub-types.

Reimplemented in TypePointer, TypeArray, and TypeStruct.

Referenced by TypeFactory::orderRecurse().

◆ printNameBase()

virtual void Datatype::printNameBase ( ostream &  s) const
inlinevirtual

◆ printRaw()

void Datatype::printRaw ( ostream &  s) const
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.

Parameters
sis the output stream

Reimplemented in TypePointer, TypeArray, TypePointerRel, and TypeCode.

References name, and size.

Referenced by MapState::addRange(), TypeFactory::insert(), SymbolEntry::printEntry(), HighVariable::printInfo(), Varnode::printInfo(), FuncProto::printRaw(), TypePointer::printRaw(), TypeArray::printRaw(), and TypePointerRel::printRaw().

◆ restoreXmlBasic()

void Datatype::restoreXmlBasic ( const Element el)
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

Parameters
elis 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().

◆ saveXml()

void Datatype::saveXml ( ostream &  s) const
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.

Parameters
sis 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().

◆ saveXmlBasic()

void Datatype::saveXmlBasic ( type_metatype  meta,
ostream &  s 
) const
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.

Parameters
metais the metatype to put in the XML
sis 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().

◆ saveXmlRef()

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.

Parameters
sis 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().

◆ saveXmlTypedef()

void Datatype::saveXmlTypedef ( ostream &  s) const
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.

Parameters
sis 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().

◆ typeOrderBool()

int4 Datatype::typeOrderBool ( const Datatype op) const
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.

Parameters
opis the other data-type to compare with this
Returns
-1, 0, or 1

References compare(), metatype, and TYPE_BOOL.

Referenced by HighVariable::getTypeRepresentative().

Member Data Documentation

◆ base2sub

sub_metatype Datatype::base2sub
staticprotected
Initial value:
= {
}
@ SUB_STRUCT
Compare as TYPE_STRUCT.
Definition: type.hh:71
@ SUB_UNKNOWN
Compare as a TYPE_UNKNOWN.
Definition: type.hh:53
@ SUB_BOOL
Compare as TYPE_BOOL.
Definition: type.hh:62
@ SUB_INT_PLAIN
Compare as a plain TYPE_INT.
Definition: type.hh:56
@ SUB_ARRAY
Compare as TYPE_ARRAY.
Definition: type.hh:69
@ SUB_FLOAT
Compare as TYPE_FLOAT.
Definition: type.hh:64
@ SUB_CODE
Compare as TYPE_CODE.
Definition: type.hh:63
@ SUB_PARTIALSTRUCT
Compare as TYPE_PARTIALSTRUCT.
Definition: type.hh:70
@ SUB_PTRREL
Pointer relative to another data-type, sub-type of TYPE_PTR.
Definition: type.hh:67
@ SUB_SPACEBASE
Compare as a TYPE_SPACEBASE.
Definition: type.hh:52
@ SUB_UINT_PLAIN
Compare as a plain TYPE_UINT.
Definition: type.hh:57
@ SUB_PTR
Compare as TYPE_PTR.
Definition: type.hh:66
@ SUB_VOID
Compare as a TYPE_VOID.
Definition: type.hh:51

The base propagation ordering associated with each meta-type. The array elements correspond to the ordering of type_metatype.

Referenced by Datatype(), and restoreXmlBasic().


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