diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-04-16 17:07:59 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-04-16 17:07:59 +0000 |
commit | ed30e8da560a34f5d6c52f9a86e7478c841f853c (patch) | |
tree | 6c74e57330106ca604fa024ec62c376131e4ab71 /clang | |
parent | 2e4d0ecaa3bbcdf14b9755914772737265f782e9 (diff) | |
download | bcm5719-llvm-ed30e8da560a34f5d6c52f9a86e7478c841f853c.tar.gz bcm5719-llvm-ed30e8da560a34f5d6c52f9a86e7478c841f853c.zip |
LiveVariables now updates the liveness state of block-level expressions that
are referenced by CFGBlock terminators.
llvm-svn: 49798
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Analysis/LiveVariables.cpp | 61 |
1 files changed, 49 insertions, 12 deletions
diff --git a/clang/lib/Analysis/LiveVariables.cpp b/clang/lib/Analysis/LiveVariables.cpp index 7896bfcfb0a..feba80d6955 100644 --- a/clang/lib/Analysis/LiveVariables.cpp +++ b/clang/lib/Analysis/LiveVariables.cpp @@ -143,22 +143,59 @@ void TransferFuncs::Visit(Stmt *S) { } void TransferFuncs::VisitTerminator(Stmt* S) { - return; - for (Stmt::child_iterator I = S->child_begin(), E = S->child_end(); - I != E; ++I) { - - Stmt* Child = *I; - if (!Child) continue; - - if (getCFG().isBlkExpr(Child)) { - LiveState(Child, AD) = Alive; - return; // Only one "condition" expression. - } + Expr* E = NULL; + + switch (S->getStmtClass()) { + default: + return; + + case Stmt::ForStmtClass: + E = cast<ForStmt>(S)->getCond(); + break; + + case Stmt::WhileStmtClass: + E = cast<WhileStmt>(S)->getCond(); + break; + + case Stmt::DoStmtClass: + E = cast<DoStmt>(S)->getCond(); + break; + + case Stmt::IfStmtClass: + E = cast<IfStmt>(S)->getCond(); + break; + + case Stmt::ChooseExprClass: + E = cast<ChooseExpr>(S)->getCond(); + break; + + case Stmt::IndirectGotoStmtClass: + E = cast<IndirectGotoStmt>(S)->getTarget(); + break; + + case Stmt::SwitchStmtClass: + E = cast<SwitchStmt>(S)->getCond(); + break; + + case Stmt::ConditionalOperatorClass: + E = cast<ConditionalOperator>(S)->getCond(); + break; + + case Stmt::BinaryOperatorClass: // '&&' and '||' + E = cast<BinaryOperator>(S)->getLHS(); + break; } + + if (!E) + return; + + E = E->IgnoreParens(); + + assert (getCFG().isBlkExpr(E)); + LiveState(E, AD) = Alive; } - void TransferFuncs::VisitDeclRefExpr(DeclRefExpr* DR) { if (VarDecl* V = dyn_cast<VarDecl>(DR->getDecl())) LiveState(V,AD) = Alive; |