aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Analysis/FlowSensitive/DataflowSolver.h20
-rw-r--r--lib/Analysis/LiveVariables.cpp20
-rw-r--r--lib/Analysis/UninitializedValues.cpp2
3 files changed, 37 insertions, 5 deletions
diff --git a/include/clang/Analysis/FlowSensitive/DataflowSolver.h b/include/clang/Analysis/FlowSensitive/DataflowSolver.h
index 15f7107f26..7a19c19119 100644
--- a/include/clang/Analysis/FlowSensitive/DataflowSolver.h
+++ b/include/clang/Analysis/FlowSensitive/DataflowSolver.h
@@ -159,7 +159,7 @@ public:
if (I != M.end()) {
TF.getVal().copyValues(I->second);
- ProcessBlock(B, recordStmtValues);
+ ProcessBlock(B, recordStmtValues, AnalysisDirTag());
}
}
@@ -192,7 +192,7 @@ private:
while (!WorkList.isEmpty()) {
const CFGBlock* B = WorkList.dequeue();
ProcessMerge(cfg,B);
- ProcessBlock(B, recordStmtValues);
+ ProcessBlock(B, recordStmtValues, AnalysisDirTag());
UpdateEdges(cfg,B,TF.getVal());
}
}
@@ -230,11 +230,23 @@ private:
// Set the data for the block.
D.getBlockDataMap()[B].copyValues(V);
+ }
+
+ /// ProcessBlock - Process the transfer functions for a given block.
+ void ProcessBlock(const CFGBlock* B, bool recordStmtValues,
+ dataflow::forward_analysis_tag) {
+
+ for (StmtItr I=ItrTraits::StmtBegin(B), E=ItrTraits::StmtEnd(B); I!=E;++I)
+ ProcessStmt(*I, recordStmtValues, AnalysisDirTag());
+
+ if (Stmt* Term = (Stmt*) B->getTerminator()) TF.VisitTerminator(Term);
}
+ void ProcessBlock(const CFGBlock* B, bool recordStmtValues,
+ dataflow::backward_analysis_tag) {
+
+ if (Stmt* Term = (Stmt*) B->getTerminator()) TF.VisitTerminator(Term);
- /// ProcessBlock - Process the transfer functions for a given block.
- void ProcessBlock(const CFGBlock* B, bool recordStmtValues) {
for (StmtItr I=ItrTraits::StmtBegin(B), E=ItrTraits::StmtEnd(B); I!=E;++I)
ProcessStmt(*I, recordStmtValues, AnalysisDirTag());
}
diff --git a/lib/Analysis/LiveVariables.cpp b/lib/Analysis/LiveVariables.cpp
index b704b2d826..4cef30cab8 100644
--- a/lib/Analysis/LiveVariables.cpp
+++ b/lib/Analysis/LiveVariables.cpp
@@ -73,7 +73,8 @@ public:
void VisitAssign(BinaryOperator* B);
void VisitDeclStmt(DeclStmt* DS);
void VisitUnaryOperator(UnaryOperator* U);
- void Visit(Stmt *S);
+ void Visit(Stmt *S);
+ void VisitTerminator(Stmt* S);
};
void TransferFuncs::Visit(Stmt *S) {
@@ -90,6 +91,23 @@ void TransferFuncs::Visit(Stmt *S) {
// For block-level expressions, mark that they are live.
LiveState(S,AD) = Alive;
}
+
+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.
+ }
+ }
+}
+
void TransferFuncs::VisitDeclRefExpr(DeclRefExpr* DR) {
if (VarDecl* V = dyn_cast<VarDecl>(DR->getDecl()))
diff --git a/lib/Analysis/UninitializedValues.cpp b/lib/Analysis/UninitializedValues.cpp
index 3edf04ddb6..d5c697aa1c 100644
--- a/lib/Analysis/UninitializedValues.cpp
+++ b/lib/Analysis/UninitializedValues.cpp
@@ -75,6 +75,8 @@ public:
bool Visit(Stmt *S);
bool BlockStmt_VisitExpr(Expr* E);
+
+ void VisitTerminator(Stmt* T) { Visit(T); }
BlockVarDecl* FindBlockVarDecl(Stmt* S);
};