From: Ted Kremenek Date: Wed, 5 Sep 2007 20:02:05 +0000 (+0000) Subject: Moved tracking of CFG block IDs into the CFG class. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9438252ad2ecae5338df565ca33c6969e4fbfa41;p=clang Moved tracking of CFG block IDs into the CFG class. Added CFG::getNumBlockIDs() to query the number of distinct block ids created. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41724 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/AST/CFG.cpp b/AST/CFG.cpp index 463b44f387..93ee6f449d 100644 --- a/AST/CFG.cpp +++ b/AST/CFG.cpp @@ -63,7 +63,6 @@ class CFGBuilder : public StmtVisitor { CFGBlock* ContinueTargetBlock; CFGBlock* BreakTargetBlock; CFGBlock* SwitchTerminatedBlock; - unsigned NumBlocks; // LabelMap records the mapping from Label expressions to their blocks. typedef llvm::DenseMap LabelMapTy; @@ -81,8 +80,7 @@ class CFGBuilder : public StmtVisitor { 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(); diff --git a/include/clang/AST/CFG.h b/include/clang/AST/CFG.h index 591668411b..52cb54ddc5 100644 --- a/include/clang/AST/CFG.h +++ b/include/clang/AST/CFG.h @@ -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;