|
decompiler 1.0.0
|
Simplify expressions explicitly using the INSERT p-code op. More...
#include <bitfield.hh>
Public Member Functions | |
| RuleInsertAbsorb (const string &g) | |
| Constructor. | |
| virtual Rule * | clone (const ActionGroupList &grouplist) const |
| Clone the Rule. | |
| virtual void | getOpList (vector< uint4 > &oplist) const |
| List of op codes this rule operates on. | |
| virtual int4 | applyOp (PcodeOp *op, Funcdata &data) |
| Attempt to apply this Rule. | |
Public Member Functions inherited from ghidra::Rule | |
| Rule (const string &g, uint4 fl, const string &nm) | |
| Construct given group, properties name. | |
| 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. | |
| uint4 | getBreakPoint (void) const |
| Return breakpoint toggles. | |
| virtual void | reset (Funcdata &data) |
| Reset this Rule. | |
| virtual void | resetStats (void) |
| Reset Rule statistics. | |
| virtual void | printStatistics (ostream &s) const |
| Print statistics for this Rule. | |
Private Member Functions | |
| int4 | absorbAnd (Funcdata &data, PcodeOp *andOp, PcodeOp *insertOp) |
Perform the transform: INSERT( x & #mask, #p, #n ) => INSERT( x, #p, #n ) | |
| int4 | absorbRightLeft (Funcdata &data, PcodeOp *nextOp, PcodeOp *rightOp, PcodeOp *insertOp) |
Perform the transform: INSERT( (x << #c) >> #c, #p, #n ) => INSERT(x, #p, #n ) | |
| int4 | absorbShiftAdd (Funcdata &data, PcodeOp *rightOp, PcodeOp *addOp, PcodeOp *insertOp) |
Perform the transform: field = (a * #c + b * #c) >> #n => field = a + b | |
| int4 | absorbNestedAnd (Funcdata &data, PcodeOp *baseOp, PcodeOp *insertOp) |
Perform transforms like: INSERT( (x & #0xff) + y ) => INSERT( x + y ) | |
Static Private Member Functions | |
| static Varnode * | leftShiftVarnode (Varnode *vn, int4 sa) |
| Test if a Varnode is left-shifted by the given amount. | |
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 explicitly using the INSERT p-code op.
|
private |
Perform the transform: INSERT( x & #mask, #p, #n ) => INSERT( x, #p, #n )
| data | is the function |
| andOp | is the INT_AND op |
| insertOp | is the INSERT op |
References ghidra::Funcdata::destroyVarnodeRecursive(), ghidra::PcodeOp::getIn(), ghidra::InsertExpression::getLSBMask(), ghidra::Varnode::getOffset(), ghidra::PcodeOp::getOut(), ghidra::Varnode::isConstant(), and ghidra::Funcdata::opSetInput().
Referenced by applyOp().
|
private |
Perform transforms like: INSERT( (x & #0xff) + y ) => INSERT( x + y )
The op feeding the INSERT can be any operation where more significant bits of the input do not affect the less significant bits.
| data | is the function |
| baseOp | is one of INT_ADD, INT_AND, INT_OR, or INT_XOR. |
| insertOp | is the INSERT op |
References ghidra::PcodeOp::code(), ghidra::CPUI_INT_AND, ghidra::Funcdata::destroyVarnodeRecursive(), ghidra::Varnode::getDef(), ghidra::PcodeOp::getIn(), ghidra::Varnode::getOffset(), ghidra::PcodeOp::getOut(), ghidra::Varnode::isConstant(), ghidra::Varnode::isWritten(), ghidra::Varnode::loneDescend(), and ghidra::Funcdata::opSetInput().
Referenced by applyOp().
|
private |
Perform the transform: INSERT( (x << #c) >> #c, #p, #n ) => INSERT(x, #p, #n )
Also transform the variant: INSERT( SUB( x << #c, #0) >> #c, #p, #n ) => INSERT(x, #p, #n)
References ghidra::PcodeOp::code(), ghidra::CPUI_INT_LEFT, ghidra::CPUI_SUBPIECE, ghidra::Funcdata::destroyVarnodeRecursive(), ghidra::Varnode::getDef(), ghidra::PcodeOp::getIn(), ghidra::Varnode::getOffset(), ghidra::PcodeOp::getOut(), ghidra::Varnode::getSize(), ghidra::Varnode::isConstant(), ghidra::Varnode::isWritten(), and ghidra::Funcdata::opSetInput().
Referenced by applyOp().
|
private |
Perform the transform: field = (a * #c + b * #c) >> #n => field = a + b
| data | is the function |
| rightOp | is the INT_RIGHT or INT_SRIGHT op |
| addOp | is the INT_ADD op |
| insertOp | is the INSERT op |
References ghidra::CPUI_INT_ADD, ghidra::Funcdata::destroyVarnodeRecursive(), ghidra::PcodeOp::getIn(), ghidra::Varnode::getOffset(), ghidra::PcodeOp::getOut(), ghidra::Varnode::getSize(), ghidra::Varnode::getType(), ghidra::Varnode::isConstant(), leftShiftVarnode(), ghidra::Funcdata::newConstant(), ghidra::Funcdata::opSetInput(), ghidra::Funcdata::opSetOpcode(), and ghidra::Varnode::updateType().
Referenced by 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 absorbAnd(), absorbNestedAnd(), absorbRightLeft(), absorbShiftAdd(), ghidra::PcodeOp::code(), ghidra::CPUI_INT_ADD, ghidra::CPUI_INT_AND, ghidra::CPUI_INT_LEFT, ghidra::CPUI_INT_MULT, ghidra::CPUI_INT_OR, ghidra::CPUI_INT_RIGHT, ghidra::CPUI_INT_SRIGHT, ghidra::CPUI_INT_XOR, ghidra::CPUI_SUBPIECE, ghidra::Funcdata::destroyVarnodeRecursive(), ghidra::Varnode::getDef(), ghidra::PcodeOp::getIn(), ghidra::Varnode::getOffset(), ghidra::Varnode::isConstant(), ghidra::Varnode::isWritten(), and ghidra::Funcdata::opSetInput().
|
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::Rule::getGroup().
|
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_INSERT.
Test if a Varnode is left-shifted by the given amount.
If the Varnode is shifted, return the Varnode stripped of the shift.
| vn | is the Varnode to test |
| sa | is the given shift amount |
References ghidra::PcodeOp::code(), ghidra::CPUI_INT_LEFT, ghidra::CPUI_INT_MULT, ghidra::Varnode::getDef(), ghidra::PcodeOp::getIn(), ghidra::Varnode::getOffset(), ghidra::Varnode::isConstant(), and ghidra::Varnode::isWritten().
Referenced by absorbShiftAdd().