decompiler
1.0.0
|
Information about the SUBPIECE op-code. More...
#include <typeop.hh>
Public Member Functions | |
TypeOpSubpiece (TypeFactory *t) | |
Constructor. | |
virtual Datatype * | getInputCast (const PcodeOp *op, int4 slot, const CastStrategy *castStrategy) const |
Find the data-type of the input to a specific PcodeOp. More... | |
virtual Datatype * | getOutputToken (const PcodeOp *op, CastStrategy *castStrategy) const |
Find the data-type of the output that would be assigned by a compiler. More... | |
virtual Datatype * | propagateType (Datatype *alttype, PcodeOp *op, Varnode *invn, Varnode *outvn, int4 inslot, int4 outslot) |
Propagate an incoming data-type across a specific PcodeOp. More... | |
virtual string | getOperatorName (const PcodeOp *op) const |
Get the name of the op-code as it should be displayed in context. More... | |
virtual void | push (PrintLanguage *lng, const PcodeOp *op, const PcodeOp *readOp) const |
Push the specific PcodeOp to the emitter's RPN stack. More... | |
Public Member Functions inherited from ghidra::TypeOpFunc | |
TypeOpFunc (TypeFactory *t, OpCode opc, const string &n, type_metatype mout, type_metatype min) | |
Constructor. | |
virtual Datatype * | getOutputLocal (const PcodeOp *op) const |
Find the minimal (or suggested) data-type of an output to this op-code. More... | |
virtual Datatype * | getInputLocal (const PcodeOp *op, int4 slot) const |
Find the minimal (or suggested) data-type of an input to this op-code. More... | |
virtual void | printRaw (ostream &s, const PcodeOp *op) |
Print (for debugging purposes) this specific PcodeOp to the stream. More... | |
Public Member Functions inherited from ghidra::TypeOp | |
TypeOp (TypeFactory *t, OpCode opc, const string &n) | |
Constructor. More... | |
virtual | ~TypeOp (void) |
Destructor. | |
const string & | getName (void) const |
Get the display name of the op-code. | |
OpCode | getOpcode (void) const |
Get the op-code value. | |
uint4 | getFlags (void) const |
Get the properties associated with the op-code. | |
OpBehavior * | getBehavior (void) const |
Get the behavior associated with the op-code. | |
uintb | evaluateUnary (int4 sizeout, int4 sizein, uintb in1) const |
Emulate the unary op-code on an input value. More... | |
uintb | evaluateBinary (int4 sizeout, int4 sizein, uintb in1, uintb in2) const |
Emulate the binary op-code on an input value. More... | |
uintb | recoverInputBinary (int4 slot, int4 sizeout, uintb out, int4 sizein, uintb in) const |
Reverse the binary op-code operation, recovering a constant input value. More... | |
uintb | recoverInputUnary (int4 sizeout, uintb out, int4 sizein) const |
Reverse the unary op-code operation, recovering a constant input value. More... | |
bool | isCommutative (void) const |
Return true if this op-code is commutative. More... | |
bool | inheritsSign (void) const |
Return true if the op-code inherits its signedness from its inputs. | |
bool | inheritsSignFirstParamOnly (void) const |
Return true if the op-code inherits its signedness from only its first input. | |
bool | isShiftOp (void) const |
Return true if the op-code is a shift (INT_LEFT, INT_RIGHT, or INT_SRIGHT) | |
bool | isArithmeticOp (void) const |
Return true if the opcode is INT_ADD, INT_MULT, INT_DIV, INT_REM, or other arithmetic op. | |
bool | isLogicalOp (void) const |
Return true if the opcode is INT_AND, INT_OR, INT_XOR, or other logical op. | |
bool | isFloatingPointOp (void) const |
Return true if the opcode is FLOAT_ADD, FLOAT_MULT, or other floating-point operation. | |
Static Public Member Functions | |
static int4 | computeByteOffsetForComposite (const PcodeOp *op) |
Compute the byte offset into an assumed composite data-type produced by the given CPUI_SUBPIECE. More... | |
Static Public Member Functions inherited from ghidra::TypeOp | |
static void | registerInstructions (vector< TypeOp *> &inst, TypeFactory *tlst, const Translate *trans) |
Build a map from op-code value to the TypeOp information objects. More... | |
static void | selectJavaOperators (vector< TypeOp *> &inst, bool val) |
Toggle Java specific aspects of the op-code information. More... | |
Private Attributes | |
int4 | nearPointerSize |
Size of near (truncated) pointer (if not 0) | |
int4 | farPointerSize |
Size of far (extended) pointer (if not 0) | |
Additional Inherited Members | |
Public Types inherited from ghidra::TypeOp | |
enum | { inherits_sign = 1, inherits_sign_zero = 2, shift_op = 4, arithmetic_op = 8, logical_op = 0x10, floatingpoint_op = 0x20 } |
Protected Member Functions inherited from ghidra::TypeOp | |
virtual void | setSymbol (const string &nm) |
Set the display symbol associated with the op-code. | |
Protected Attributes inherited from ghidra::TypeOp | |
TypeFactory * | tlst |
Pointer to data-type factory. | |
OpCode | opcode |
The op-code value. | |
uint4 | opflags |
Cached pcode-op properties for this op-code. | |
uint4 | addlflags |
Additional properties. | |
string | name |
Symbol denoting this operation. | |
OpBehavior * | behave |
Object for emulating the behavior of the op-code. | |
Information about the SUBPIECE op-code.
|
static |
Compute the byte offset into an assumed composite data-type produced by the given CPUI_SUBPIECE.
If the input Varnode is a composite data-type, the extracted result of the SUBPIECE represent a range of bytes starting at a particular offset within the data-type. Return this offset, which depends on endianness of the input.
op | is the given CPUI_SUBPIECE |
References ghidra::PcodeOp::getIn(), ghidra::Varnode::getOffset(), ghidra::PcodeOp::getOut(), ghidra::Varnode::getSize(), ghidra::Varnode::getSpace(), and ghidra::AddrSpace::isBigEndian().
Referenced by getOutputToken(), ghidra::PrintC::opSubpiece(), propagateType(), and ghidra::ScoreUnionFields::scoreTrialDown().
|
virtual |
Find the data-type of the input to a specific PcodeOp.
Calculate the actual data-type of the input to the specific PcodeOp. A null result indicates the input data-type is the same as or otherwise doesn't need a cast from the data-type of the actual input Varnode
op | is the specific PcodeOp |
slot | is the input to consider |
castStrategy | is the current casting strategy |
Reimplemented from ghidra::TypeOp.
|
virtual |
Get the name of the op-code as it should be displayed in context.
Depending on the context, the same op-code may get displayed in different ways.
op | is the PcodeOp context |
Reimplemented from ghidra::TypeOp.
References ghidra::PcodeOp::getIn(), ghidra::PcodeOp::getOut(), ghidra::Varnode::getSize(), and ghidra::TypeOp::name.
|
virtual |
Find the data-type of the output that would be assigned by a compiler.
Calculate the actual data-type of the output for a specific PcodeOp as would be assigned by a C compiler parsing a grammar containing this op.
op | is the specific PcodeOp |
castStrategy | is the current casting strategy |
Reimplemented from ghidra::TypeOp.
References computeByteOffsetForComposite(), ghidra::Datatype::findTruncation(), ghidra::TypeFactory::getBase(), ghidra::Varnode::getHighTypeDefFacing(), ghidra::Varnode::getHighTypeReadFacing(), ghidra::PcodeOp::getIn(), ghidra::Datatype::getMetatype(), ghidra::PcodeOp::getOut(), ghidra::Varnode::getSize(), ghidra::Datatype::getSize(), ghidra::TypeOp::tlst, ghidra::TypeField::type, ghidra::TYPE_INT, and ghidra::TYPE_UNKNOWN.
|
virtual |
Propagate an incoming data-type across a specific PcodeOp.
The data-type can propagate between any two Varnodes attached to the PcodeOp, either in or out. The pair invn and inslot indicate the Varnode holding the incoming data-type. The pair outvn and outslot indicate the Varnode that will hold the outgoing data-type. The data-type for the outgoing Varnode is returned, which may be different then the incoming data-type as the PcodeOp can transform the data-type as it propagates.
alttype | is the incoming data-type |
op | is the PcodeOp to propagate across |
invn | is the Varnode holding the incoming data-type |
outvn | is the Varnode that will hold the outgoing data-type |
inslot | indicates how the incoming Varnode is attached to the PcodeOp (-1 indicates output >= indicates input) |
outslot | indicates how the outgoing Varnode is attached to the PcodeOp |
Reimplemented from ghidra::TypeOp.
References computeByteOffsetForComposite(), farPointerSize, ghidra::PcodeOp::getIn(), ghidra::Datatype::getMetatype(), ghidra::Varnode::getOffset(), ghidra::Varnode::getSize(), ghidra::Datatype::getSize(), ghidra::Datatype::getSubType(), nearPointerSize, ghidra::TypeFactory::resizePointer(), ghidra::Datatype::resolveTruncation(), ghidra::TypeOp::tlst, ghidra::TypeField::type, ghidra::TYPE_PARTIALUNION, ghidra::TYPE_PTR, and ghidra::TYPE_UNION.
|
inlinevirtual |
Push the specific PcodeOp to the emitter's RPN stack.
Given a specific language and PcodeOp, emit the expression rooted at the operation.
lng | is the PrintLanguage to emit |
op | is the specific PcodeOp |
readOp | is the PcodeOp consuming the output (or null) |
Implements ghidra::TypeOp.
References ghidra::PrintLanguage::opSubpiece().