|
decompiler 1.0.0
|
Relative pointer: A pointer with a fixed offset into a specific structure or other data-type. More...
#include <type.hh>
Public Member Functions | |
| TypePointerRel (const TypePointerRel &op) | |
| Construct from another TypePointerRel. | |
| TypePointerRel (int4 sz, Datatype *pt, uint4 ws, Datatype *par, int4 off) | |
| Construct given a size, pointed-to type, parent, and offset. | |
| Datatype * | getParent (void) const |
| Get the parent data-type to which this pointer is offset. | |
| bool | evaluateThruParent (uintb addrOff) const |
| Do we display given address offset as coming from the parent data-type. More... | |
| int4 | getPointerOffset (void) const |
| Get offset of this pointer relative to start of the containing data-type. More... | |
| virtual void | printRaw (ostream &s) const |
| Print a description of the type to stream. 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 Datatype * | clone (void) const |
| Clone the data-type. More... | |
| virtual void | encode (Encoder &encoder) const |
| Encode the data-type to a stream. More... | |
| virtual TypePointer * | downChain (uintb &off, TypePointer *&par, uintb &parOff, bool allowArrayWrap, TypeFactory &typegrp) |
| Find a sub-type pointer given an offset into this. 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 the plain form of the pointer. More... | |
Public Member Functions inherited from TypePointer | |
| TypePointer (const TypePointer &op) | |
| Construct from another TypePointer. | |
| TypePointer (int4 s, Datatype *pt, uint4 ws) | |
| Construct from a size, pointed-to type, and wordsize. | |
| TypePointer (Datatype *pt, AddrSpace *spc) | |
| Construct from a pointed-to type and an address space attribute. | |
| Datatype * | getPtrTo (void) const |
| Get the pointed-to Datatype. | |
| uint4 | getWordSize (void) const |
| Get the size of the addressable unit being pointed to. | |
| AddrSpace * | getSpace (void) const |
| Get any address space associated with this pointer. | |
| virtual void | printRaw (ostream &s) const |
| Print a description of the type to stream. More... | |
| 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 Datatype * | clone (void) const |
| Clone the data-type. More... | |
| virtual void | encode (Encoder &encoder) const |
| Encode the data-type to a stream. More... | |
| virtual TypePointer * | downChain (uintb &off, TypePointer *&par, uintb &parOff, bool allowArrayWrap, TypeFactory &typegrp) |
| Find a sub-type pointer given an offset into this. More... | |
| virtual bool | isPtrsubMatching (uintb off) const |
| Is this data-type suitable as input to a CPUI_PTRSUB op. 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... | |
Public Member Functions inherited from 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. | |
| 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 const TypeField * | findTruncation (int4 off, int4 sz, const PcodeOp *op, int4 slot, int4 &newoff) const |
| Find an immediate subfield of this data-type. 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 | encode (Encoder &encoder) const |
| Encode the data-type to a stream. 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... | |
| 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 (int4 offset, PcodeOp *op, int4 slot, int4 &newoff) |
| Resolve which union field is being used for a given PcodeOp when a truncation is involved. 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... | |
Static Public Member Functions | |
| static Datatype * | getPtrToFromParent (Datatype *base, int4 off, TypeFactory &typegrp) |
| Given a containing data-type and offset, find the "pointed to" data-type suitable for a TypePointerRel. More... | |
Static Public Member Functions inherited from 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 Member Functions | |
| void | markEphemeral (TypeFactory &typegrp) |
| Mark this as an ephemeral data-type, to be replaced in the final output. More... | |
| void | decode (Decoder &decoder, TypeFactory &typegrp) |
| TypePointerRel (void) | |
| Internal constructor for decode. | |
Protected Member Functions inherited from TypePointer | |
| void | decode (Decoder &decoder, TypeFactory &typegrp) |
| Restore this pointer data-type from a stream. More... | |
| void | calcSubmeta (void) |
| Pointers to structures may require a specific submeta. More... | |
| TypePointer (void) | |
| Internal constructor for use with decode. | |
Protected Member Functions inherited from 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... | |
| virtual Datatype * | clone (void) const =0 |
| Clone the data-type. More... | |
Protected Attributes | |
| TypePointer * | stripped |
| Same data-type with container info stripped. | |
| Datatype * | parent |
| Parent structure or array which this is pointing into. | |
| int4 | offset |
| Byte offset within the parent where this points to. | |
Protected Attributes inherited from TypePointer | |
| Datatype * | ptrto |
| Type being pointed to. | |
| AddrSpace * | spaceid |
| If non-null, the address space this is intented to point into. | |
| uint4 | wordsize |
| What size unit does the pointer address. | |
Protected Attributes inherited from Datatype | |
| 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. | |
Friends | |
| class | TypeFactory |
Additional Inherited Members | |
Protected Types inherited from 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 } |
| Boolean properties of datatypes. More... | |
Static Protected Member Functions inherited from 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 Datatype | |
| static sub_metatype | base2sub [15] |
Relative pointer: A pointer with a fixed offset into a specific structure or other data-type.
The other data-type, the container, is typically a TypeStruct or TypeArray. Even though this pointer does not point directly to the start of the container, it is possible to access the container through this, as the distance (the offset) to the start of the container is explicitly known.
|
inlinevirtual |
|
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 TypePointer.
References TypePointer::compare(), and stripped.
|
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 TypePointer.
References Datatype::getSize(), Datatype::getSubMeta(), offset, parent, TypePointer::ptrto, Datatype::size, Datatype::submeta, and TypePointer::wordsize.
|
protected |
Restore this relative pointer data-type from a stream
Parse a <type> element with children describing the data-type being pointed to and the parent data-type.
| decoder | is the stream decoder |
| typegrp | is the factory owning this data-type |
References Decoder::closeElement(), Datatype::decodeBasic(), TypeFactory::decodeType(), Datatype::flags, Decoder::getNextAttributeId(), Datatype::is_ptrrel, markEphemeral(), Datatype::metatype, Datatype::name, offset, Decoder::openElement(), parent, TypePointer::ptrto, Decoder::readSignedInteger(), Decoder::readSpace(), Decoder::readUnsignedInteger(), Decoder::rewindAttributes(), TypePointer::spaceid, SUB_PTRREL, Datatype::submeta, TYPE_PTR, and TypePointer::wordsize.
Referenced by TypeFactory::decodeTypeNoRef().
|
virtual |
Find a sub-type pointer given an offset into this.
Add a constant offset to this pointer. 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. If this is a pointer to (into) a container, the data-type of the container is passed back, with the offset into the container.
| off | is a reference to the offset to add |
| par | is used to pass back the container |
| parOff | is used to pass back the offset into the container |
| allowArrayWrap | is true if the pointer should be treated as a pointer to an array |
| typegrp | is the factory producing the (possibly new) data-type |
Reimplemented from TypePointer.
References calc_mask(), TypePointer::downChain(), Datatype::getMetatype(), Datatype::getSize(), TypeFactory::getTypePointer(), offset, parent, TypePointer::ptrto, Datatype::size, TYPE_ARRAY, TYPE_STRUCT, and TypePointer::wordsize.
|
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 TypePointer.
References Encoder::closeElement(), ELEM_TYPE, Datatype::encode(), Datatype::encodeBasic(), Datatype::encodeRef(), offset, Encoder::openElement(), parent, TypePointer::ptrto, TYPE_PTRREL, TypePointer::wordsize, Encoder::writeSignedInteger(), and Encoder::writeUnsignedInteger().
| bool TypePointerRel::evaluateThruParent | ( | uintb | addrOff | ) | const |
Do we display given address offset as coming from the parent data-type.
For a variable that is a relative pointer, constant offsets relative to the variable can be displayed either as coming from the variable itself or from the parent object.
| addrOff | is the given offset in address units |
References AddrSpace::addressToByte(), calc_mask(), Datatype::getMetatype(), Datatype::getSize(), offset, TypePointer::ptrto, Datatype::size, TYPE_STRUCT, and TypePointer::wordsize.
Referenced by AddTreeState::calcSubtype().
|
inline |
Get offset of this pointer relative to start of the containing data-type.
References AddrSpace::byteToAddressInt(), offset, and TypePointer::wordsize.
Referenced by AddTreeState::AddTreeState(), RuleStructOffset0::applyOp(), AddTreeState::calcSubtype(), PrintC::opPtrsub(), and TypeOpEqual::propagateAcrossCompare().
|
static |
Given a containing data-type and offset, find the "pointed to" data-type suitable for a TypePointerRel.
The biggest contained data-type that starts at the exact offset is returned. If the offset is negative or the is no data-type starting exactly there, an xunknown1 data-type is returned.
| base | is the given container data-type |
| off | is the offset relative to the start of the container |
| typegrp | is the factory owning the data-types |
References TypeFactory::getBase(), Datatype::getSubType(), and TYPE_UNKNOWN.
Referenced by IfcPointerSetting::execute().
|
inlinevirtual |
|
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 from TypePointer.
References AddrSpace::addressToByteInt(), Datatype::getSize(), TypePointer::isPtrsubMatching(), offset, stripped, and TypePointer::wordsize.
|
inlineprotected |
Mark this as an ephemeral data-type, to be replaced in the final output.
A base data-type is cached, which is a stripped version of the relative pointer, leaving just a plain TypePointer object with the same underlying ptrto. The base data-type replaces this relative pointer for formal variable declarations in source code output. This TypePointerRel is not considered a formal data-type but is only used to provide extra context for the pointer during propagation.
| typegrp | is the factory from which to fetch the base pointer |
References Datatype::flags, Datatype::getMetatype(), TypeFactory::getTypePointer(), Datatype::has_stripped, TypePointer::ptrto, Datatype::size, stripped, SUB_PTRREL_UNK, Datatype::submeta, TYPE_UNKNOWN, and TypePointer::wordsize.
Referenced by decode(), and TypeFactory::getTypePointerRel().
|
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 from TypePointer.
References offset, parent, Datatype::printRaw(), and TypePointer::ptrto.