static bool addBranchBlock(Blocks &blocks, Block &block, const Instruction &branchDestination, Block *&branchBlock, BlockEdgeType type) { /* Prepare to follow one branch of the path. Returns true if this is a completely new path we haven't handled yet. branchBlock will be filled with the block for the branch. */ bool needAdd = false; // See if we have already handled this branch. If not, create a new block for it. branchBlock = const_cast<Block *>(branchDestination.block); if (!branchBlock) { blocks.push_back(Block(branchDestination.address)); branchBlock = &blocks.back(); needAdd = true; } // Link the branch with its parent branchBlock->parents.push_back(&block); block.children.push_back(branchBlock); block.childrenTypes.push_back(type); return needAdd; }
void constructBlocks(Blocks &blocks, Instructions &instructions) { /* Create the first block containing the very first instruction in this script. * Then follow the complete code flow from this instruction onwards. */ assert(blocks.empty()); if (instructions.empty()) return; blocks.push_back(Block(instructions.front().address)); constructBlocks(blocks, blocks.back(), instructions.front()); }