<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, May 15, 2013 at 4:22 PM, Jordan Rose <span dir="ltr"><<a href="mailto:jordan_rose@apple.com" target="_blank">jordan_rose@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: jrose<br>
Date: Wed May 15 18:22:55 2013<br>
New Revision: 181945<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=181945&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=181945&view=rev</a><br>
Log:<br>
Remove unused, awkward CFGStmtVisitor and subclasses.<br></blockquote><div><br></div><div style>Thanks Jordan!</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
This class is a StmtVisitor that distinguishes between block-level and<br>
non-block-level statements in a CFG. However, it does so using a hard-coded<br>
idea of which statements might be block-level, which probably isn't accurate<br>
anymore. The only implementer of the CFGStmtVisitor hierarchy was the<br>
analyzer's DeadStoresChecker, and the analyzer creates a linearized CFG<br>
anyway (every non-trivial statement is a block-level statement).<br>
<br>
This also allows us to remove the block-expr map ("BlkExprMap"), which<br>
mapped statements to positions in the CFG. Apart from having a helper type<br>
that really should have just been Optional<unsigned>, it was only being<br>
used to ask /if/ a particular expression was block-level, for traversal<br>
purposes in CFGStmtVisitor.<br>
<br>
Removed:<br>
cfe/trunk/include/clang/Analysis/Support/BlkExprDeclBitVector.h<br>
cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h<br>
cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtVisitor.h<br>
cfe/trunk/include/clang/Analysis/Visitors/CFGStmtVisitor.h<br>
Modified:<br>
cfe/trunk/include/clang/Analysis/CFG.h<br>
cfe/trunk/lib/Analysis/CFG.cpp<br>
cfe/trunk/lib/Analysis/UninitializedValues.cpp<br>
cfe/trunk/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Analysis/CFG.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/CFG.h?rev=181945&r1=181944&r2=181945&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/CFG.h?rev=181945&r1=181944&r2=181945&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Analysis/CFG.h (original)<br>
+++ cfe/trunk/include/clang/Analysis/CFG.h Wed May 15 18:22:55 2013<br>
@@ -763,21 +763,6 @@ public:<br>
// CFG Introspection.<br>
//===--------------------------------------------------------------------===//<br>
<br>
- struct BlkExprNumTy {<br>
- const signed Idx;<br>
- explicit BlkExprNumTy(signed idx) : Idx(idx) {}<br>
- explicit BlkExprNumTy() : Idx(-1) {}<br>
- operator bool() const { return Idx >= 0; }<br>
- operator unsigned() const { assert(Idx >=0); return (unsigned) Idx; }<br>
- };<br>
-<br>
- bool isBlkExpr(const Stmt *S) { return getBlkExprNum(S); }<br>
- bool isBlkExpr(const Stmt *S) const {<br>
- return const_cast<CFG*>(this)->isBlkExpr(S);<br>
- }<br>
- BlkExprNumTy getBlkExprNum(const Stmt *S);<br>
- unsigned getNumBlkExprs();<br>
-<br>
/// getNumBlockIDs - Returns the total number of BlockIDs allocated (which<br>
/// start at 0).<br>
unsigned getNumBlockIDs() const { return NumBlockIDs; }<br>
@@ -800,9 +785,7 @@ public:<br>
//===--------------------------------------------------------------------===//<br>
<br>
CFG() : Entry(NULL), Exit(NULL), IndirectGotoBlock(NULL), NumBlockIDs(0),<br>
- BlkExprMap(NULL), Blocks(BlkBVC, 10) {}<br>
-<br>
- ~CFG();<br>
+ Blocks(BlkBVC, 10) {}<br>
<br>
llvm::BumpPtrAllocator& getAllocator() {<br>
return BlkBVC.getAllocator();<br>
@@ -819,11 +802,6 @@ private:<br>
// for indirect gotos<br>
unsigned NumBlockIDs;<br>
<br>
- // BlkExprMap - An opaque pointer to prevent inclusion of DenseMap.h.<br>
- // It represents a map from Expr* to integers to record the set of<br>
- // block-level expressions and their "statement number" in the CFG.<br>
- void * BlkExprMap;<br>
-<br>
BumpVectorContext BlkBVC;<br>
<br>
CFGBlockListTy Blocks;<br>
<br>
Removed: cfe/trunk/include/clang/Analysis/Support/BlkExprDeclBitVector.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Support/BlkExprDeclBitVector.h?rev=181944&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Support/BlkExprDeclBitVector.h?rev=181944&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Analysis/Support/BlkExprDeclBitVector.h (original)<br>
+++ cfe/trunk/include/clang/Analysis/Support/BlkExprDeclBitVector.h (removed)<br>
@@ -1,307 +0,0 @@<br>
-// BlkExprDeclBitVector.h - Dataflow types for Bitvector Analysis --*- C++ --*--<br>
-//<br>
-// The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-//<br>
-// This file provides definition of dataflow types used by analyses such<br>
-// as LiveVariables and UninitializedValues. The underlying dataflow values<br>
-// are implemented as bitvectors, but the definitions in this file include<br>
-// the necessary boilerplate to use with our dataflow framework.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-#ifndef LLVM_CLANG_STMTDECLBVDVAL_H<br>
-#define LLVM_CLANG_STMTDECLBVDVAL_H<br>
-<br>
-#include "clang/AST/Decl.h" // for Decl* -> NamedDecl* conversion<br>
-#include "clang/Analysis/CFG.h"<br>
-#include "llvm/ADT/BitVector.h"<br>
-#include "llvm/ADT/DenseMap.h"<br>
-<br>
-namespace clang {<br>
-<br>
- class Stmt;<br>
- class ASTContext;<br>
-<br>
-struct DeclBitVector_Types {<br>
-<br>
- class Idx {<br>
- unsigned I;<br>
- public:<br>
- explicit Idx(unsigned i) : I(i) {}<br>
- Idx() : I(~0U) {}<br>
-<br>
- bool isValid() const {<br>
- return I != ~0U;<br>
- }<br>
- operator unsigned() const {<br>
- assert (isValid());<br>
- return I;<br>
- }<br>
- };<br>
-<br>
- //===--------------------------------------------------------------------===//<br>
- // AnalysisDataTy - Whole-function meta data.<br>
- //===--------------------------------------------------------------------===//<br>
-<br>
- class AnalysisDataTy {<br>
- public:<br>
- typedef llvm::DenseMap<const NamedDecl*, unsigned > DMapTy;<br>
- typedef DMapTy::const_iterator decl_iterator;<br>
-<br>
- protected:<br>
- DMapTy DMap;<br>
- unsigned NDecls;<br>
-<br>
- public:<br>
-<br>
- AnalysisDataTy() : NDecls(0) {}<br>
- virtual ~AnalysisDataTy() {}<br>
-<br>
- bool isTracked(const NamedDecl *SD) { return DMap.find(SD) != DMap.end(); }<br>
-<br>
- Idx getIdx(const NamedDecl *SD) const {<br>
- DMapTy::const_iterator I = DMap.find(SD);<br>
- return I == DMap.end() ? Idx() : Idx(I->second);<br>
- }<br>
-<br>
- unsigned getNumDecls() const { return NDecls; }<br>
-<br>
- void Register(const NamedDecl *SD) {<br>
- if (!isTracked(SD)) DMap[SD] = NDecls++;<br>
- }<br>
-<br>
- decl_iterator begin_decl() const { return DMap.begin(); }<br>
- decl_iterator end_decl() const { return DMap.end(); }<br>
- };<br>
-<br>
- //===--------------------------------------------------------------------===//<br>
- // ValTy - Dataflow value.<br>
- //===--------------------------------------------------------------------===//<br>
-<br>
- class ValTy {<br>
- llvm::BitVector DeclBV;<br>
- public:<br>
-<br>
- void resetDeclValues(AnalysisDataTy& AD) {<br>
- DeclBV.resize(AD.getNumDecls());<br>
- DeclBV.reset();<br>
- }<br>
-<br>
- void setDeclValues(AnalysisDataTy& AD) {<br>
- DeclBV.resize(AD.getNumDecls());<br>
- DeclBV.set();<br>
- }<br>
-<br>
- void resetValues(AnalysisDataTy& AD) {<br>
- resetDeclValues(AD);<br>
- }<br>
-<br>
- bool operator==(const ValTy& RHS) const {<br>
- assert (sizesEqual(RHS));<br>
- return DeclBV == RHS.DeclBV;<br>
- }<br>
-<br>
- void copyValues(const ValTy& RHS) { DeclBV = RHS.DeclBV; }<br>
-<br>
- llvm::BitVector::reference getBit(unsigned i) {<br>
- return DeclBV[i];<br>
- }<br>
-<br>
- bool getBit(unsigned i) const {<br>
- return DeclBV[i];<br>
- }<br>
-<br>
- llvm::BitVector::reference<br>
- operator()(const NamedDecl *ND, const AnalysisDataTy& AD) {<br>
- return getBit(AD.getIdx(ND));<br>
- }<br>
-<br>
- bool operator()(const NamedDecl *ND, const AnalysisDataTy& AD) const {<br>
- return getBit(AD.getIdx(ND));<br>
- }<br>
-<br>
- llvm::BitVector::reference getDeclBit(unsigned i) { return DeclBV[i]; }<br>
- const llvm::BitVector::reference getDeclBit(unsigned i) const {<br>
- return const_cast<llvm::BitVector&>(DeclBV)[i];<br>
- }<br>
-<br>
- ValTy& operator|=(const ValTy& RHS) {<br>
- assert (sizesEqual(RHS));<br>
- DeclBV |= RHS.DeclBV;<br>
- return *this;<br>
- }<br>
-<br>
- ValTy& operator&=(const ValTy& RHS) {<br>
- assert (sizesEqual(RHS));<br>
- DeclBV &= RHS.DeclBV;<br>
- return *this;<br>
- }<br>
-<br>
- ValTy& OrDeclBits(const ValTy& RHS) {<br>
- return operator|=(RHS);<br>
- }<br>
-<br>
- ValTy& AndDeclBits(const ValTy& RHS) {<br>
- return operator&=(RHS);<br>
- }<br>
-<br>
- bool sizesEqual(const ValTy& RHS) const {<br>
- return DeclBV.size() == RHS.DeclBV.size();<br>
- }<br>
- };<br>
-<br>
- //===--------------------------------------------------------------------===//<br>
- // Some useful merge operations.<br>
- //===--------------------------------------------------------------------===//<br>
-<br>
- struct Union { void operator()(ValTy& Dst, ValTy& Src) { Dst |= Src; } };<br>
- struct Intersect { void operator()(ValTy& Dst, ValTy& Src) { Dst &= Src; } };<br>
-};<br>
-<br>
-<br>
-struct StmtDeclBitVector_Types {<br>
-<br>
- //===--------------------------------------------------------------------===//<br>
- // AnalysisDataTy - Whole-function meta data.<br>
- //===--------------------------------------------------------------------===//<br>
-<br>
- class AnalysisDataTy : public DeclBitVector_Types::AnalysisDataTy {<br>
- ASTContext *ctx;<br>
- CFG* cfg;<br>
- public:<br>
- AnalysisDataTy() : ctx(0), cfg(0) {}<br>
- virtual ~AnalysisDataTy() {}<br>
-<br>
- void setContext(ASTContext &c) { ctx = &c; }<br>
- ASTContext &getContext() {<br>
- assert(ctx && "ASTContext should not be NULL.");<br>
- return *ctx;<br>
- }<br>
-<br>
- void setCFG(CFG& c) { cfg = &c; }<br>
- CFG& getCFG() { assert(cfg && "CFG should not be NULL."); return *cfg; }<br>
-<br>
- bool isTracked(const Stmt *S) { return cfg->isBlkExpr(S); }<br>
- using DeclBitVector_Types::AnalysisDataTy::isTracked;<br>
-<br>
- unsigned getIdx(const Stmt *S) const {<br>
- CFG::BlkExprNumTy I = cfg->getBlkExprNum(S);<br>
- assert(I && "Stmtession not tracked for bitvector.");<br>
- return I;<br>
- }<br>
- using DeclBitVector_Types::AnalysisDataTy::getIdx;<br>
-<br>
- unsigned getNumBlkExprs() const { return cfg->getNumBlkExprs(); }<br>
- };<br>
-<br>
- //===--------------------------------------------------------------------===//<br>
- // ValTy - Dataflow value.<br>
- //===--------------------------------------------------------------------===//<br>
-<br>
- class ValTy : public DeclBitVector_Types::ValTy {<br>
- llvm::BitVector BlkExprBV;<br>
- typedef DeclBitVector_Types::ValTy ParentTy;<br>
-<br>
- static inline ParentTy& ParentRef(ValTy& X) {<br>
- return static_cast<ParentTy&>(X);<br>
- }<br>
-<br>
- static inline const ParentTy& ParentRef(const ValTy& X) {<br>
- return static_cast<const ParentTy&>(X);<br>
- }<br>
-<br>
- public:<br>
-<br>
- void resetBlkExprValues(AnalysisDataTy& AD) {<br>
- BlkExprBV.resize(AD.getNumBlkExprs());<br>
- BlkExprBV.reset();<br>
- }<br>
-<br>
- void setBlkExprValues(AnalysisDataTy& AD) {<br>
- BlkExprBV.resize(AD.getNumBlkExprs());<br>
- BlkExprBV.set();<br>
- }<br>
-<br>
- void resetValues(AnalysisDataTy& AD) {<br>
- resetDeclValues(AD);<br>
- resetBlkExprValues(AD);<br>
- }<br>
-<br>
- void setValues(AnalysisDataTy& AD) {<br>
- setDeclValues(AD);<br>
- setBlkExprValues(AD);<br>
- }<br>
-<br>
- bool operator==(const ValTy& RHS) const {<br>
- return ParentRef(*this) == ParentRef(RHS)<br>
- && BlkExprBV == RHS.BlkExprBV;<br>
- }<br>
-<br>
- void copyValues(const ValTy& RHS) {<br>
- ParentRef(*this).copyValues(ParentRef(RHS));<br>
- BlkExprBV = RHS.BlkExprBV;<br>
- }<br>
-<br>
- llvm::BitVector::reference<br>
- operator()(const Stmt *S, const AnalysisDataTy& AD) {<br>
- return BlkExprBV[AD.getIdx(S)];<br>
- }<br>
- const llvm::BitVector::reference<br>
- operator()(const Stmt *S, const AnalysisDataTy& AD) const {<br>
- return const_cast<ValTy&>(*this)(S,AD);<br>
- }<br>
-<br>
- using DeclBitVector_Types::ValTy::operator();<br>
-<br>
-<br>
- llvm::BitVector::reference getStmtBit(unsigned i) { return BlkExprBV[i]; }<br>
- const llvm::BitVector::reference getStmtBit(unsigned i) const {<br>
- return const_cast<llvm::BitVector&>(BlkExprBV)[i];<br>
- }<br>
-<br>
- ValTy& OrBlkExprBits(const ValTy& RHS) {<br>
- BlkExprBV |= RHS.BlkExprBV;<br>
- return *this;<br>
- }<br>
-<br>
- ValTy& AndBlkExprBits(const ValTy& RHS) {<br>
- BlkExprBV &= RHS.BlkExprBV;<br>
- return *this;<br>
- }<br>
-<br>
- ValTy& operator|=(const ValTy& RHS) {<br>
- assert (sizesEqual(RHS));<br>
- ParentRef(*this) |= ParentRef(RHS);<br>
- BlkExprBV |= RHS.BlkExprBV;<br>
- return *this;<br>
- }<br>
-<br>
- ValTy& operator&=(const ValTy& RHS) {<br>
- assert (sizesEqual(RHS));<br>
- ParentRef(*this) &= ParentRef(RHS);<br>
- BlkExprBV &= RHS.BlkExprBV;<br>
- return *this;<br>
- }<br>
-<br>
- bool sizesEqual(const ValTy& RHS) const {<br>
- return ParentRef(*this).sizesEqual(ParentRef(RHS))<br>
- && BlkExprBV.size() == RHS.BlkExprBV.size();<br>
- }<br>
- };<br>
-<br>
- //===--------------------------------------------------------------------===//<br>
- // Some useful merge operations.<br>
- //===--------------------------------------------------------------------===//<br>
-<br>
- struct Union { void operator()(ValTy& Dst, ValTy& Src) { Dst |= Src; } };<br>
- struct Intersect { void operator()(ValTy& Dst, ValTy& Src) { Dst &= Src; } };<br>
-<br>
-};<br>
-} // end namespace clang<br>
-<br>
-#endif<br>
<br>
Removed: cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h?rev=181944&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h?rev=181944&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h (original)<br>
+++ cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h (removed)<br>
@@ -1,107 +0,0 @@<br>
-//= CFGRecStmtDeclVisitor - Recursive visitor of CFG stmts/decls -*- C++ --*-=//<br>
-//<br>
-// The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-//<br>
-// This file implements the template class CFGRecStmtDeclVisitor, which extends<br>
-// CFGRecStmtVisitor by implementing (typed) visitation of decls.<br>
-//<br>
-// FIXME: This may not be fully complete. We currently explore only subtypes<br>
-// of ScopedDecl.<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-#ifndef LLVM_CLANG_ANALYSIS_CFG_REC_STMT_DECL_VISITOR_H<br>
-#define LLVM_CLANG_ANALYSIS_CFG_REC_STMT_DECL_VISITOR_H<br>
-<br>
-#include "clang/AST/Decl.h"<br>
-#include "clang/AST/DeclCXX.h"<br>
-#include "clang/AST/DeclObjC.h"<br>
-#include "clang/Analysis/Visitors/CFGRecStmtVisitor.h"<br>
-<br>
-#define DISPATCH_CASE(CLASS) \<br>
-case Decl::CLASS: \<br>
-static_cast<ImplClass*>(this)->Visit##CLASS##Decl( \<br>
- static_cast<CLASS##Decl*>(D)); \<br>
-break;<br>
-<br>
-#define DEFAULT_DISPATCH(CLASS) void Visit##CLASS##Decl(CLASS##Decl *D) {}<br>
-#define DEFAULT_DISPATCH_VARDECL(CLASS) void Visit##CLASS##Decl(CLASS##Decl *D)\<br>
- { static_cast<ImplClass*>(this)->VisitVarDecl(D); }<br>
-<br>
-<br>
-namespace clang {<br>
-template <typename ImplClass><br>
-class CFGRecStmtDeclVisitor : public CFGRecStmtVisitor<ImplClass> {<br>
-public:<br>
-<br>
- void VisitDeclRefExpr(DeclRefExpr *DR) {<br>
- static_cast<ImplClass*>(this)->VisitDecl(DR->getDecl());<br>
- }<br>
-<br>
- void VisitDeclStmt(DeclStmt *DS) {<br>
- for (DeclStmt::decl_iterator DI = DS->decl_begin(), DE = DS->decl_end();<br>
- DI != DE; ++DI) {<br>
- Decl *D = *DI;<br>
- static_cast<ImplClass*>(this)->VisitDecl(D);<br>
- // Visit the initializer.<br>
- if (VarDecl *VD = dyn_cast<VarDecl>(D))<br>
- if (Expr *I = VD->getInit())<br>
- static_cast<ImplClass*>(this)->Visit(I);<br>
- }<br>
- }<br>
-<br>
- void VisitDecl(Decl *D) {<br>
- switch (D->getKind()) {<br>
- DISPATCH_CASE(Function)<br>
- DISPATCH_CASE(CXXMethod)<br>
- DISPATCH_CASE(Var)<br>
- DISPATCH_CASE(ParmVar) // FIXME: (same)<br>
- DISPATCH_CASE(ImplicitParam)<br>
- DISPATCH_CASE(EnumConstant)<br>
- DISPATCH_CASE(Typedef)<br>
- DISPATCH_CASE(TypeAlias)<br>
- DISPATCH_CASE(Record) // FIXME: Refine. VisitStructDecl?<br>
- DISPATCH_CASE(CXXRecord)<br>
- DISPATCH_CASE(Enum)<br>
- DISPATCH_CASE(Field)<br>
- DISPATCH_CASE(UsingDirective)<br>
- DISPATCH_CASE(Using)<br>
- DISPATCH_CASE(NamespaceAlias)<br>
- default:<br>
- llvm_unreachable("Subtype of ScopedDecl not handled.");<br>
- }<br>
- }<br>
-<br>
- DEFAULT_DISPATCH(Var)<br>
- DEFAULT_DISPATCH(Function)<br>
- DEFAULT_DISPATCH(CXXMethod)<br>
- DEFAULT_DISPATCH_VARDECL(ParmVar)<br>
- DEFAULT_DISPATCH(ImplicitParam)<br>
- DEFAULT_DISPATCH(EnumConstant)<br>
- DEFAULT_DISPATCH(Typedef)<br>
- DEFAULT_DISPATCH(TypeAlias)<br>
- DEFAULT_DISPATCH(Record)<br>
- DEFAULT_DISPATCH(Enum)<br>
- DEFAULT_DISPATCH(Field)<br>
- DEFAULT_DISPATCH(ObjCInterface)<br>
- DEFAULT_DISPATCH(ObjCMethod)<br>
- DEFAULT_DISPATCH(ObjCProtocol)<br>
- DEFAULT_DISPATCH(ObjCCategory)<br>
- DEFAULT_DISPATCH(UsingDirective)<br>
- DEFAULT_DISPATCH(Using)<br>
- DEFAULT_DISPATCH(NamespaceAlias)<br>
-<br>
- void VisitCXXRecordDecl(CXXRecordDecl *D) {<br>
- static_cast<ImplClass*>(this)->VisitRecordDecl(D);<br>
- }<br>
-};<br>
-<br>
-} // end namespace clang<br>
-<br>
-#undef DISPATCH_CASE<br>
-#undef DEFAULT_DISPATCH<br>
-#endif<br>
<br>
Removed: cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtVisitor.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtVisitor.h?rev=181944&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtVisitor.h?rev=181944&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtVisitor.h (original)<br>
+++ cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtVisitor.h (removed)<br>
@@ -1,59 +0,0 @@<br>
-//==- CFGRecStmtVisitor - Recursive visitor of CFG statements ---*- C++ --*-==//<br>
-//<br>
-// The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-//<br>
-// This file implements the template class CFGRecStmtVisitor, which extends<br>
-// CFGStmtVisitor by implementing a default recursive visit of all statements.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-#ifndef LLVM_CLANG_ANALYSIS_CFG_REC_STMT_VISITOR_H<br>
-#define LLVM_CLANG_ANALYSIS_CFG_REC_STMT_VISITOR_H<br>
-<br>
-#include "clang/Analysis/Visitors/CFGStmtVisitor.h"<br>
-<br>
-namespace clang {<br>
-template <typename ImplClass><br>
-class CFGRecStmtVisitor : public CFGStmtVisitor<ImplClass,void> {<br>
-public:<br>
-<br>
- void VisitStmt(Stmt *S) {<br>
- static_cast< ImplClass* >(this)->VisitChildren(S);<br>
- }<br>
-<br>
- void VisitCompoundStmt(CompoundStmt *S) {<br>
- // Do nothing. Everything in a CompoundStmt is inlined<br>
- // into the CFG.<br>
- }<br>
-<br>
- void VisitConditionVariableInit(Stmt *S) {<br>
- assert(S == this->getCurrentBlkStmt());<br>
- VarDecl *CondVar = 0;<br>
- switch (S->getStmtClass()) {<br>
-#define CONDVAR_CASE(CLASS) \<br>
-case Stmt::CLASS ## Class:\<br>
-CondVar = cast<CLASS>(S)->getConditionVariable();\<br>
-break;<br>
- CONDVAR_CASE(IfStmt)<br>
- CONDVAR_CASE(ForStmt)<br>
- CONDVAR_CASE(SwitchStmt)<br>
- CONDVAR_CASE(WhileStmt)<br>
-#undef CONDVAR_CASE<br>
- default:<br>
- llvm_unreachable("Infeasible");<br>
- }<br>
- static_cast<ImplClass*>(this)->Visit(CondVar->getInit());<br>
- }<br>
-<br>
- // Defining operator() allows the visitor to be used as a C++ style functor.<br>
- void operator()(Stmt *S) { static_cast<ImplClass*>(this)->BlockStmt_Visit(S);}<br>
-};<br>
-<br>
-} // end namespace clang<br>
-<br>
-#endif<br>
<br>
Removed: cfe/trunk/include/clang/Analysis/Visitors/CFGStmtVisitor.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGStmtVisitor.h?rev=181944&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGStmtVisitor.h?rev=181944&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Analysis/Visitors/CFGStmtVisitor.h (original)<br>
+++ cfe/trunk/include/clang/Analysis/Visitors/CFGStmtVisitor.h (removed)<br>
@@ -1,175 +0,0 @@<br>
-//===--- CFGStmtVisitor.h - Visitor for Stmts in a CFG ----------*- C++ -*-===//<br>
-//<br>
-// The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-//<br>
-// This file defines the CFGStmtVisitor interface, which extends<br>
-// StmtVisitor. This interface is useful for visiting statements in a CFG<br>
-// where some statements have implicit control-flow and thus should<br>
-// be treated specially.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-#ifndef LLVM_CLANG_ANALYSIS_CFGSTMTVISITOR_H<br>
-#define LLVM_CLANG_ANALYSIS_CFGSTMTVISITOR_H<br>
-<br>
-#include "clang/AST/StmtVisitor.h"<br>
-#include "clang/Analysis/CFG.h"<br>
-<br>
-namespace clang {<br>
-<br>
-#define DISPATCH_CASE(CLASS) \<br>
-case Stmt::CLASS ## Class: return \<br>
-static_cast<ImplClass*>(this)->BlockStmt_Visit ## CLASS(static_cast<CLASS*>(S));<br>
-<br>
-#define DEFAULT_BLOCKSTMT_VISIT(CLASS) RetTy BlockStmt_Visit ## CLASS(CLASS *S)\<br>
-{ return\<br>
- static_cast<ImplClass*>(this)->BlockStmt_VisitImplicitControlFlowExpr(\<br>
- cast<Expr>(S)); }<br>
-<br>
-template <typename ImplClass, typename RetTy=void><br>
-class CFGStmtVisitor : public StmtVisitor<ImplClass,RetTy> {<br>
- Stmt *CurrentBlkStmt;<br>
-<br>
- struct NullifyStmt {<br>
- Stmt*& S;<br>
-<br>
- NullifyStmt(Stmt*& s) : S(s) {}<br>
- ~NullifyStmt() { S = NULL; }<br>
- };<br>
-<br>
-public:<br>
- CFGStmtVisitor() : CurrentBlkStmt(NULL) {}<br>
-<br>
- Stmt *getCurrentBlkStmt() const { return CurrentBlkStmt; }<br>
-<br>
- RetTy Visit(Stmt *S) {<br>
- if (S == CurrentBlkStmt ||<br>
- !static_cast<ImplClass*>(this)->getCFG().isBlkExpr(S))<br>
- return StmtVisitor<ImplClass,RetTy>::Visit(S);<br>
- else<br>
- return RetTy();<br>
- }<br>
-<br>
- /// VisitConditionVariableInit - Handle the initialization of condition<br>
- /// variables at branches. Valid statements include IfStmt, ForStmt,<br>
- /// WhileStmt, and SwitchStmt.<br>
- RetTy VisitConditionVariableInit(Stmt *S) {<br>
- return RetTy();<br>
- }<br>
-<br>
- /// BlockVisit_XXX - Visitor methods for visiting the "root" statements in<br>
- /// CFGBlocks. Root statements are the statements that appear explicitly in<br>
- /// the list of statements in a CFGBlock. For substatements, or when there<br>
- /// is no implementation provided for a BlockStmt_XXX method, we default<br>
- /// to using StmtVisitor's Visit method.<br>
- RetTy BlockStmt_Visit(Stmt *S) {<br>
- CurrentBlkStmt = S;<br>
- NullifyStmt cleanup(CurrentBlkStmt);<br>
-<br>
- switch (S->getStmtClass()) {<br>
- case Stmt::IfStmtClass:<br>
- case Stmt::ForStmtClass:<br>
- case Stmt::WhileStmtClass:<br>
- case Stmt::SwitchStmtClass:<br>
- return static_cast<ImplClass*>(this)->VisitConditionVariableInit(S);<br>
-<br>
- DISPATCH_CASE(StmtExpr)<br>
- DISPATCH_CASE(ConditionalOperator)<br>
- DISPATCH_CASE(BinaryConditionalOperator)<br>
- DISPATCH_CASE(ObjCForCollectionStmt)<br>
- DISPATCH_CASE(CXXForRangeStmt)<br>
-<br>
- case Stmt::BinaryOperatorClass: {<br>
- BinaryOperator* B = cast<BinaryOperator>(S);<br>
- if (B->isLogicalOp())<br>
- return static_cast<ImplClass*>(this)->BlockStmt_VisitLogicalOp(B);<br>
- else if (B->getOpcode() == BO_Comma)<br>
- return static_cast<ImplClass*>(this)->BlockStmt_VisitComma(B);<br>
- // Fall through.<br>
- }<br>
-<br>
- default:<br>
- if (isa<Expr>(S))<br>
- return<br>
- static_cast<ImplClass*>(this)->BlockStmt_VisitExpr(cast<Expr>(S));<br>
- else<br>
- return static_cast<ImplClass*>(this)->BlockStmt_VisitStmt(S);<br>
- }<br>
- }<br>
-<br>
- DEFAULT_BLOCKSTMT_VISIT(StmtExpr)<br>
- DEFAULT_BLOCKSTMT_VISIT(ConditionalOperator)<br>
- DEFAULT_BLOCKSTMT_VISIT(BinaryConditionalOperator)<br>
-<br>
- RetTy BlockStmt_VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {<br>
- return static_cast<ImplClass*>(this)->BlockStmt_VisitStmt(S);<br>
- }<br>
-<br>
- RetTy BlockStmt_VisitCXXForRangeStmt(CXXForRangeStmt *S) {<br>
- return static_cast<ImplClass*>(this)->BlockStmt_VisitStmt(S);<br>
- }<br>
-<br>
- RetTy BlockStmt_VisitImplicitControlFlowExpr(Expr *E) {<br>
- return static_cast<ImplClass*>(this)->BlockStmt_VisitExpr(E);<br>
- }<br>
-<br>
- RetTy BlockStmt_VisitExpr(Expr *E) {<br>
- return static_cast<ImplClass*>(this)->BlockStmt_VisitStmt(E);<br>
- }<br>
-<br>
- RetTy BlockStmt_VisitStmt(Stmt *S) {<br>
- return static_cast<ImplClass*>(this)->Visit(S);<br>
- }<br>
-<br>
- RetTy BlockStmt_VisitLogicalOp(BinaryOperator* B) {<br>
- return<br>
- static_cast<ImplClass*>(this)->BlockStmt_VisitImplicitControlFlowExpr(B);<br>
- }<br>
-<br>
- RetTy BlockStmt_VisitComma(BinaryOperator* B) {<br>
- return<br>
- static_cast<ImplClass*>(this)->BlockStmt_VisitImplicitControlFlowExpr(B);<br>
- }<br>
-<br>
- //===--------------------------------------------------------------------===//<br>
- // Utility methods. Not called by default (but subclasses may use them).<br>
- //===--------------------------------------------------------------------===//<br>
-<br>
- /// VisitChildren: Call "Visit" on each child of S.<br>
- void VisitChildren(Stmt *S) {<br>
-<br>
- switch (S->getStmtClass()) {<br>
- default:<br>
- break;<br>
-<br>
- case Stmt::StmtExprClass: {<br>
- CompoundStmt *CS = cast<StmtExpr>(S)->getSubStmt();<br>
- if (CS->body_empty()) return;<br>
- static_cast<ImplClass*>(this)->Visit(CS->body_back());<br>
- return;<br>
- }<br>
-<br>
- case Stmt::BinaryOperatorClass: {<br>
- BinaryOperator* B = cast<BinaryOperator>(S);<br>
- if (B->getOpcode() != BO_Comma) break;<br>
- static_cast<ImplClass*>(this)->Visit(B->getRHS());<br>
- return;<br>
- }<br>
- }<br>
-<br>
- for (Stmt::child_range I = S->children(); I; ++I)<br>
- if (*I) static_cast<ImplClass*>(this)->Visit(*I);<br>
- }<br>
-};<br>
-<br>
-#undef DEFAULT_BLOCKSTMT_VISIT<br>
-#undef DISPATCH_CASE<br>
-<br>
-} // end namespace clang<br>
-<br>
-#endif<br>
<br>
Modified: cfe/trunk/lib/Analysis/CFG.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=181945&r1=181944&r2=181945&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=181945&r1=181944&r2=181945&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Analysis/CFG.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/CFG.cpp Wed May 15 18:22:55 2013<br>
@@ -3400,113 +3400,6 @@ bool CFGImplicitDtor::isNoReturn(ASTCont<br>
}<br>
<br>
//===----------------------------------------------------------------------===//<br>
-// CFG: Queries for BlkExprs.<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-namespace {<br>
- typedef llvm::DenseMap<const Stmt*,unsigned> BlkExprMapTy;<br>
-}<br>
-<br>
-static void FindSubExprAssignments(const Stmt *S,<br>
- llvm::SmallPtrSet<const Expr*,50>& Set) {<br>
- if (!S)<br>
- return;<br>
-<br>
- for (Stmt::const_child_range I = S->children(); I; ++I) {<br>
- const Stmt *child = *I;<br>
- if (!child)<br>
- continue;<br>
-<br>
- if (const BinaryOperator* B = dyn_cast<BinaryOperator>(child))<br>
- if (B->isAssignmentOp()) Set.insert(B);<br>
-<br>
- FindSubExprAssignments(child, Set);<br>
- }<br>
-}<br>
-<br>
-static BlkExprMapTy* PopulateBlkExprMap(CFG& cfg) {<br>
- BlkExprMapTy* M = new BlkExprMapTy();<br>
-<br>
- // Look for assignments that are used as subexpressions. These are the only<br>
- // assignments that we want to *possibly* register as a block-level<br>
- // expression. Basically, if an assignment occurs both in a subexpression and<br>
- // at the block-level, it is a block-level expression.<br>
- llvm::SmallPtrSet<const Expr*,50> SubExprAssignments;<br>
-<br>
- for (CFG::iterator I=cfg.begin(), E=cfg.end(); I != E; ++I)<br>
- for (CFGBlock::iterator BI=(*I)->begin(), EI=(*I)->end(); BI != EI; ++BI)<br>
- if (Optional<CFGStmt> S = BI->getAs<CFGStmt>())<br>
- FindSubExprAssignments(S->getStmt(), SubExprAssignments);<br>
-<br>
- for (CFG::iterator I=cfg.begin(), E=cfg.end(); I != E; ++I) {<br>
-<br>
- // Iterate over the statements again on identify the Expr* and Stmt* at the<br>
- // block-level that are block-level expressions.<br>
-<br>
- for (CFGBlock::iterator BI=(*I)->begin(), EI=(*I)->end(); BI != EI; ++BI) {<br>
- Optional<CFGStmt> CS = BI->getAs<CFGStmt>();<br>
- if (!CS)<br>
- continue;<br>
- if (const Expr *Exp = dyn_cast<Expr>(CS->getStmt())) {<br>
- assert((Exp->IgnoreParens() == Exp) && "No parens on block-level exps");<br>
-<br>
- if (const BinaryOperator* B = dyn_cast<BinaryOperator>(Exp)) {<br>
- // Assignment expressions that are not nested within another<br>
- // expression are really "statements" whose value is never used by<br>
- // another expression.<br>
- if (B->isAssignmentOp() && !SubExprAssignments.count(Exp))<br>
- continue;<br>
- } else if (const StmtExpr *SE = dyn_cast<StmtExpr>(Exp)) {<br>
- // Special handling for statement expressions. The last statement in<br>
- // the statement expression is also a block-level expr.<br>
- const CompoundStmt *C = SE->getSubStmt();<br>
- if (!C->body_empty()) {<br>
- const Stmt *Last = C->body_back();<br>
- if (const Expr *LastEx = dyn_cast<Expr>(Last))<br>
- Last = LastEx->IgnoreParens();<br>
- unsigned x = M->size();<br>
- (*M)[Last] = x;<br>
- }<br>
- }<br>
-<br>
- unsigned x = M->size();<br>
- (*M)[Exp] = x;<br>
- }<br>
- }<br>
-<br>
- // Look at terminators. The condition is a block-level expression.<br>
-<br>
- Stmt *S = (*I)->getTerminatorCondition();<br>
-<br>
- if (S && M->find(S) == M->end()) {<br>
- unsigned x = M->size();<br>
- (*M)[S] = x;<br>
- }<br>
- }<br>
-<br>
- return M;<br>
-}<br>
-<br>
-CFG::BlkExprNumTy CFG::getBlkExprNum(const Stmt *S) {<br>
- assert(S != NULL);<br>
- if (!BlkExprMap) { BlkExprMap = (void*) PopulateBlkExprMap(*this); }<br>
-<br>
- BlkExprMapTy* M = reinterpret_cast<BlkExprMapTy*>(BlkExprMap);<br>
- BlkExprMapTy::iterator I = M->find(S);<br>
- return (I == M->end()) ? CFG::BlkExprNumTy() : CFG::BlkExprNumTy(I->second);<br>
-}<br>
-<br>
-unsigned CFG::getNumBlkExprs() {<br>
- if (const BlkExprMapTy* M = reinterpret_cast<const BlkExprMapTy*>(BlkExprMap))<br>
- return M->size();<br>
-<br>
- // We assume callers interested in the number of BlkExprs will want<br>
- // the map constructed if it doesn't already exist.<br>
- BlkExprMap = (void*) PopulateBlkExprMap(*this);<br>
- return reinterpret_cast<BlkExprMapTy*>(BlkExprMap)->size();<br>
-}<br>
-<br>
-//===----------------------------------------------------------------------===//<br>
// Filtered walking of the CFG.<br>
//===----------------------------------------------------------------------===//<br>
<br>
@@ -3530,14 +3423,6 @@ bool CFGBlock::FilterEdge(const CFGBlock<br>
}<br>
<br>
//===----------------------------------------------------------------------===//<br>
-// Cleanup: CFG dstor.<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-CFG::~CFG() {<br>
- delete reinterpret_cast<const BlkExprMapTy*>(BlkExprMap);<br>
-}<br>
-<br>
-//===----------------------------------------------------------------------===//<br>
// CFG pretty printing<br>
//===----------------------------------------------------------------------===//<br>
<br>
<br>
Modified: cfe/trunk/lib/Analysis/UninitializedValues.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/UninitializedValues.cpp?rev=181945&r1=181944&r2=181945&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/UninitializedValues.cpp?rev=181945&r1=181944&r2=181945&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Analysis/UninitializedValues.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/UninitializedValues.cpp Wed May 15 18:22:55 2013<br>
@@ -14,12 +14,12 @@<br>
#include "clang/AST/ASTContext.h"<br>
#include "clang/AST/Attr.h"<br>
#include "clang/AST/Decl.h"<br>
+#include "clang/AST/StmtVisitor.h"<br>
#include "clang/Analysis/Analyses/PostOrderCFGView.h"<br>
#include "clang/Analysis/Analyses/UninitializedValues.h"<br>
#include "clang/Analysis/AnalysisContext.h"<br>
#include "clang/Analysis/CFG.h"<br>
#include "clang/Analysis/DomainSpecific/ObjCNoReturn.h"<br>
-#include "clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h"<br>
#include "llvm/ADT/DenseMap.h"<br>
#include "llvm/ADT/Optional.h"<br>
#include "llvm/ADT/PackedVector.h"<br>
<br>
Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp?rev=181945&r1=181944&r2=181945&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp?rev=181945&r1=181944&r2=181945&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp (original)<br>
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp Wed May 15 18:22:55 2013<br>
@@ -18,7 +18,6 @@<br>
#include "clang/AST/ParentMap.h"<br>
#include "clang/AST/RecursiveASTVisitor.h"<br>
#include "clang/Analysis/Analyses/LiveVariables.h"<br>
-#include "clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h"<br>
#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"<br>
#include "clang/StaticAnalyzer/Core/Checker.h"<br>
#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"<br>
@@ -391,26 +390,24 @@ public:<br>
//===----------------------------------------------------------------------===//<br>
<br>
namespace {<br>
-class FindEscaped : public CFGRecStmtDeclVisitor<FindEscaped>{<br>
- CFG *cfg;<br>
+class FindEscaped {<br>
public:<br>
- FindEscaped(CFG *c) : cfg(c) {}<br>
-<br>
- CFG& getCFG() { return *cfg; }<br>
-<br>
llvm::SmallPtrSet<const VarDecl*, 20> Escaped;<br>
<br>
- void VisitUnaryOperator(UnaryOperator* U) {<br>
- // Check for '&'. Any VarDecl whose value has its address-taken we<br>
- // treat as escaped.<br>
- Expr *E = U->getSubExpr()->IgnoreParenCasts();<br>
- if (U->getOpcode() == UO_AddrOf)<br>
- if (DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E))<br>
- if (VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl())) {<br>
- Escaped.insert(VD);<br>
- return;<br>
- }<br>
- Visit(E);<br>
+ void operator()(const Stmt *S) {<br>
+ // Check for '&'. Any VarDecl whose address has been taken we treat as<br>
+ // escaped.<br>
+ // FIXME: What about references?<br>
+ const UnaryOperator *U = dyn_cast<UnaryOperator>(S);<br>
+ if (!U)<br>
+ return;<br>
+ if (U->getOpcode() != UO_AddrOf)<br>
+ return;<br>
+<br>
+ const Expr *E = U->getSubExpr()->IgnoreParenCasts();<br>
+ if (const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E))<br>
+ if (const VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl()))<br>
+ Escaped.insert(VD);<br>
}<br>
};<br>
} // end anonymous namespace<br>
@@ -438,8 +435,8 @@ public:<br>
CFG &cfg = *mgr.getCFG(D);<br>
AnalysisDeclContext *AC = mgr.getAnalysisDeclContext(D);<br>
ParentMap &pmap = mgr.getParentMap(D);<br>
- FindEscaped FS(&cfg);<br>
- FS.getCFG().VisitBlockStmts(FS);<br>
+ FindEscaped FS;<br>
+ cfg.VisitBlockStmts(FS);<br>
DeadStoreObs A(cfg, BR.getContext(), BR, AC, pmap, FS.Escaped);<br>
L->runOnAllBlocks(A);<br>
}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>