decompiler
1.0.0
|
Class for splitting up Varnodes that hold 2 logical variables. More...
#include <subflow.hh>
Public Member Functions | |
SplitFlow (Funcdata *f, Varnode *root, int4 lowSize) | |
Constructor. | |
bool | doTrace (void) |
Trace split through data-flow, constructing transform. More... | |
Public Member Functions inherited from TransformManager | |
TransformManager (Funcdata *f) | |
Constructor. | |
virtual | ~TransformManager (void) |
Destructor. | |
virtual bool | preserveAddress (Varnode *vn, int4 bitSize, int4 lsbOffset) const |
Should the address of the given Varnode be preserved when constructing a piece. More... | |
Funcdata * | getFunction (void) const |
Get function being transformed. | |
void | clearVarnodeMarks (void) |
Clear mark for all Varnodes in the map. | |
TransformVar * | newPreexistingVarnode (Varnode *vn) |
Make placeholder for preexisting Varnode. More... | |
TransformVar * | newUnique (int4 size) |
Make placeholder for new unique space Varnode. More... | |
TransformVar * | newConstant (int4 size, int4 lsbOffset, uintb val) |
Make placeholder for constant Varnode. More... | |
TransformVar * | newIop (Varnode *vn) |
Make placeholder for special iop constant. More... | |
TransformVar * | newPiece (Varnode *vn, int4 bitSize, int4 lsbOffset) |
Make placeholder for piece of a Varnode. More... | |
TransformVar * | newSplit (Varnode *vn, const LaneDescription &description) |
Create placeholder nodes splitting a Varnode into its lanes. More... | |
TransformVar * | newSplit (Varnode *vn, const LaneDescription &description, int4 numLanes, int4 startLane) |
Create placeholder nodes splitting a Varnode into a subset of lanes in the given description. More... | |
TransformOp * | newOpReplace (int4 numParams, OpCode opc, PcodeOp *replace) |
Create a new placeholder op intended to replace an existing op. More... | |
TransformOp * | newOp (int4 numParams, OpCode opc, TransformOp *follow) |
Create a new placeholder op that will not replace an existing op. More... | |
TransformOp * | newPreexistingOp (int4 numParams, OpCode opc, PcodeOp *originalOp) |
Create a new placeholder op for an existing PcodeOp. More... | |
TransformVar * | getPreexistingVarnode (Varnode *vn) |
Get (or create) placeholder for preexisting Varnode. More... | |
TransformVar * | getPiece (Varnode *vn, int4 bitSize, int4 lsbOffset) |
Get (or create) placeholder piece. More... | |
TransformVar * | getSplit (Varnode *vn, const LaneDescription &description) |
Find (or create) placeholder nodes splitting a Varnode into its lanes. More... | |
TransformVar * | getSplit (Varnode *vn, const LaneDescription &description, int4 numLanes, int4 startLane) |
Find (or create) placeholder nodes splitting a Varnode into a subset of lanes from a description. More... | |
void | opSetInput (TransformOp *rop, TransformVar *rvn, int4 slot) |
Mark given variable as input to given op. More... | |
void | opSetOutput (TransformOp *rop, TransformVar *rvn) |
Mark given variable as output of given op. More... | |
void | apply (void) |
Apply the full transform to the function. | |
Private Member Functions | |
TransformVar * | setReplacement (Varnode *vn) |
Find or build the placeholder objects for a Varnode that needs to be split. More... | |
bool | addOp (PcodeOp *op, TransformVar *rvn, int4 slot) |
Split given op into its lanes. More... | |
bool | traceForward (TransformVar *rvn) |
Try to trace the pair of logical values, forward, through ops that read them. More... | |
bool | traceBackward (TransformVar *rvn) |
Try to trace the pair of logical values, backward, through the defining op. More... | |
bool | processNextWork (void) |
Process the next logical value on the worklist. More... | |
Private Attributes | |
LaneDescription | laneDescription |
Description of how to split Varnodes. | |
vector< TransformVar * > | worklist |
Pending work list of Varnodes to push the split through. | |
Additional Inherited Members | |
Static Public Member Functions inherited from TransformManager | |
static bool | preexistingGuard (int4 slot, TransformVar *rvn) |
Should newPreexistingOp be called. More... | |
Class for splitting up Varnodes that hold 2 logical variables.
Starting from a root Varnode provided to the constructor, this class looks for data-flow that consistently holds 2 logical values in a single Varnode. If doTrace() returns true, a consistent view has been created and invoking apply() will split all Varnodes and PcodeOps involved in the data-flow into their logical pieces.
|
private |
Split given op into its lanes.
We assume op is a logical operation, or a COPY, or an INDIRECT. It must have an output. All inputs and output have their placeholders generated and added to the worklist if appropriate.
op | is the given op |
rvn | is a known parameter of the op |
slot | is the incoming slot of the known parameter (-1 means parameter is output) |
References PcodeOp::code(), CPUI_INDIRECT, TransformVar::getDef(), PcodeOp::getIn(), PcodeOp::getOut(), PcodeOp::numInput(), and SubvariableFlow::setReplacement().
bool SplitFlow::doTrace | ( | void | ) |
Trace split through data-flow, constructing transform.
Push the logical split around, setting up the explicit transforms as we go. If at any point, the split cannot be naturally pushed, return false.
References TransformManager::clearVarnodeMarks(), processNextWork(), and worklist.
Referenced by RuleSplitFlow::applyOp().
|
private |
Process the next logical value on the worklist.
References SubvariableFlow::traceBackward(), SubvariableFlow::traceForward(), and SubvariableFlow::worklist.
Referenced by doTrace().
|
private |
Find or build the placeholder objects for a Varnode that needs to be split.
Mark the Varnode so it doesn't get revisited. Decide if the Varnode needs to go into the worklist.
vn | is the Varnode that needs to be split |
References Varnode::isConstant(), Varnode::isFree(), Varnode::isInput(), Varnode::isMark(), Varnode::isTypeLock(), Varnode::setMark(), and SubvariableFlow::worklist.
Referenced by SplitFlow(), SubfloatFlow::traceBackward(), and SubfloatFlow::traceForward().
|
private |
Try to trace the pair of logical values, backward, through the defining op.
Create part of transform related to the defining op, and update the worklist as necessary.
rvn | is the logical value to examine |
References PcodeOp::code(), CPUI_COPY, CPUI_INDIRECT, CPUI_INT_AND, CPUI_INT_LEFT, CPUI_INT_OR, CPUI_INT_XOR, CPUI_INT_ZEXT, CPUI_MULTIEQUAL, CPUI_PIECE, Varnode::getDef(), PcodeOp::getIn(), Varnode::getOffset(), TransformVar::getOriginal(), PcodeOp::getOut(), Varnode::getSize(), Varnode::isConstant(), Varnode::isFree(), and Varnode::isWritten().
Referenced by SubfloatFlow::processNextWork().
|
private |
Try to trace the pair of logical values, forward, through ops that read them.
Try to trace pieces of TransformVar pair forward, through reading ops, update worklist
rvn | is the TransformVar pair to trace, as an array |
References Varnode::beginDescend(), PcodeOp::code(), CPUI_COPY, CPUI_INDIRECT, CPUI_INT_AND, CPUI_INT_LEFT, CPUI_INT_OR, CPUI_INT_RIGHT, CPUI_INT_SEXT, CPUI_INT_SRIGHT, CPUI_INT_XOR, CPUI_INT_ZEXT, CPUI_MULTIEQUAL, CPUI_SUBPIECE, Varnode::endDescend(), PcodeOp::getIn(), Varnode::getOffset(), TransformVar::getOriginal(), TransformOp::getOut(), PcodeOp::getOut(), Varnode::getSize(), PcodeOp::getSlot(), Varnode::isConstant(), and Varnode::isMark().
Referenced by SubfloatFlow::processNextWork().