decompiler
1.0.0
|
Partial data-type information mapped to a specific range of bytes. More...
#include <varmap.hh>
Public Types | |
enum | RangeType { fixed = 0, open = 1, endpoint = 2 } |
The basic categorization of the range. More... | |
Public Member Functions | |
RangeHint (void) | |
Uninitialized constructor. | |
RangeHint (uintb st, int4 sz, intb sst, Datatype *ct, uint4 fl, RangeType rt, int4 hi) | |
Initialized constructor. | |
bool | reconcile (const RangeHint *b) const |
Can the given intersecting RangeHint coexist with this at their given offsets. More... | |
bool | contain (const RangeHint *b) const |
Return true if this or the given range contains the other. More... | |
bool | preferred (const RangeHint *b, bool reconcile) const |
Return true if the this range's data-type is preferred over the other given range. More... | |
bool | absorb (RangeHint *b) |
Try to absorb the other RangeHint into this. More... | |
bool | merge (RangeHint *b, AddrSpace *space, TypeFactory *typeFactory) |
Try to form the union of this with another RangeHint. More... | |
int4 | compare (const RangeHint &op2) const |
Order this with another RangeHint. More... | |
Static Public Member Functions | |
static bool | compareRanges (const RangeHint *a, const RangeHint *b) |
Compare two RangeHint pointers. | |
Private Attributes | |
uintb | start |
Starting offset of this range of bytes. | |
int4 | size |
Number of bytes in a single element of this range. | |
intb | sstart |
A signed version of the starting offset. | |
Datatype * | type |
Putative data-type for a single element of this range. | |
uint4 | flags |
Additional boolean properties of this range. | |
RangeType | rangeType |
The type of range. | |
int4 | highind |
Minimum upper bound on the array index (if this is open) | |
Friends | |
class | MapState |
class | ScopeLocal |
Partial data-type information mapped to a specific range of bytes.
This object gives a hint about the data-type for a sequence of bytes starting at a specific address offset (typically on the stack). It describes where the data-type starts, what data-type it might be, and how far it extends from the start point (possibly as an array).
enum RangeHint::RangeType |
bool RangeHint::absorb | ( | RangeHint * | b | ) |
Try to absorb the other RangeHint into this.
If this RangeHint is an array and the following details line up, adjust this so that it absorbs the other given RangeHint and return true. The second RangeHint:
b | is the other RangeHint to absorb |
References endpoint, flags, Datatype::getMetatype(), Datatype::getSize(), highind, open, rangeType, sstart, type, TYPE_INT, TYPE_PTR, TYPE_UINT, TYPE_UNKNOWN, and Varnode::typelock.
Referenced by ScopeLocal::restructure().
int4 RangeHint::compare | ( | const RangeHint & | op2 | ) | const |
Order this with another RangeHint.
Compare (signed) offset, size, RangeType, type lock, and high index, in that order. Datatype is not compared.
op2 | is the other RangeHint to compare with this |
References flags, highind, rangeType, size, sstart, and Varnode::typelock.
Referenced by compareRanges(), and MapState::reconcileDatatypes().
bool RangeHint::contain | ( | const RangeHint * | b | ) | const |
Return true if this or the given range contains the other.
We assume this range starts at least as early as the given range and that the two ranges intersect.
b | is the given range to check for containment with this |
Referenced by merge().
bool RangeHint::merge | ( | RangeHint * | b, |
AddrSpace * | space, | ||
TypeFactory * | typeFactory | ||
) |
Try to form the union of this with another RangeHint.
Given that this and the other RangeHint intersect, redefine this so that it becomes the union of the two original ranges. The union must succeed in some form. An attempt is made to preserve the data-type information of both the original ranges, but changes will be made if necessary. An exception is thrown if the data-types are locked and cannot be reconciled.
b | is the other RangeHint to merge with this |
space | is the address space holding the ranges |
typeFactory | is a factory for producing data-types |
References contain(), fixed, flags, TypeFactory::getBase(), Datatype::getName(), Datatype::getSize(), highind, open, preferred(), rangeType, reconcile(), size, start, type, TYPE_UNKNOWN, Varnode::typelock, and AddrSpace::wrapOffset().
Referenced by ScopeLocal::restructure().
bool RangeHint::preferred | ( | const RangeHint * | b, |
bool | reconcile | ||
) | const |
Return true if the this range's data-type is preferred over the other given range.
A locked data-type is preferred over unlocked. A fixed size over open size. Otherwise data-type ordering is used.
b | is the other given range |
reconcile | is true is the two ranges have reconciled data-types |
References flags, open, rangeType, start, type, Varnode::typelock, and Datatype::typeOrder().
Referenced by merge().
bool RangeHint::reconcile | ( | const RangeHint * | b | ) | const |
Can the given intersecting RangeHint coexist with this at their given offsets.
Determine if the data-type information in the two ranges line up properly, in which case the union of the two ranges can exist without destroying data-type information.
b | is the range to reconcile with this |
References Datatype::getSize(), Datatype::getSubType(), sstart, and type.
Referenced by merge().