decompiler
1.0.0
|
Pull SUBPIECE back through MULTIEQUAL. More...
Public Member Functions | |
RulePullsubMulti (const string &g) | |
Constructor. | |
virtual Rule * | clone (const ActionGroupList &grouplist) const |
Clone the Rule. More... | |
virtual void | getOpList (vector< uint4 > &oplist) const |
List of op codes this rule operates on. More... | |
virtual int4 | applyOp (PcodeOp *op, Funcdata &data) |
Attempt to apply this Rule. More... | |
Public Member Functions inherited from ghidra::Rule | |
Rule (const string &g, uint4 fl, const string &nm) | |
Construct given group, properties name. More... | |
virtual | ~Rule (void) |
Destructor. | |
const string & | getName (void) const |
Return the name of this Rule. | |
const string & | getGroup (void) const |
Return the group this Rule belongs to. | |
uint4 | getNumTests (void) |
Get number of attempted applications. | |
uint4 | getNumApply (void) |
Get number of successful applications. | |
void | setBreak (uint4 tp) |
Set a breakpoint on this Rule. | |
void | clearBreak (uint4 tp) |
Clear a breakpoint on this Rule. | |
void | clearBreakPoints (void) |
Clear all breakpoints on this Rule. | |
void | turnOnWarnings (void) |
Enable warnings for this Rule. | |
void | turnOffWarnings (void) |
Disable warnings for this Rule. | |
bool | isDisabled (void) const |
Return true if this Rule is disabled. | |
void | setDisable (void) |
Disable this Rule (within its pool) | |
void | clearDisable (void) |
Enable this Rule (within its pool) | |
bool | checkActionBreak (void) |
Check if an action breakpoint is turned on. More... | |
uint4 | getBreakPoint (void) const |
Return breakpoint toggles. | |
virtual void | reset (Funcdata &data) |
Reset this Rule. More... | |
virtual void | resetStats (void) |
Reset Rule statistics. More... | |
virtual void | printStatistics (ostream &s) const |
Print statistics for this Rule. More... | |
Static Public Member Functions | |
static void | minMaxUse (Varnode *vn, int4 &maxByte, int4 &minByte) |
Compute minimum and maximum bytes being used. More... | |
static void | replaceDescendants (Varnode *origVn, Varnode *newVn, int4 maxByte, int4 minByte, Funcdata &data) |
static bool | acceptableSize (int4 size) |
Return true if given size is a suitable truncated size. More... | |
static Varnode * | buildSubpiece (Varnode *basevn, uint4 outsize, uint4 shift, Funcdata &data) |
Build a SUBPIECE of given base Varnode. More... | |
static Varnode * | findSubpiece (Varnode *basevn, uint4 outsize, uint4 shift) |
Find a predefined SUBPIECE of a base Varnode. More... | |
Additional Inherited Members | |
Public Types inherited from ghidra::Rule | |
enum | typeflags { type_disable = 1, rule_debug = 2, warnings_on = 4, warnings_given = 8 } |
Properties associated with a Rule. More... | |
Pull SUBPIECE back through MULTIEQUAL.
|
static |
Return true if given size is a suitable truncated size.
size | is the given size |
Referenced by ghidra::RulePullsubIndirect::applyOp().
Attempt to apply this Rule.
This method contains the main logic for applying the Rule. It must use a given PcodeOp as the point at which the Rule applies. If it does apply, changes are made directly to the function and 1 (non-zero) is returned, otherwise 0 is returned.
Reimplemented from ghidra::Rule.
References ghidra::calc_mask(), ghidra::PcodeOp::code(), ghidra::CPUI_INT_SEXT, ghidra::CPUI_INT_ZEXT, ghidra::CPUI_MULTIEQUAL, ghidra::PcodeOp::getAddr(), ghidra::Varnode::getAddr(), ghidra::Varnode::getConsume(), ghidra::Varnode::getDef(), ghidra::PcodeOp::getIn(), ghidra::PcodeOp::getOut(), ghidra::PcodeOp::getParent(), ghidra::Varnode::getSize(), ghidra::Varnode::getSpace(), ghidra::FlowBlock::hasLoopIn(), ghidra::AddrSpace::isBigEndian(), ghidra::Varnode::isPrecisHi(), ghidra::Varnode::isPrecisLo(), ghidra::Varnode::isWritten(), ghidra::Funcdata::newOp(), ghidra::Funcdata::newVarnodeOut(), ghidra::PcodeOp::numInput(), ghidra::Funcdata::opInsertBegin(), ghidra::Funcdata::opSetAllInput(), ghidra::Funcdata::opSetOpcode(), and ghidra::Address::renormalize().
|
static |
Build a SUBPIECE of given base Varnode.
The PcodeOp is constructed and inserted near the definition of the base Varnode.
basevn | is the given base Varnode |
outsize | is the required truncated size in bytes |
shift | is the number of least significant bytes to truncate |
data | is the function being analyzed |
References ghidra::CPUI_SUBPIECE, ghidra::AddrSpaceManager::findJoin(), ghidra::PcodeOp::getAddr(), ghidra::Varnode::getAddr(), ghidra::Funcdata::getArch(), ghidra::Funcdata::getBasicBlocks(), ghidra::BlockGraph::getBlock(), ghidra::Varnode::getDef(), ghidra::Varnode::getOffset(), ghidra::JoinRecord::getPiece(), ghidra::Varnode::getSize(), ghidra::Varnode::getSpace(), ghidra::BlockBasic::getStart(), ghidra::AddrSpace::isBigEndian(), ghidra::Varnode::isInput(), ghidra::Address::isJoin(), ghidra::Varnode::isWritten(), ghidra::Funcdata::newConstant(), ghidra::Funcdata::newOp(), ghidra::Funcdata::newUniqueOut(), ghidra::Funcdata::newVarnodeOut(), ghidra::JoinRecord::numPieces(), ghidra::Funcdata::opInsertAfter(), ghidra::Funcdata::opInsertBegin(), ghidra::Funcdata::opSetInput(), ghidra::Funcdata::opSetOpcode(), ghidra::Address::renormalize(), and ghidra::VarnodeData::size.
Referenced by ghidra::RulePullsubIndirect::applyOp().
|
inlinevirtual |
Clone the Rule.
If this Rule is a member of one of the groups in the grouplist, this returns a clone of the Rule, otherwise NULL is returned.
grouplist | is the list of groups being cloned |
Implements ghidra::Rule.
References ghidra::ActionGroupList::contains(), ghidra::AddTreeState::data, and ghidra::AddTreeState::size.
|
static |
Find a predefined SUBPIECE of a base Varnode.
Given a Varnode and desired dimensions (size and shift), search for a preexisting truncation defined in the same block as the original Varnode or return NULL
basevn | is the base Varnode |
outsize | is the desired truncation size |
shift | if the desired truncation shift |
References ghidra::Varnode::beginDescend(), ghidra::PcodeOp::code(), ghidra::CPUI_SUBPIECE, ghidra::Varnode::endDescend(), ghidra::Varnode::getDef(), ghidra::PcodeOp::getIn(), ghidra::FlowBlock::getIndex(), ghidra::Varnode::getOffset(), ghidra::PcodeOp::getOut(), ghidra::PcodeOp::getParent(), ghidra::Varnode::getSize(), ghidra::Varnode::isInput(), and ghidra::Varnode::isWritten().
Referenced by ghidra::RulePullsubIndirect::applyOp().
|
virtual |
List of op codes this rule operates on.
Populate the given array with all possible OpCodes this Rule might apply to. By default, this method returns all possible OpCodes
oplist | is the array to populate |
Reimplemented from ghidra::Rule.
References ghidra::CPUI_SUBPIECE.
|
static |
Compute minimum and maximum bytes being used.
For bytes in given Varnode pass back the largest and smallest index (lsb=0) consumed by an immediate descendant.
vn | is the given Varnode |
maxByte | will hold the index of the maximum byte |
minByte | will hold the index of the minimum byte |
References ghidra::Varnode::beginDescend(), ghidra::PcodeOp::code(), ghidra::CPUI_SUBPIECE, ghidra::Varnode::endDescend(), ghidra::PcodeOp::getIn(), ghidra::Varnode::getOffset(), ghidra::PcodeOp::getOut(), and ghidra::Varnode::getSize().
Referenced by ghidra::RulePullsubIndirect::applyOp().
|
static |
Replace given Varnode with (smaller) newVn in all descendants
If minMaxUse() indicates not all bytes are used, this should always succeed
origVn | is the given Varnode |
newVn | is the new Varnode to replace with |
maxByte | is the maximum byte immediately used in origVn |
minByte | is the minimum byte immediately used in origVn |
data | is the function being analyzed |
References ghidra::Varnode::beginDescend(), ghidra::PcodeOp::code(), ghidra::CPUI_COPY, ghidra::CPUI_SUBPIECE, ghidra::Varnode::endDescend(), ghidra::PcodeOp::getIn(), ghidra::Varnode::getOffset(), ghidra::PcodeOp::getOut(), ghidra::Varnode::getSize(), ghidra::Funcdata::newConstant(), ghidra::Funcdata::opRemoveInput(), ghidra::Funcdata::opSetInput(), and ghidra::Funcdata::opSetOpcode().
Referenced by ghidra::RulePullsubIndirect::applyOp().