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.
 
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.
 

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: