Ghidra Decompiler Analysis Engine
|
Description of a control-flow block containing PcodeOps. More...
#include <block.hh>
Public Types | |
enum | block_type { t_plain, t_basic, t_graph, t_copy, t_goto, t_multigoto, t_ls, t_condition, t_if, t_whiledo, t_dowhile, t_switch, t_infloop } |
The possible block types. | |
enum | block_flags { f_goto_goto = 1, f_break_goto = 2, f_continue_goto = 4, f_switch_out = 0x10, f_unstructured_targ = 0x20, f_mark = 0x80, f_mark2 = 0x100, f_entry_point = 0x200, f_interior_gotoout = 0x400, f_interior_gotoin = 0x800, f_label_bumpup = 0x1000, f_donothing_loop = 0x2000, f_dead = 0x4000, f_whiledo_overflow = 0x8000, f_flip_path = 0x10000, f_joined_block = 0x20000, f_duplicate_block = 0x40000 } |
Boolean properties of blocks. More... | |
enum | edge_flags { f_goto_edge = 1, f_loop_edge = 2, f_defaultswitch_edge = 4, f_irreducible = 8, f_tree_edge = 0x10, f_forward_edge = 0x20, f_cross_edge = 0x40, f_back_edge = 0x80, f_loop_exit_edge = 0x100 } |
Boolean properties on edges. More... | |
Public Member Functions | |
FlowBlock (void) | |
Construct a block with no edges. | |
virtual void | markLabelBumpUp (bool bump) |
Let hierarchical blocks steal labels of their (first) components. More... | |
virtual void | printHeader (ostream &s) const |
Print a simple description of this to stream. More... | |
virtual void | printTree (ostream &s, int4 level) const |
Print tree structure of any blocks owned by this. More... | |
virtual void | emit (PrintLanguage *lng) const |
Emit the instructions in this FlowBlock as structured code. More... | |
virtual bool | negateCondition (bool toporbottom) |
Flip the condition computed by this. More... | |
virtual bool | preferComplement (Funcdata &data) |
Rearrange this hierarchy to simplify boolean expressions. More... | |
virtual FlowBlock * | getSplitPoint (void) |
Get the leaf splitting block. More... | |
virtual int4 | flipInPlaceTest (vector< PcodeOp * > &fliplist) const |
Test normalizing the conditional branch in this. More... | |
virtual void | flipInPlaceExecute (void) |
Perform the flip to normalize conditional branch executed by this block. More... | |
virtual FlowBlock * | nextFlowAfter (const FlowBlock *bl) const |
Get the leaf FlowBlock that will execute after the given FlowBlock. More... | |
virtual void | saveXmlHeader (ostream &s) const |
Save basic information as XML attributes. More... | |
virtual void | restoreXmlHeader (const Element *el) |
Restore basic information for XML attributes. More... | |
virtual void | restoreXmlBody (List::const_iterator &iter, List::const_iterator enditer, BlockMap &resolver) |
Restore details about this FlowBlock from an XML stream. More... | |
void | saveXmlEdges (ostream &s) const |
Save edge information to an XML stream. More... | |
void | restoreXmlEdges (List::const_iterator &iter, List::const_iterator enditer, BlockMap &resolver) |
Restore edges from an XML stream. More... | |
void | saveXml (ostream &s) const |
Write out this to an XML stream. More... | |
void | restoreXml (const Element *el, BlockMap &resolver) |
Restore this from an XML stream. More... | |
const FlowBlock * | nextInFlow (void) const |
Return next block to be executed in flow. More... | |
void | setGotoBranch (int4 i) |
Mark a goto branch. More... | |
bool | isJumpTarget (void) const |
Return true if non-fallthru jump flows into this. More... | |
const FlowBlock * | getFrontLeaf (void) const |
Get the first leaf FlowBlock. More... | |
FlowBlock * | getFrontLeaf (void) |
Get the first leaf FlowBlock. More... | |
int4 | calcDepth (const FlowBlock *leaf) const |
Get the depth of the given component FlowBlock. More... | |
bool | dominates (const FlowBlock *subBlock) const |
Does this block dominate the given block. More... | |
bool | restrictedByConditional (const FlowBlock *cond) const |
Check if the condition from the given block holds for this block. More... | |
bool | hasLoopIn (void) const |
Is there a looping edge coming into this block. More... | |
bool | hasLoopOut (void) const |
Is there a looping edge going out of this block. More... | |
int4 | getInIndex (const FlowBlock *bl) const |
Get the incoming edge index for the given FlowBlock. More... | |
int4 | getOutIndex (const FlowBlock *bl) const |
Get the outgoing edge index for the given FlowBlock. More... | |
bool | isDecisionOut (int4 i) const |
Can this and the i-th output be merged into a BlockIf or BlockList. | |
bool | isDecisionIn (int4 i) const |
Can this and the i-th input be merged into a BlockIf or BlockList. | |
bool | isLoopDAGOut (int4 i) const |
Is the i-th outgoing edge part of the DAG sub-graph. | |
bool | isLoopDAGIn (int4 i) const |
Is the i-th incoming edge part of the DAG sub-graph. | |
JumpTable * | getJumptable (void) const |
Get the JumpTable associated this block. More... | |
Static Public Member Functions | |
static block_type | nameToType (const string &name) |
Get the block_type associated with a name string. More... | |
static string | typeToName (block_type bt) |
Get the name string associated with a block_type. More... | |
static bool | compareBlockIndex (const FlowBlock *bl1, const FlowBlock *bl2) |
Compare FlowBlock by index. More... | |
static bool | compareFinalOrder (const FlowBlock *bl1, const FlowBlock *bl2) |
Final FlowBlock comparison. More... | |
static FlowBlock * | findCommonBlock (FlowBlock *bl1, FlowBlock *bl2) |
Find the common dominator of two FlowBlocks. More... | |
static FlowBlock * | findCommonBlock (const vector< FlowBlock * > &blockSet) |
Find common dominator of multiple FlowBlocks. More... | |
Friends | |
class | BlockGraph |
Description of a control-flow block containing PcodeOps.
This is the base class for basic blocks (BlockBasic) and the hierarchical description of structured code. At all levels, these can be viewed as a block of code (PcodeOp objects) with other blocks flowing into and out of it.
Boolean properties of blocks.
The first four flags describe attributes of the blocks primary exiting edges The f_interior_* flags do not necessarily apply to these edges. They are used with the block structure and hierarchy algorithms where unstructured jumps are removed from the list of primary edges. These flags keep track only of the existence of unstructured edges, even though they aren't listed
Boolean properties on edges.
int4 FlowBlock::calcDepth | ( | const FlowBlock * | leaf | ) | const |
bool FlowBlock::dominates | ( | const FlowBlock * | subBlock | ) | const |
Does this block dominate the given block.
Return true if this block dominates the given block (or is equal to it). This assumes that block indices have been set with a reverse post order so that having a smaller index is a necessary condition for dominance.
subBlock | is the given block to test against this for dominance |
|
inlinevirtual |
Emit the instructions in this FlowBlock as structured code.
This is the main entry point, at the control-flow level, for printing structured code.
lng | is the PrintLanguage that provides details of the high-level language being printed |
Reimplemented in BlockSwitch, BlockInfLoop, BlockDoWhile, BlockWhileDo, BlockIf, BlockCondition, BlockList, BlockMultiGoto, BlockGoto, BlockCopy, BlockBasic, and BlockGraph.
Find the common dominator of two FlowBlocks.
Within the dominator tree, find the earliest common ancestor of two FlowBlocks
bl1 | is the first FlowBlock |
bl2 | is the second |
|
inlinevirtual |
Perform the flip to normalize conditional branch executed by this block.
This reverses the outgoing edge order in the right basic blocks, but does not modify the instructions directly.
Reimplemented in BlockCondition, and BlockBasic.
|
inlinevirtual |
Test normalizing the conditional branch in this.
Find the set of PcodeOp objects that need to be adjusted to flip the condition this FlowBlock calculates.
Return:
fliplist | will contain the PcodeOps that need to be adjusted |
Reimplemented in BlockCondition, and BlockBasic.
FlowBlock * FlowBlock::getFrontLeaf | ( | void | ) |
const FlowBlock * FlowBlock::getFrontLeaf | ( | void | ) | const |
int4 FlowBlock::getInIndex | ( | const FlowBlock * | bl | ) | const |
JumpTable * FlowBlock::getJumptable | ( | void | ) | const |
int4 FlowBlock::getOutIndex | ( | const FlowBlock * | bl | ) | const |
|
inlinevirtual |
Get the leaf splitting block.
If this block ends with a conditional branch, return the deepest component block that performs the split. This component needs to be able to perform flipInPlaceTest() and flipInPlaceExecute()
Reimplemented in BlockCondition, BlockList, BlockCopy, and BlockBasic.
bool FlowBlock::hasLoopIn | ( | void | ) | const |
Is there a looping edge coming into this block.
bool FlowBlock::hasLoopOut | ( | void | ) | const |
Is there a looping edge going out of this block.
bool FlowBlock::isJumpTarget | ( | void | ) | const |
Return true if non-fallthru jump flows into this.
return true if block is the target of a jump
|
virtual |
Let hierarchical blocks steal labels of their (first) components.
bump | if true, mark that labels for this block are printed by somebody higher in hierarchy |
Reimplemented in BlockInfLoop, BlockDoWhile, BlockWhileDo, and BlockGraph.
|
static |
Get the block_type associated with a name string.
Given a string describing a FlowBlock type, return the block_type. This is currently only used by the restoreXml() process. TODO: Fill in the remaining names and types
nm | is the name string |
|
virtual |
Flip the condition computed by this.
Flip the order of outgoing edges (at least). This should also affect the original op causing the condition. Note: we don't have to flip at all levels of the hierarchy only at the top and at the bottom
toporbottom | is true if this is the top outermost block of the hierarchy getting negated |
Reimplemented in BlockCondition, BlockList, BlockCopy, and BlockBasic.
Get the leaf FlowBlock that will execute after the given FlowBlock.
Within the hierarchy of this FlowBlock, assume the given FlowBlock will fall-thru in its execution at some point. Return the first leaf block (BlockBasic or BlockCopy) that will execute after the given FlowBlock completes, assuming this is a unique block.
bl | is the given FlowBlock |
Reimplemented in BlockSwitch, BlockInfLoop, BlockDoWhile, BlockWhileDo, BlockIf, BlockCondition, BlockMultiGoto, BlockGoto, and BlockGraph.
const FlowBlock * FlowBlock::nextInFlow | ( | void | ) | const |
Return next block to be executed in flow.
If there are two branches, pick the fall-thru branch
|
inlinevirtual |
Rearrange this hierarchy to simplify boolean expressions.
For the instructions in this block, decide if the control-flow structure can be rearranged so that boolean expressions come out more naturally.
data | is the function to analyze |
Reimplemented in BlockIf.
|
virtual |
Print a simple description of this to stream.
Only print a header for this single block
s | is the output stream |
Reimplemented in BlockSwitch, BlockInfLoop, BlockDoWhile, BlockWhileDo, BlockIf, BlockCondition, BlockList, BlockMultiGoto, BlockGoto, BlockCopy, and BlockBasic.
|
virtual |
Print tree structure of any blocks owned by this.
Recursively print out the hierarchical structure of this FlowBlock.
s | is the output stream |
level | is the current level of indentation |
Reimplemented in BlockCopy, and BlockGraph.
Restore this from an XML stream.
Recover this and all it sub-components from an XML <block> tag.
This will construct all the sub-components using resolver as a factory.
el | is the root XML element |
resolver | acts as a factory and resolves cross-references |
|
inlinevirtual |
Restore details about this FlowBlock from an XML stream.
iter | is an iterator to XML elements containing component tags etc. |
enditer | marks the end of the XML tags |
resolver | is used to recover FlowBlock objects based on XML references |
Reimplemented in BlockBasic, and BlockGraph.
void FlowBlock::restoreXmlEdges | ( | List::const_iterator & | iter, |
List::const_iterator | enditer, | ||
BlockMap & | resolver | ||
) |
Restore edges from an XML stream.
iter | is an iterator to the <edge> tags |
enditer | marks the end of the list of tags |
resolver | is used to recover FlowBlock cross-references |
|
virtual |
Restore basic information for XML attributes.
el | is the XML element to pull attributes from |
bool FlowBlock::restrictedByConditional | ( | const FlowBlock * | cond | ) | const |
Check if the condition from the given block holds for this block.
We assume the given block has 2 out-edges and that this block is immediately reached by one of these two edges. Some condition holds when traversing the out-edge to this, and the complement of the condition holds for traversing the other out-edge. We verify that the condition holds for this entire block. More specifically, we check that that there is no path to this through the sibling edge, where the complement of the condition holds (unless we loop back through the conditional block).
cond | is the conditional block with 2 out-edges |
void FlowBlock::saveXml | ( | ostream & | s | ) | const |
Write out this to an XML stream.
Serialize this and all its sub-components as an XML <block> tag.
s | is the output stream |
void FlowBlock::saveXmlEdges | ( | ostream & | s | ) | const |
Save edge information to an XML stream.
Write <edge> tags to stream
s | is the output stream |
|
virtual |
Save basic information as XML attributes.
s | is the output stream |
Reimplemented in BlockCondition, and BlockCopy.
void FlowBlock::setGotoBranch | ( | int4 | i | ) |
Mark a goto branch.
This is the main entry point for marking a branch from one block to another as unstructured.
i | is the index of the outgoing edge to mark |
|
static |
Get the name string associated with a block_type.
For use in serializng FlowBlocks to XML.
bt | is the block_type |