Moved tracking of CFG block IDs into the CFG class.

Added CFG::getNumBlockIDs() to query the number of distinct block ids created.

llvm-svn: 41724
This commit is contained in:
Ted Kremenek 2007-09-05 20:02:05 +00:00
parent 7db004df78
commit 813dd67a34
2 changed files with 9 additions and 8 deletions

View File

@ -63,7 +63,6 @@ class CFGBuilder : public StmtVisitor<CFGBuilder,CFGBlock*> {
CFGBlock* ContinueTargetBlock;
CFGBlock* BreakTargetBlock;
CFGBlock* SwitchTerminatedBlock;
unsigned NumBlocks;
// LabelMap records the mapping from Label expressions to their blocks.
typedef llvm::DenseMap<LabelStmt*,CFGBlock*> LabelMapTy;
@ -81,8 +80,7 @@ class CFGBuilder : public StmtVisitor<CFGBuilder,CFGBlock*> {
public:
explicit CFGBuilder() : cfg(NULL), Block(NULL), Succ(NULL),
ContinueTargetBlock(NULL), BreakTargetBlock(NULL),
SwitchTerminatedBlock(NULL),
NumBlocks(0) {
SwitchTerminatedBlock(NULL) {
// Create an empty CFG.
cfg = new CFG();
}
@ -194,7 +192,7 @@ CFG* CFGBuilder::buildCFG(Stmt* Statement) {
/// createBlock - Used to lazily create blocks that are connected
/// to the current (global) succcessor.
CFGBlock* CFGBuilder::createBlock(bool add_successor) {
CFGBlock* B = cfg->createBlock(NumBlocks++);
CFGBlock* B = cfg->createBlock();
if (add_successor && Succ) B->addSuccessor(Succ);
return B;
}
@ -894,11 +892,11 @@ CFGBlock* CFGBuilder::VisitIndirectGotoStmt(IndirectGotoStmt* I) {
/// block has no successors or predecessors. If this is the first block
/// created in the CFG, it is automatically set to be the Entry and Exit
/// of the CFG.
CFGBlock* CFG::createBlock(unsigned blockID) {
CFGBlock* CFG::createBlock() {
bool first_block = begin() == end();
// Create the block.
Blocks.push_front(CFGBlock(blockID));
Blocks.push_front(CFGBlock(NumBlockIDs++));
// If this is the first block, set it as the Entry and Exit.
if (first_block) Entry = Exit = &front();

View File

@ -179,9 +179,10 @@ class CFG {
CFGBlock* IndirectGotoBlock; // Special block to contain collective dispatch
// for indirect gotos
CFGBlockListTy Blocks;
unsigned NumBlockIDs;
public:
CFG() : Entry(NULL), Exit(NULL), IndirectGotoBlock(NULL) {};
CFG() : Entry(NULL), Exit(NULL), IndirectGotoBlock(NULL), NumBlockIDs(0) {};
~CFG() {};
// Block iterators
@ -213,7 +214,9 @@ public:
// Utility
CFGBlock* createBlock(unsigned blockID);
CFGBlock* createBlock();
unsigned getNumBlockIDs() const { return NumBlockIDs; }
static CFG* buildCFG(Stmt* AST);
void viewCFG() const;
void print(std::ostream& OS) const;