decompiler
1.0.0
|
Simplify expressions involving three-way comparisons. More...
Public Member Functions | |
RuleThreeWayCompare (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 PcodeOp * | detectThreeWay (PcodeOp *op, bool &isPartial) |
Detect a three-way calculation. More... | |
static int4 | testCompareEquivalence (PcodeOp *lessop, PcodeOp *lessequalop) |
Make sure comparisons match properly for a three-way. 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... | |
Simplify expressions involving three-way comparisons.
A three-way comparison is the expression
X = zext( V < W ) + ZEXT( V <= W ) - 1
in some permutationThis gives the result (-1, 0, or 1) depending on whether V is less-than, equal, or greater-than W. This Rule looks for secondary comparisons of the three-way, such as
X < 1
which simplifies toV <= W
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_FLOAT_EQUAL, ghidra::CPUI_FLOAT_LESS, ghidra::CPUI_FLOAT_NOTEQUAL, ghidra::CPUI_INT_ADD, ghidra::CPUI_INT_EQUAL, ghidra::CPUI_INT_NOTEQUAL, ghidra::CPUI_INT_SLESSEQUAL, ghidra::Varnode::getDef(), ghidra::PcodeOp::getIn(), ghidra::Varnode::getOffset(), ghidra::Varnode::getSize(), ghidra::Varnode::isConstant(), ghidra::Varnode::isFree(), ghidra::Varnode::isWritten(), ghidra::Funcdata::newConstant(), ghidra::Funcdata::opSetInput(), and ghidra::Funcdata::opSetOpcode().
|
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(), and ghidra::AddTreeState::data.
Detect a three-way calculation.
A three-way expression looks like:
zext( V < W ) + zext( V <= W ) - 1
in some permutationThe comparisons can signed, unsigned, or floating-point.
op | is the putative root INT_ADD of the calculation |
isPartial | is set to true if a partial form is detected |
References ghidra::calc_mask(), ghidra::PcodeOp::code(), ghidra::CPUI_FLOAT_LESS, ghidra::CPUI_INT_ADD, ghidra::CPUI_INT_LESS, ghidra::CPUI_INT_SLESS, ghidra::CPUI_INT_ZEXT, ghidra::Varnode::getDef(), ghidra::PcodeOp::getIn(), ghidra::Varnode::getOffset(), ghidra::Varnode::getSize(), ghidra::Varnode::isConstant(), and ghidra::Varnode::isWritten().
|
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_INT_EQUAL, ghidra::CPUI_INT_NOTEQUAL, ghidra::CPUI_INT_SLESS, and ghidra::CPUI_INT_SLESSEQUAL.
|
static |
Make sure comparisons match properly for a three-way.
Given zext(V < W) + zext(X <= Y)
, make sure comparisons match, i.e V matches X and W matches Y. Take into account that the LESSEQUAL may have been converted to a LESS. Return:
References ghidra::PcodeOp::code(), ghidra::CPUI_FLOAT_LESS, ghidra::CPUI_FLOAT_LESSEQUAL, ghidra::CPUI_INT_LESS, ghidra::CPUI_INT_LESSEQUAL, ghidra::CPUI_INT_SLESS, ghidra::CPUI_INT_SLESSEQUAL, ghidra::PcodeOp::getIn(), ghidra::Varnode::getOffset(), and ghidra::Varnode::isConstant().