diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-07-17 18:20:32 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-07-17 18:20:32 +0000 |
commit | 3fc8ef574cdc09c613c329ee511852d219263c15 (patch) | |
tree | 8d97ba71fabf4b07721af062b6d031263f51a7e3 | |
parent | f34bb2eaa87aa28bcc8b6ff0dfc696cd75605b11 (diff) |
Move WalkAST logic for 'ChooseExpr' to 'VisitChooseExpr'.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@76205 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Analysis/CFG.cpp | 69 |
1 files changed, 35 insertions, 34 deletions
diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index 1698048bb7..620a691752 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -99,14 +99,15 @@ public: // Visitors to walk an AST and construct the CFG. Called by buildCFG. Do not // call directly! - CFGBlock* VisitBreakStmt(BreakStmt* B); - CFGBlock* VisitCaseStmt(CaseStmt* Terminator); - CFGBlock* VisitCompoundStmt(CompoundStmt* C); - CFGBlock* VisitConditionalOperator(ConditionalOperator *C); - CFGBlock* VisitContinueStmt(ContinueStmt* C); - CFGBlock* VisitDefaultStmt(DefaultStmt* D); - CFGBlock* VisitDoStmt(DoStmt* D); - CFGBlock* VisitForStmt(ForStmt* F); + CFGBlock *VisitBreakStmt(BreakStmt* B); + CFGBlock *VisitCaseStmt(CaseStmt* Terminator); + CFGBlock *VisitChooseExpr(ChooseExpr *C); + CFGBlock *VisitCompoundStmt(CompoundStmt *C); + CFGBlock *VisitConditionalOperator(ConditionalOperator *C); + CFGBlock *VisitContinueStmt(ContinueStmt *C); + CFGBlock *VisitDefaultStmt(DefaultStmt *D); + CFGBlock *VisitDoStmt(DoStmt *D); + CFGBlock *VisitForStmt(ForStmt *F); CFGBlock* VisitGotoStmt(GotoStmt* G); CFGBlock* VisitIfStmt(IfStmt* I); CFGBlock* VisitIndirectGotoStmt(IndirectGotoStmt* I); @@ -284,32 +285,8 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* Terminator, bool AlwaysAddStmt) { case Stmt::ConditionalOperatorClass: return VisitConditionalOperator(cast<ConditionalOperator>(Terminator)); - case Stmt::ChooseExprClass: { - ChooseExpr* C = cast<ChooseExpr>(Terminator); - - CFGBlock* ConfluenceBlock = Block ? Block : createBlock(); - ConfluenceBlock->appendStmt(C); - if (!FinishBlock(ConfluenceBlock)) - return 0; - - Succ = ConfluenceBlock; - Block = NULL; - CFGBlock* LHSBlock = Visit(C->getLHS()); - if (!FinishBlock(LHSBlock)) - return 0; - - Succ = ConfluenceBlock; - Block = NULL; - CFGBlock* RHSBlock = Visit(C->getRHS()); - if (!FinishBlock(RHSBlock)) - return 0; - - Block = createBlock(false); - Block->addSuccessor(LHSBlock); - Block->addSuccessor(RHSBlock); - Block->setTerminator(C); - return addStmt(C->getCond()); - } + case Stmt::ChooseExprClass: + return VisitChooseExpr(cast<ChooseExpr>(Terminator)); case Stmt::DeclStmtClass: { DeclStmt *DS = cast<DeclStmt>(Terminator); @@ -518,6 +495,30 @@ CFGBlock* CFGBuilder::VisitNullStmt(NullStmt* Statement) { return Block; } +CFGBlock *CFGBuilder::VisitChooseExpr(ChooseExpr *C) { + CFGBlock* ConfluenceBlock = Block ? Block : createBlock(); + ConfluenceBlock->appendStmt(C); + if (!FinishBlock(ConfluenceBlock)) + return 0; + + Succ = ConfluenceBlock; + Block = NULL; + CFGBlock* LHSBlock = Visit(C->getLHS()); + if (!FinishBlock(LHSBlock)) + return 0; + + Succ = ConfluenceBlock; + Block = NULL; + CFGBlock* RHSBlock = Visit(C->getRHS()); + if (!FinishBlock(RHSBlock)) + return 0; + + Block = createBlock(false); + Block->addSuccessor(LHSBlock); + Block->addSuccessor(RHSBlock); + Block->setTerminator(C); + return addStmt(C->getCond()); +} CFGBlock *CFGBuilder::VisitConditionalOperator(ConditionalOperator *C) { // Create the confluence block that will "merge" the results of the ternary |