From 6ee0a118146ce01d852b529156ceaaadb0e2d11a Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Tue, 9 Dec 2008 00:14:14 +0000 Subject: [PATCH] Fixed LiveVariables bug where we didn't consider block-level expressions that functioned as the size of a VLA to be live. llvm-svn: 60730 --- .../clang/Analysis/Analyses/LiveVariables.h | 2 +- .../clang/Analysis/Analyses/UninitializedValues.h | 2 +- .../clang/Analysis/Support/BlkExprDeclBitVector.h | 12 ++++++++++-- clang/lib/Analysis/LiveVariables.cpp | 14 ++++++++++++-- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/clang/include/clang/Analysis/Analyses/LiveVariables.h b/clang/include/clang/Analysis/Analyses/LiveVariables.h index 451e202dd280..b41cd684e951 100644 --- a/clang/include/clang/Analysis/Analyses/LiveVariables.h +++ b/clang/include/clang/Analysis/Analyses/LiveVariables.h @@ -66,7 +66,7 @@ class LiveVariables : public DataflowValuesisBlkExpr(S); } diff --git a/clang/lib/Analysis/LiveVariables.cpp b/clang/lib/Analysis/LiveVariables.cpp index 4b181a954c0e..8105e38b674c 100644 --- a/clang/lib/Analysis/LiveVariables.cpp +++ b/clang/lib/Analysis/LiveVariables.cpp @@ -13,6 +13,7 @@ #include "clang/Analysis/Analyses/LiveVariables.h" #include "clang/Basic/SourceManager.h" +#include "clang/AST/ASTContext.h" #include "clang/AST/Expr.h" #include "clang/AST/CFG.h" #include "clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h" @@ -95,9 +96,11 @@ public: } // end anonymous namespace -LiveVariables::LiveVariables(CFG& cfg) { +LiveVariables::LiveVariables(ASTContext& Ctx, CFG& cfg) { // Register all referenced VarDecls. - getAnalysisData().setCFG(&cfg); + getAnalysisData().setCFG(cfg); + getAnalysisData().setContext(Ctx); + RegisterDecls R(getAnalysisData()); cfg.VisitBlockStmts(R); } @@ -270,6 +273,13 @@ void TransferFuncs::VisitDeclStmt(DeclStmt* DS) { if (Expr* Init = VD->getInit()) Visit(Init); + if (const VariableArrayType* VT = + AD.getContext().getAsVariableArrayType(VD->getType())) { + StmtIterator I(const_cast(VT)); + StmtIterator E; + for (; I != E; ++I) Visit(*I); + } + // Update liveness information by killing the VarDecl. unsigned bit = AD.getIdx(VD); LiveState.getDeclBit(bit) = Dead | AD.AlwaysLive.getDeclBit(bit);