summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/LiveVariables.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-04-16 17:07:59 +0000
committerTed Kremenek <kremenek@apple.com>2008-04-16 17:07:59 +0000
commited30e8da560a34f5d6c52f9a86e7478c841f853c (patch)
tree6c74e57330106ca604fa024ec62c376131e4ab71 /clang/lib/Analysis/LiveVariables.cpp
parent2e4d0ecaa3bbcdf14b9755914772737265f782e9 (diff)
downloadbcm5719-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/lib/Analysis/LiveVariables.cpp')
-rw-r--r--clang/lib/Analysis/LiveVariables.cpp61
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;
OpenPOWER on IntegriCloud