Ghidra Decompiler Analysis Engine
Public Member Functions | List of all members
SplitFlow Class Reference

Class for splitting up Varnodes that hold 2 logical variables. More...

#include <subflow.hh>

Inheritance diagram for SplitFlow:
Inheritance graph
[legend]
Collaboration diagram for SplitFlow:
Collaboration graph
[legend]

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
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...
 
void clearVarnodeMarks (void)
 Clear mark for all Varnodes in the map.
 
TransformVarnewPreexistingVarnode (Varnode *vn)
 Make placeholder for preexisting Varnode. More...
 
TransformVarnewUnique (int4 size)
 Make placeholder for new unique space Varnode. More...
 
TransformVarnewConstant (int4 size, int4 lsbOffset, uintb val)
 Make placeholder for constant Varnode. More...
 
TransformVarnewIop (Varnode *vn)
 Make placeholder for special iop constant. More...
 
TransformVarnewPiece (Varnode *vn, int4 bitSize, int4 lsbOffset)
 Make placeholder for piece of a Varnode. More...
 
TransformVarnewSplit (Varnode *vn, const LaneDescription &description)
 Create placeholder nodes splitting a Varnode into its lanes. More...
 
TransformVarnewSplit (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...
 
TransformOpnewOpReplace (int4 numParams, OpCode opc, PcodeOp *replace)
 Create a new placeholder op intended to replace an existing op. More...
 
TransformOpnewOp (int4 numParams, OpCode opc, TransformOp *follow)
 Create a new placeholder op that will not replace an existing op. More...
 
TransformOpnewPreexistingOp (int4 numParams, OpCode opc, PcodeOp *originalOp)
 Create a new placeholder op for an existing PcodeOp. More...
 
TransformVargetPreexistingVarnode (Varnode *vn)
 Get (or create) placeholder for preexisting Varnode. More...
 
TransformVargetPiece (Varnode *vn, int4 bitSize, int4 lsbOffset)
 Get (or create) placeholder piece. More...
 
TransformVargetSplit (Varnode *vn, const LaneDescription &description)
 Find (or create) placeholder nodes splitting a Varnode into its lanes. More...
 
TransformVargetSplit (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.
 

Additional Inherited Members

- Static Public Member Functions inherited from TransformManager
static bool preexistingGuard (int4 slot, TransformVar *rvn)
 Should newPreexistingOp be called. More...
 

Detailed Description

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.

Member Function Documentation

◆ doTrace()

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.

Returns
true if a full transform has been constructed that can perform the split

The documentation for this class was generated from the following files: