decompiler
1.0.0
|
Casting strategies that are specific to the C language. More...
#include <cast.hh>
Public Member Functions | |
virtual int4 | localExtensionType (const Varnode *vn, const PcodeOp *op) const |
Decide on integer promotion by examining just local properties of the given Varnode. More... | |
virtual int4 | intPromotionType (const Varnode *vn) const |
Calculate the integer promotion code of a given Varnode. More... | |
virtual bool | checkIntPromotionForCompare (const PcodeOp *op, int4 slot) const |
Check if integer promotion forces a cast for the given comparison op and slot. More... | |
virtual bool | checkIntPromotionForExtension (const PcodeOp *op) const |
Check if integer promotion forces a cast for the input to the given extension. More... | |
virtual bool | isExtensionCastImplied (const PcodeOp *op, const PcodeOp *readOp) const |
Is the given ZEXT/SEXT cast implied by the expression its in? More... | |
virtual Datatype * | castStandard (Datatype *reqtype, Datatype *curtype, bool care_uint_int, bool care_ptr_uint) const |
Does there need to be a visible cast between the given data-types. More... | |
virtual Datatype * | arithmeticOutputStandard (const PcodeOp *op) |
What is the output data-type produced by the given integer arithmetic operation. More... | |
virtual bool | isSubpieceCast (Datatype *outtype, Datatype *intype, uint4 offset) const |
Is truncating an input data-type, producing an output data-type, considered a cast. More... | |
virtual bool | isSubpieceCastEndian (Datatype *outtype, Datatype *intype, uint4 offset, bool isbigend) const |
Is the given data-type truncation considered a cast, given endianess concerns. More... | |
virtual bool | isSextCast (Datatype *outtype, Datatype *intype) const |
Is sign-extending an input data-type, producing an output data-type, considered a cast. More... | |
virtual bool | isZextCast (Datatype *outtype, Datatype *intype) const |
Is zero-extending an input data-type, producing an output data-type, considered a cast. More... | |
Public Member Functions inherited from ghidra::CastStrategy | |
CastStrategy (void) | |
Constructor. | |
void | setTypeFactory (TypeFactory *t) |
Establish the data-type factory. More... | |
virtual | ~CastStrategy (void) |
Destructor. | |
bool | markExplicitUnsigned (PcodeOp *op, int4 slot) const |
Check if a constant input should be explicitly labeled as an unsigned token. More... | |
bool | markExplicitLongSize (PcodeOp *op, int4 slot) const |
Check is a constant input should be explicitly labeled as a long integer token. More... | |
bool | caresAboutCharRepresentation (const Varnode *vn, const PcodeOp *op) const |
For the given PcodeOp, does it matter if a constant operand is presented as a character or integer. More... | |
Additional Inherited Members | |
Public Types inherited from ghidra::CastStrategy | |
enum | IntPromotionCode { NO_PROMOTION = -1, UNKNOWN_PROMOTION = 0, UNSIGNED_EXTENSION = 1, SIGNED_EXTENSION = 2, EITHER_EXTENSION = 3 } |
Types of integer promotion. More... | |
Protected Attributes inherited from ghidra::CastStrategy | |
TypeFactory * | tlst |
Type factory associated with the Architecture. | |
int4 | promoteSize |
Size of int data-type, (size that integers get promoted to) | |
Casting strategies that are specific to the C language.
What is the output data-type produced by the given integer arithmetic operation.
op | is the given operation |
Implements ghidra::CastStrategy.
References ghidra::TypeFactory::getBase(), ghidra::Varnode::getHighTypeReadFacing(), ghidra::PcodeOp::getIn(), ghidra::Datatype::getMetatype(), ghidra::Datatype::getSize(), ghidra::PcodeOp::numInput(), ghidra::CastStrategy::tlst, ghidra::TYPE_BOOL, ghidra::TYPE_INT, and ghidra::Datatype::typeOrder().
|
virtual |
Does there need to be a visible cast between the given data-types.
The cast is from a current data-type to an expected data-type. NULL is returned if no cast is required, otherwise the data-type to cast to (usually the expected data-type) is returned.
reqtype | is the expected data-type |
curtype | is the current data-type |
care_uint_int | is true if we care about a change in signedness |
care_ptr_uint | is true if we care about conversions between pointers and unsigned values |
Implements ghidra::CastStrategy.
Reimplemented in ghidra::CastStrategyJava.
References ghidra::Datatype::getMetatype(), ghidra::TypePointer::getPtrTo(), ghidra::Datatype::getSize(), ghidra::TypePointer::getSpace(), ghidra::Datatype::getTypedef(), ghidra::TypePointer::getWordSize(), ghidra::Datatype::hasSameVariableBase(), ghidra::Datatype::isVariableLength(), ghidra::TYPE_BOOL, ghidra::TYPE_CODE, ghidra::TYPE_INT, ghidra::TYPE_PTR, ghidra::TYPE_UINT, ghidra::TYPE_UNKNOWN, and ghidra::TYPE_VOID.
|
virtual |
Check if integer promotion forces a cast for the given comparison op and slot.
Compute to what level the given slot has seen integer promotion and if a cast is required before the comparison operator makes sense.
op | is the given comparison operator |
slot | is the input slot being tested |
Implements ghidra::CastStrategy.
References ghidra::PcodeOp::getIn(), ghidra::CastStrategy::intPromotionType(), ghidra::CastStrategy::NO_PROMOTION, and ghidra::CastStrategy::UNKNOWN_PROMOTION.
|
virtual |
Check if integer promotion forces a cast for the input to the given extension.
Compute to what level the given slot has seen integer promotion and if a cast is required before the extension operator makes sense.
op | is the given extension operator INT_ZEXT or INT_SEXT |
Implements ghidra::CastStrategy.
References ghidra::PcodeOp::code(), ghidra::CPUI_INT_SEXT, ghidra::CPUI_INT_ZEXT, ghidra::PcodeOp::getIn(), ghidra::CastStrategy::intPromotionType(), ghidra::CastStrategy::NO_PROMOTION, ghidra::CastStrategy::SIGNED_EXTENSION, ghidra::CastStrategy::UNKNOWN_PROMOTION, and ghidra::CastStrategy::UNSIGNED_EXTENSION.
|
virtual |
Calculate the integer promotion code of a given Varnode.
Recursively examine the expression defining the Varnode as necessary
vn | is the given Varnode |
Implements ghidra::CastStrategy.
References ghidra::PcodeOp::code(), ghidra::CPUI_INT_2COMP, ghidra::CPUI_INT_ADD, ghidra::CPUI_INT_AND, ghidra::CPUI_INT_DIV, ghidra::CPUI_INT_LEFT, ghidra::CPUI_INT_MULT, ghidra::CPUI_INT_NEGATE, ghidra::CPUI_INT_OR, ghidra::CPUI_INT_REM, ghidra::CPUI_INT_RIGHT, ghidra::CPUI_INT_SDIV, ghidra::CPUI_INT_SREM, ghidra::CPUI_INT_SRIGHT, ghidra::CPUI_INT_SUB, ghidra::CPUI_INT_XOR, ghidra::Varnode::getDef(), ghidra::PcodeOp::getIn(), ghidra::Varnode::getSize(), ghidra::Varnode::isConstant(), ghidra::Varnode::isExplicit(), ghidra::Varnode::isWritten(), ghidra::CastStrategy::localExtensionType(), ghidra::Varnode::loneDescend(), ghidra::CastStrategy::NO_PROMOTION, ghidra::CastStrategy::promoteSize, ghidra::CastStrategy::SIGNED_EXTENSION, ghidra::CastStrategy::UNKNOWN_PROMOTION, and ghidra::CastStrategy::UNSIGNED_EXTENSION.
|
virtual |
Is the given ZEXT/SEXT cast implied by the expression its in?
We've already determined that the given ZEXT or SEXT op can be viewed as a natural cast operation. Determine if the cast is implied by the expression its and doesn't need to be printed.
op | is the given ZEXT or SEXT PcodeOp |
readOp | is the PcodeOp consuming the output of the extensions (or null) |
Implements ghidra::CastStrategy.
References ghidra::PcodeOp::code(), ghidra::CPUI_INT_ADD, ghidra::CPUI_INT_AND, ghidra::CPUI_INT_DIV, ghidra::CPUI_INT_EQUAL, ghidra::CPUI_INT_LESS, ghidra::CPUI_INT_LESSEQUAL, ghidra::CPUI_INT_MULT, ghidra::CPUI_INT_NOTEQUAL, ghidra::CPUI_INT_OR, ghidra::CPUI_INT_SLESS, ghidra::CPUI_INT_SLESSEQUAL, ghidra::CPUI_INT_SUB, ghidra::CPUI_INT_XOR, ghidra::CPUI_PTRADD, ghidra::Varnode::getHighTypeReadFacing(), ghidra::PcodeOp::getIn(), ghidra::Datatype::getMetatype(), ghidra::PcodeOp::getOut(), ghidra::Varnode::getSize(), ghidra::PcodeOp::getSlot(), ghidra::Varnode::isConstant(), ghidra::Varnode::isExplicit(), and ghidra::CastStrategy::promoteSize.
Is sign-extending an input data-type, producing an output data-type, considered a cast.
Data-types must be provided from the input and output of an INT_SEXT operation.
outtype | is the output data-type |
intype | is the input data-type |
Implements ghidra::CastStrategy.
References ghidra::Datatype::getMetatype(), ghidra::TYPE_BOOL, ghidra::TYPE_INT, and ghidra::TYPE_UINT.
|
virtual |
Is truncating an input data-type, producing an output data-type, considered a cast.
Data-types must be provided from the input and output of a SUBPIECE operation.
outtype | is the output data-type |
intype | is the input data-type |
offset | is number of bytes truncated by the SUBPIECE |
Implements ghidra::CastStrategy.
References ghidra::Datatype::getMetatype(), ghidra::Datatype::getSize(), ghidra::TYPE_FLOAT, ghidra::TYPE_INT, ghidra::TYPE_PTR, ghidra::TYPE_UINT, and ghidra::TYPE_UNKNOWN.
|
virtual |
Is the given data-type truncation considered a cast, given endianess concerns.
This is equivalent to isSubpieceCast() but where the truncation is accomplished by pulling bytes directly out of memory. We assume the input data-type is layed down in memory, and we pull the output value starting at a given byte offset.
outtype | is the output data-type |
intype | is the input data-type |
offset | is the given byte offset (into the input memory) |
isbigend | is true if the address space holding the memory is big endian. |
Implements ghidra::CastStrategy.
References ghidra::Datatype::getSize(), and ghidra::CastStrategy::isSubpieceCast().
Is zero-extending an input data-type, producing an output data-type, considered a cast.
Data-types must be provided from the input and output of an INT_ZEXT operation.
outtype | is the output data-type |
intype | is the input data-type |
Implements ghidra::CastStrategy.
Reimplemented in ghidra::CastStrategyJava.
References ghidra::Datatype::getMetatype(), ghidra::TYPE_BOOL, ghidra::TYPE_INT, and ghidra::TYPE_UINT.
|
virtual |
Decide on integer promotion by examining just local properties of the given Varnode.
Implements ghidra::CastStrategy.
References ghidra::PcodeOp::code(), ghidra::CPUI_CAST, ghidra::CPUI_INT_AND, ghidra::CPUI_LOAD, ghidra::CastStrategy::EITHER_EXTENSION, ghidra::Varnode::getDef(), ghidra::Varnode::getHighTypeReadFacing(), ghidra::PcodeOp::getIn(), ghidra::Datatype::getMetatype(), ghidra::Varnode::getOffset(), ghidra::Varnode::getSize(), ghidra::PcodeOp::isBoolOutput(), ghidra::PcodeOp::isCall(), ghidra::Varnode::isConstant(), ghidra::Varnode::isExplicit(), ghidra::Varnode::isWritten(), ghidra::CastStrategy::SIGNED_EXTENSION, ghidra::TYPE_BOOL, ghidra::TYPE_INT, ghidra::TYPE_UINT, ghidra::TYPE_UNKNOWN, ghidra::CastStrategy::UNKNOWN_PROMOTION, and ghidra::CastStrategy::UNSIGNED_EXTENSION.