Migrated LiveVariables and UninitializedVariables to now use the
tracked BlkExpr information now maintained by the CFG class.
llvm-svn: 42498
diff --git a/clang/Analysis/DeadStores.cpp b/clang/Analysis/DeadStores.cpp
index 3c3117c..1b85138 100644
--- a/clang/Analysis/DeadStores.cpp
+++ b/clang/Analysis/DeadStores.cpp
@@ -76,7 +76,7 @@
namespace clang {
void CheckDeadStores(CFG& cfg, ASTContext &Ctx, Diagnostic &Diags) {
- LiveVariables L;
+ LiveVariables L(cfg);
L.runOnCFG(cfg);
DeadStoreObs A(Ctx, Diags);
L.runOnAllBlocks(cfg,A);
diff --git a/clang/Analysis/LiveVariables.cpp b/clang/Analysis/LiveVariables.cpp
index f8c3d37..b4220ef 100644
--- a/clang/Analysis/LiveVariables.cpp
+++ b/clang/Analysis/LiveVariables.cpp
@@ -31,18 +31,16 @@
//===----------------------------------------------------------------------===//
namespace {
-class RegisterDeclsExprs : public CFGRecStmtDeclVisitor<RegisterDeclsExprs> {
+class RegisterDecls : public CFGRecStmtDeclVisitor<RegisterDecls> {
LiveVariables::AnalysisDataTy& AD;
public:
- RegisterDeclsExprs(LiveVariables::AnalysisDataTy& ad) : AD(ad) {}
-
+ RegisterDecls(LiveVariables::AnalysisDataTy& ad) : AD(ad) {}
void VisitVarDecl(VarDecl* VD) { AD.Register(VD); }
- void BlockStmt_VisitExpr(Expr* E) { AD.Register(E); }
-};
+};
} // end anonymous namespace
void LiveVariables::InitializeValues(const CFG& cfg) {
- RegisterDeclsExprs R(getAnalysisData());
+ RegisterDecls R(getAnalysisData());
cfg.VisitBlockStmts(R);
}
@@ -58,10 +56,8 @@
class TransferFuncs : public CFGStmtVisitor<TransferFuncs> {
LiveVariables::AnalysisDataTy& AD;
LiveVariables::ValTy LiveState;
- bool ExprLiveness;
public:
- TransferFuncs(LiveVariables::AnalysisDataTy& ad) : AD(ad),
- ExprLiveness(Dead) {}
+ TransferFuncs(LiveVariables::AnalysisDataTy& ad) : AD(ad) {}
LiveVariables::ValTy& getVal() { return LiveState; }
@@ -71,16 +67,26 @@
void VisitDeclStmt(DeclStmt* DS);
void VisitUnaryOperator(UnaryOperator* U);
void VisitStmt(Stmt* S);
- void BlockStmt_VisitExpr(Expr *E);
+ void VisitExpr(Expr* E);
+ void BlockStmt_VisitExpr(Expr *E);
+ void Visit(Stmt *S);
DeclRefExpr* FindDeclRef(Stmt *S);
-
- void Visit(Stmt *S) {
- if (AD.Observer) AD.Observer->ObserveStmt(S,AD,LiveState);
- static_cast<CFGStmtVisitor<TransferFuncs>*>(this)->Visit(S);
- }
};
+
+void TransferFuncs::VisitExpr(Expr * E) {
+ if (AD.getCFG().isBlkExpr(E)) return;
+ else VisitStmt(E);
+}
+
+void TransferFuncs::VisitStmt(Stmt* S) { VisitChildren(S); }
+
+void TransferFuncs::Visit(Stmt *S) {
+ if (AD.Observer)
+ AD.Observer->ObserveStmt(S,AD,LiveState);
+ static_cast<CFGStmtVisitor<TransferFuncs>*>(this)->Visit(S);
+}
void TransferFuncs::VisitDeclRefExpr(DeclRefExpr* DR) {
if (VarDecl* V = dyn_cast<VarDecl>(DR->getDecl()))
@@ -151,17 +157,12 @@
void TransferFuncs::VisitDeclStmt(DeclStmt* DS) {
// Declarations effectively "kill" a variable since they cannot
// possibly be live before they are declared.
- for (ScopedDecl* D = DS->getDecl(); D != NULL ; D = D->getNextDeclarator())
+ for (ScopedDecl* D = DS->getDecl(); D != NULL; D = D->getNextDeclarator())
LiveState(D,AD) = Dead;
}
-void TransferFuncs::VisitStmt(Stmt* S) {
- if (AD.isTracked(static_cast<Expr*>(S))) return;
- else VisitChildren(S);
-}
-
void TransferFuncs::BlockStmt_VisitExpr(Expr* E) {
- assert (AD.isTracked(E));
+ assert (AD.getCFG().isBlkExpr(E));
static_cast<CFGStmtVisitor<TransferFuncs>*>(this)->Visit(E);
}
diff --git a/clang/Analysis/UninitializedValues.cpp b/clang/Analysis/UninitializedValues.cpp
index 58b95fcf..a18319a 100644
--- a/clang/Analysis/UninitializedValues.cpp
+++ b/clang/Analysis/UninitializedValues.cpp
@@ -28,19 +28,18 @@
namespace {
-class RegisterDeclsExprs : public CFGRecStmtDeclVisitor<RegisterDeclsExprs> {
+class RegisterDecls : public CFGRecStmtDeclVisitor<RegisterDecls> {
UninitializedValues::AnalysisDataTy& AD;
public:
- RegisterDeclsExprs(UninitializedValues::AnalysisDataTy& ad) : AD(ad) {}
+ RegisterDecls(UninitializedValues::AnalysisDataTy& ad) : AD(ad) {}
void VisitBlockVarDecl(BlockVarDecl* VD) { AD.Register(VD); }
- void BlockStmt_VisitExpr(Expr* E) { AD.Register(E); }
};
} // end anonymous namespace
void UninitializedValues::InitializeValues(const CFG& cfg) {
- RegisterDeclsExprs R(this->getAnalysisData());
+ RegisterDecls R(getAnalysisData());
cfg.VisitBlockStmts(R);
}
@@ -77,7 +76,6 @@
static const bool Initialized = true;
static const bool Uninitialized = false;
-
bool TransferFuncs::VisitDeclRefExpr(DeclRefExpr* DR) {
if (BlockVarDecl* VD = dyn_cast<BlockVarDecl>(DR->getDecl())) {
if (AD.Observer) AD.Observer->ObserveDeclRefExpr(V,AD,DR,VD);
@@ -230,7 +228,7 @@
bool FullUninitTaint) {
// Compute the unitialized values information.
- UninitializedValues U;
+ UninitializedValues U(cfg);
U.getAnalysisData().FullUninitTaint = FullUninitTaint;
Solver S(U);
S.runOnCFG(cfg);