| 
    Ghidra Decompiler Analysis Engine
    
   | 
 
A series of blocks that execute in sequence. More...
#include <block.hh>


Public Member Functions | |
| virtual block_type | getType (void) const | 
| virtual void | printHeader (ostream &s) const | 
| Print a simple description of this to stream.  More... | |
| virtual void | emit (PrintLanguage *lng) const | 
| Emit the instructions in this FlowBlock as structured code.  More... | |
| virtual const FlowBlock * | getExitLeaf (void) const | 
| virtual PcodeOp * | lastOp (void) const | 
| virtual bool | negateCondition (bool toporbottom) | 
| Flip the condition computed by this.  More... | |
| virtual FlowBlock * | getSplitPoint (void) | 
| Get the leaf splitting block.  More... | |
  Public Member Functions inherited from BlockGraph | |
| void | clear (void) | 
| Clear all component FlowBlock objects.  | |
| virtual FlowBlock * | subBlock (int4 i) const | 
| virtual void | markUnstructured (void) | 
| virtual void | markLabelBumpUp (bool bump) | 
| Let hierarchical blocks steal labels of their (first) components.  More... | |
| virtual void | scopeBreak (int4 curexit, int4 curloopexit) | 
| virtual void | printTree (ostream &s, int4 level) const | 
| Print tree structure of any blocks owned by this.  More... | |
| virtual void | printRaw (ostream &s) const | 
| virtual FlowBlock * | nextFlowAfter (const FlowBlock *bl) const | 
| Get the leaf FlowBlock that will execute after the given FlowBlock.  More... | |
| virtual void | finalTransform (Funcdata &data) | 
| virtual void | finalizePrinting (Funcdata &data) const | 
| virtual void | saveXmlBody (ostream &s) const | 
| virtual void | restoreXmlBody (List::const_iterator &iter, List::const_iterator enditer, BlockMap &resolver) | 
| Restore details about this FlowBlock from an XML stream.  More... | |
| void | restoreXml (const Element *el, const AddrSpaceManager *m) | 
| Restore this BlockGraph from an XML stream.  More... | |
| void | addEdge (FlowBlock *begin, FlowBlock *end) | 
| Add a directed edge between component FlowBlocks.  More... | |
| void | addLoopEdge (FlowBlock *begin, int4 outindex) | 
| Mark a given edge as a loop edge.  More... | |
| void | removeEdge (FlowBlock *begin, FlowBlock *end) | 
| Remove an edge between component FlowBlocks.  More... | |
| void | switchEdge (FlowBlock *in, FlowBlock *outbefore, FlowBlock *outafter) | 
| Move an edge from one out FlowBlock to another.  More... | |
| void | moveOutEdge (FlowBlock *blold, int4 slot, FlowBlock *blnew) | 
| Move indicated out edge to a new FlowBlock.  More... | |
| void | removeBlock (FlowBlock *bl) | 
| Remove a FlowBlock from this BlockGraph.  More... | |
| void | removeFromFlow (FlowBlock *bl) | 
| Remove given FlowBlock preserving flow in this.  More... | |
| void | removeFromFlowSplit (FlowBlock *bl, bool flipflow) | 
| Remove FlowBlock splitting flow between input and output edges.  More... | |
| void | spliceBlock (FlowBlock *bl) | 
| Splice given FlowBlock together with its output.  More... | |
| void | setStartBlock (FlowBlock *bl) | 
| Set the entry point FlowBlock for this graph.  More... | |
| FlowBlock * | getStartBlock (void) const | 
| Get the entry point FlowBlock.  More... | |
| FlowBlock * | newBlock (void) | 
| Build a new plain FlowBlock.  More... | |
| BlockBasic * | newBlockBasic (Funcdata *fd) | 
| Build a new BlockBasic.  More... | |
| BlockCopy * | newBlockCopy (FlowBlock *bl) | 
| Build a new BlockCopy.  More... | |
| BlockGoto * | newBlockGoto (FlowBlock *bl) | 
| Build a new BlockGoto.  More... | |
| BlockMultiGoto * | newBlockMultiGoto (FlowBlock *bl, int4 outedge) | 
| Build a new BlockMultiGoto.  More... | |
| BlockList * | newBlockList (const vector< FlowBlock * > &nodes) | 
| Build a new BlockList.  More... | |
| BlockCondition * | newBlockCondition (FlowBlock *b1, FlowBlock *b2) | 
| Build a new BlockCondition.  More... | |
| BlockIf * | newBlockIfGoto (FlowBlock *cond) | 
| Build a new BlockIfGoto.  More... | |
| BlockIf * | newBlockIf (FlowBlock *cond, FlowBlock *tc) | 
| Build a new BlockIf.  More... | |
| BlockIf * | newBlockIfElse (FlowBlock *cond, FlowBlock *tc, FlowBlock *fc) | 
| Build a new BlockIfElse.  More... | |
| BlockWhileDo * | newBlockWhileDo (FlowBlock *cond, FlowBlock *cl) | 
| Build a new BlockWhileDo.  More... | |
| BlockDoWhile * | newBlockDoWhile (FlowBlock *condcl) | 
| Build a new BlockDoWhile.  More... | |
| BlockInfLoop * | newBlockInfLoop (FlowBlock *body) | 
| Build a new BlockInfLoop.  More... | |
| BlockSwitch * | newBlockSwitch (const vector< FlowBlock * > &cs, bool hasExit) | 
| Build a new BlockSwitch.  More... | |
| void | orderBlocks (void) | 
| void | buildCopy (const BlockGraph &graph) | 
| Build a copy of a BlockGraph.  More... | |
| void | clearVisitCount (void) | 
| Clear the visit count in all node FlowBlocks.  | |
| void | calcForwardDominator (const vector< FlowBlock * > &rootlist) | 
| Calculate forward dominators.  More... | |
| void | buildDomTree (vector< vector< FlowBlock * > > &child) const | 
| Build the dominator tree.  More... | |
| int4 | buildDomDepth (vector< int4 > &depth) const | 
| Calculate dominator depths.  More... | |
| void | buildDomSubTree (vector< FlowBlock * > &res, FlowBlock *root) const | 
| Collect nodes from a dominator sub-tree.  More... | |
| void | calcLoop (void) | 
| Calculate loop edges.  More... | |
| void | collectReachable (vector< FlowBlock * > &res, FlowBlock *bl, bool un) const | 
| Collect reachable/unreachable FlowBlocks from a given start FlowBlock.  More... | |
| void | structureLoops (vector< FlowBlock * > &rootlist) | 
| Label loop edges.  More... | |
  Public Member Functions inherited from FlowBlock | |
| FlowBlock (void) | |
| Construct a block with no edges.  | |
| virtual bool | preferComplement (Funcdata &data) | 
| Rearrange this hierarchy to simplify boolean expressions.  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 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... | |
| 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... | |
Additional Inherited Members | |
  Public Types inherited from FlowBlock | |
| 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... | |
  Static Public Member Functions inherited from FlowBlock | |
| 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... | |
  Protected Member Functions inherited from BlockGraph | |
| void | swapBlocks (int4 i, int4 j) | 
| Swap the positions two component FlowBlocks.  More... | |
  Static Protected Member Functions inherited from BlockGraph | |
| static void | markCopyBlock (FlowBlock *bl, uint4 fl) | 
| Set properties on the first leaf FlowBlock.  More... | |
A series of blocks that execute in sequence.
When structuring control-flow, an instance of this class represents blocks that execute in sequence and fall-thru to each other. In general, the component blocks may not be basic blocks and can have their own sub-structures.
      
  | 
  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 from BlockGraph.
      
  | 
  virtual | 
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 from FlowBlock.
      
  | 
  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 from FlowBlock.
      
  | 
  virtual | 
Print a simple description of this to stream.
Only print a header for this single block
| s | is the output stream | 
Reimplemented from FlowBlock.
 1.8.17