diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-09-06 07:04:06 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-09-06 07:04:06 +0000 |
commit | 1b3b7cb15cbd02b7283bbf3ce7c0e9b0da30ef9d (patch) | |
tree | e7c75f5497cc9e2d29f3cb204d27e9b165b0c87c /lib/Analysis | |
parent | 79e9e9dd533de9609ef141449bf50e705fa68fd0 (diff) |
Simplify CFG construction: bail out early when we have a bad CFG.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113148 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/CFG.cpp | 68 |
1 files changed, 32 insertions, 36 deletions
diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index c97b9165bc..56dbf34748 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -272,58 +272,54 @@ CFG* CFGBuilder::buildCFG(const Decl *D, Stmt* Statement, ASTContext* C, Block = NULL; // the EXIT block is empty. Create all other blocks lazily. // Visit the statements and create the CFG. - CFGBlock* B = addStmt(Statement); + CFGBlock *B = addStmt(Statement); + + if (badCFG) + return NULL; + + if (B) + Succ = B; if (const CXXConstructorDecl *CD = dyn_cast_or_null<CXXConstructorDecl>(D)) { // FIXME: Add code for base initializers and member initializers. (void)CD; } - if (!B) - B = Succ; - if (B) { - // Finalize the last constructed block. This usually involves reversing the - // order of the statements in the block. - if (Block) FinishBlock(B); + // Backpatch the gotos whose label -> block mappings we didn't know when we + // encountered them. + for (BackpatchBlocksTy::iterator I = BackpatchBlocks.begin(), + E = BackpatchBlocks.end(); I != E; ++I ) { - // Backpatch the gotos whose label -> block mappings we didn't know when we - // encountered them. - for (BackpatchBlocksTy::iterator I = BackpatchBlocks.begin(), - E = BackpatchBlocks.end(); I != E; ++I ) { + CFGBlock* B = *I; + GotoStmt* G = cast<GotoStmt>(B->getTerminator()); + LabelMapTy::iterator LI = LabelMap.find(G->getLabel()); - CFGBlock* B = *I; - GotoStmt* G = cast<GotoStmt>(B->getTerminator()); - LabelMapTy::iterator LI = LabelMap.find(G->getLabel()); + // If there is no target for the goto, then we are looking at an + // incomplete AST. Handle this by not registering a successor. + if (LI == LabelMap.end()) continue; - // If there is no target for the goto, then we are looking at an - // incomplete AST. Handle this by not registering a successor. - if (LI == LabelMap.end()) continue; + AddSuccessor(B, LI->second); + } + // Add successors to the Indirect Goto Dispatch block (if we have one). + if (CFGBlock* B = cfg->getIndirectGotoBlock()) + for (LabelSetTy::iterator I = AddressTakenLabels.begin(), + E = AddressTakenLabels.end(); I != E; ++I ) { + + // Lookup the target block. + LabelMapTy::iterator LI = LabelMap.find(*I); + + // If there is no target block that contains label, then we are looking + // at an incomplete AST. Handle this by not registering a successor. + if (LI == LabelMap.end()) continue; + AddSuccessor(B, LI->second); } - // Add successors to the Indirect Goto Dispatch block (if we have one). - if (CFGBlock* B = cfg->getIndirectGotoBlock()) - for (LabelSetTy::iterator I = AddressTakenLabels.begin(), - E = AddressTakenLabels.end(); I != E; ++I ) { - - // Lookup the target block. - LabelMapTy::iterator LI = LabelMap.find(*I); - - // If there is no target block that contains label, then we are looking - // at an incomplete AST. Handle this by not registering a successor. - if (LI == LabelMap.end()) continue; - - AddSuccessor(B, LI->second); - } - - Succ = B; - } - // Create an empty entry block that has no predecessors. cfg->setEntry(createBlock()); - return badCFG ? NULL : cfg.take(); + return cfg.take(); } /// createBlock - Used to lazily create blocks that are connected |