[cfe-commits] r79072 - in /cfe/trunk: include/clang/Analysis/FlowSensitive/DataflowSolver.h include/clang/Analysis/PathSensitive/AnalysisManager.h include/clang/Analysis/PathSensitive/ExplodedGraph.h include/clang/Analysis/PathSensitive/GRCoreEngine.h include/clang/Analysis/PathSensitive/GRExprEngine.h include/clang/Analysis/ProgramPoint.h lib/Analysis/CFRefCount.cpp lib/Analysis/GRCoreEngine.cpp lib/Analysis/GRExprEngine.cpp lib/Frontend/AnalysisConsumer.cpp
Ted Kremenek
kremenek at apple.com
Fri Aug 14 22:25:56 PDT 2009
Looks great! This should capture most of the context-sensitivity we
need to perform inlining-based interprocedural analysis with
ExplodedGraph.
On Aug 14, 2009, at 8:17 PM, Zhongxing Xu <xuzhongxing at gmail.com> wrote:
> Author: zhongxingxu
> Date: Fri Aug 14 22:17:38 2009
> New Revision: 79072
>
> URL: http://llvm.org/viewvc/llvm-project?rev=79072&view=rev
> Log:
> Extend the ProgramPoint to include the context information
> LocationContext,
> which is either a stack frame context of the function or a local scope
> context.
>
> Modified:
> cfe/trunk/include/clang/Analysis/FlowSensitive/DataflowSolver.h
> cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisManager.h
> cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedGraph.h
> cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h
> cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
> cfe/trunk/include/clang/Analysis/ProgramPoint.h
> cfe/trunk/lib/Analysis/CFRefCount.cpp
> cfe/trunk/lib/Analysis/GRCoreEngine.cpp
> cfe/trunk/lib/Analysis/GRExprEngine.cpp
> cfe/trunk/lib/Frontend/AnalysisConsumer.cpp
>
> Modified: cfe/trunk/include/clang/Analysis/FlowSensitive/
> DataflowSolver.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/FlowSensitive/DataflowSolver.h?rev=79072&r1=79071&r2=79072&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/include/clang/Analysis/FlowSensitive/DataflowSolver.h
> (original)
> +++ cfe/trunk/include/clang/Analysis/FlowSensitive/DataflowSolver.h
> Fri Aug 14 22:17:38 2009
> @@ -24,7 +24,7 @@
> //
> ===
> ---
> -------------------------------------------------------------------
> ===//
> /// DataflowWorkListTy - Data structure representing the worklist
> used for
> /// dataflow algorithms.
> -//
> ===
> ---
> -------------------------------------------------------------------
> ===//
> +//
> ===
> ---
> -------------------------------------------------------------------
> ===//
>
> class DataflowWorkListTy {
> typedef llvm::SmallPtrSet<const CFGBlock*,20> BlockSet;
> @@ -70,11 +70,11 @@
> static StmtItr StmtEnd(const CFGBlock* B) { return B->end(); }
>
> static BlockEdge PrevEdge(const CFGBlock* B, const CFGBlock* Prev) {
> - return BlockEdge(Prev, B);
> + return BlockEdge(Prev, B, 0);
> }
>
> static BlockEdge NextEdge(const CFGBlock* B, const CFGBlock* Next) {
> - return BlockEdge(B, Next);
> + return BlockEdge(B, Next, 0);
> }
> };
>
> @@ -93,11 +93,11 @@
> static StmtItr StmtEnd(const CFGBlock* B) { return B->rend(); }
>
> static BlockEdge PrevEdge(const CFGBlock* B, const CFGBlock* Prev) {
> - return BlockEdge(B, Prev);
> + return BlockEdge(B, Prev, 0);
> }
>
> static BlockEdge NextEdge(const CFGBlock* B, const CFGBlock* Next) {
> - return BlockEdge(Next, B);
> + return BlockEdge(Next, B, 0);
> }
> };
> } // end namespace dataflow
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/
> AnalysisManager.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisManager.h?rev=79072&r1=79071&r2=79072&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisManager.h
> (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisManager.h
> Fri Aug 14 22:17:38 2009
> @@ -23,7 +23,7 @@
>
> class AnalysisManager : public BugReporterData {
> AnalysisContextManager ContextMgr;
> - AnalysisContext *RootContext;
> + AnalysisContext *EntryContext;
>
> LocationContextManager LocCtxMgr;
>
> @@ -59,7 +59,7 @@
> VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead
> (purge),
> EagerlyAssume(eager), TrimGraph(trim) {
>
> - RootContext = ContextMgr.getContext(d);
> + EntryContext = ContextMgr.getContext(d);
> }
>
> AnalysisManager(ASTContext &ctx, Diagnostic &diags,
> @@ -75,22 +75,22 @@
> VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead
> (purge),
> EagerlyAssume(eager), TrimGraph(trim) {
>
> - RootContext = 0;
> + EntryContext = 0;
> }
>
> - void setContext(Decl *D) {
> - RootContext = ContextMgr.getContext(D);
> + void setEntryContext(Decl *D) {
> + EntryContext = ContextMgr.getContext(D);
> DisplayedFunction = false;
> }
>
> Decl *getCodeDecl() const {
> assert (AScope == ScopeDecl);
> - return RootContext->getDecl();
> + return EntryContext->getDecl();
> }
>
> Stmt *getBody() const {
> assert (AScope == ScopeDecl);
> - return RootContext->getBody();
> + return EntryContext->getBody();
> }
>
> StoreManagerCreator getStoreManagerCreator() {
> @@ -102,15 +102,15 @@
> }
>
> virtual CFG *getCFG() {
> - return RootContext->getCFG();
> + return EntryContext->getCFG();
> }
>
> virtual ParentMap &getParentMap() {
> - return RootContext->getParentMap();
> + return EntryContext->getParentMap();
> }
>
> virtual LiveVariables *getLiveVariables() {
> - return RootContext->getLiveVariables();
> + return EntryContext->getLiveVariables();
> }
>
> virtual ASTContext &getContext() {
> @@ -133,8 +133,8 @@
> return PD.get();
> }
>
> - StackFrameContext *getRootStackFrame() {
> - return LocCtxMgr.getStackFrame(RootContext, 0, 0);
> + StackFrameContext *getEntryStackFrame() {
> + return LocCtxMgr.getStackFrame(EntryContext, 0, 0);
> }
>
> bool shouldVisualizeGraphviz() const { return VisualizeEGDot; }
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/
> ExplodedGraph.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedGraph.h?rev=79072&r1=79071&r2=79072&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedGraph.h
> (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedGraph.h
> Fri Aug 14 22:17:38 2009
> @@ -39,7 +39,6 @@
> //
> ===
> ---
> -------------------------------------------------------------------
> ===//
>
> class ExplodedNode : public llvm::FoldingSetNode {
> -protected:
> friend class ExplodedGraph;
> friend class GRCoreEngine;
> friend class GRStmtNodeBuilder;
> @@ -111,6 +110,10 @@
> /// getLocation - Returns the edge associated with the given node.
> ProgramPoint getLocation() const { return Location; }
>
> + const LocationContext *getLocationContext() const {
> + return getLocation().getContext();
> + }
> +
> const GRState* getState() const {
> return State;
> }
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/
> GRCoreEngine.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h?rev=79072&r1=79071&r2=79072&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h
> (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h
> Fri Aug 14 22:17:38 2009
> @@ -124,7 +124,7 @@
>
> /// ExecuteWorkList - Run the worklist algorithm for a maximum
> number of
> /// steps. Returns true if there is still simulation state on
> the worklist.
> - bool ExecuteWorkList(unsigned Steps);
> + bool ExecuteWorkList(const LocationContext *L, unsigned Steps);
>
> CFG& getCFG() { return G->getCFG(); }
> };
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/
> GRExprEngine.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h?rev=79072&r1=79071&r2=79072&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
> (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
> Fri Aug 14 22:17:38 2009
> @@ -16,6 +16,7 @@
> #ifndef LLVM_CLANG_ANALYSIS_GREXPRENGINE
> #define LLVM_CLANG_ANALYSIS_GREXPRENGINE
>
> +#include "clang/Analysis/PathSensitive/AnalysisManager.h"
> #include "clang/Analysis/PathSensitive/GRSubEngine.h"
> #include "clang/Analysis/PathSensitive/GRCoreEngine.h"
> #include "clang/Analysis/PathSensitive/GRState.h"
> @@ -33,7 +34,8 @@
> class Checker;
>
> class GRExprEngine : public GRSubEngine {
> -protected:
> + AnalysisManager &AMgr;
> +
> GRCoreEngine CoreEngine;
>
> /// G - the simulation graph.
> @@ -201,15 +203,15 @@
>
> public:
> GRExprEngine(CFG& cfg, Decl& CD, ASTContext& Ctx, LiveVariables& L,
> - BugReporterData& BRD,
> + AnalysisManager &mgr,
> bool purgeDead, bool eagerlyAssume = true,
> StoreManagerCreator SMC = CreateBasicStoreManager,
> ConstraintManagerCreator CMC =
> CreateBasicConstraintManager);
>
> ~GRExprEngine();
>
> - void ExecuteWorkList(unsigned Steps = 150000) {
> - CoreEngine.ExecuteWorkList(Steps);
> + void ExecuteWorkList(const LocationContext *L, unsigned Steps =
> 150000) {
> + CoreEngine.ExecuteWorkList(L, Steps);
> }
>
> /// getContext - Return the ASTContext associated with this
> analysis.
>
> Modified: cfe/trunk/include/clang/Analysis/ProgramPoint.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/ProgramPoint.h?rev=79072&r1=79071&r2=79072&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/include/clang/Analysis/ProgramPoint.h (original)
> +++ cfe/trunk/include/clang/Analysis/ProgramPoint.h Fri Aug 14
> 22:17:38 2009
> @@ -24,6 +24,8 @@
> #include <utility>
>
> namespace clang {
> +
> +class LocationContext;
>
> class ProgramPoint {
> public:
> @@ -48,14 +50,20 @@
> private:
> std::pair<const void *, const void *> Data;
> Kind K;
> +
> + // The LocationContext could be NULL to allow ProgramPoint to be
> used in
> + // context insensitive analysis.
> + const LocationContext *L;
> const void *Tag;
>
> protected:
> - ProgramPoint(const void* P, Kind k, const void *tag = 0)
> - : Data(P, NULL), K(k), Tag(tag) {}
> + ProgramPoint(const void* P, Kind k, const LocationContext *l,
> + const void *tag = 0)
> + : Data(P, NULL), K(k), L(l), Tag(tag) {}
>
> - ProgramPoint(const void* P1, const void* P2, Kind k, const void
> *tag = 0)
> - : Data(P1, P2), K(k), Tag(tag) {}
> + ProgramPoint(const void* P1, const void* P2, Kind k, const
> LocationContext *l,
> + const void *tag = 0)
> + : Data(P1, P2), K(k), L(l), Tag(tag) {}
>
> protected:
> const void* getData1() const { return Data.first; }
> @@ -65,6 +73,8 @@
> public:
> Kind getKind() const { return K; }
>
> + const LocationContext *getContext() const { return L; }
> +
> // For use with DenseMap. This hash is probably slow.
> unsigned getHashValue() const {
> llvm::FoldingSetNodeID ID;
> @@ -75,25 +85,27 @@
> static bool classof(const ProgramPoint*) { return true; }
>
> bool operator==(const ProgramPoint & RHS) const {
> - return K == RHS.K && Data == RHS.Data && Tag == RHS.Tag;
> + return K == RHS.K && Data == RHS.Data && L == RHS.L && Tag ==
> RHS.Tag;
> }
>
> bool operator!=(const ProgramPoint& RHS) const {
> - return K != RHS.K || Data != RHS.Data || Tag != RHS.Tag;
> + return K != RHS.K || Data != RHS.Data || L != RHS.L || Tag !=
> RHS.Tag;
> }
>
> void Profile(llvm::FoldingSetNodeID& ID) const {
> ID.AddInteger((unsigned) K);
> ID.AddPointer(Data.first);
> ID.AddPointer(Data.second);
> + ID.AddPointer(L);
> ID.AddPointer(Tag);
> }
> };
>
> class BlockEntrance : public ProgramPoint {
> public:
> - BlockEntrance(const CFGBlock* B, const void *tag = 0)
> - : ProgramPoint(B, BlockEntranceKind, tag) {}
> + BlockEntrance(const CFGBlock* B, const LocationContext *L,
> + const void *tag = 0)
> + : ProgramPoint(B, BlockEntranceKind, L, tag) {}
>
> CFGBlock* getBlock() const {
> return const_cast<CFGBlock*>(reinterpret_cast<const CFGBlock*>
> (getData1()));
> @@ -111,7 +123,8 @@
>
> class BlockExit : public ProgramPoint {
> public:
> - BlockExit(const CFGBlock* B) : ProgramPoint(B, BlockExitKind) {}
> + BlockExit(const CFGBlock* B, const LocationContext *L)
> + : ProgramPoint(B, BlockExitKind, L) {}
>
> CFGBlock* getBlock() const {
> return const_cast<CFGBlock*>(reinterpret_cast<const CFGBlock*>
> (getData1()));
> @@ -133,8 +146,9 @@
>
> class StmtPoint : public ProgramPoint {
> public:
> - StmtPoint(const Stmt *S, const void *p2, Kind k, const void *tag)
> - : ProgramPoint(S, p2, k, tag) {}
> + StmtPoint(const Stmt *S, const void *p2, Kind k, const
> LocationContext *L,
> + const void *tag)
> + : ProgramPoint(S, p2, k, L, tag) {}
>
> const Stmt *getStmt() const { return (const Stmt*) getData1(); }
>
> @@ -150,8 +164,9 @@
>
> class PreStmt : public StmtPoint {
> public:
> - PreStmt(const Stmt *S, const void *tag, const Stmt *SubStmt = 0)
> - : StmtPoint(S, SubStmt, PreStmtKind, tag) {}
> + PreStmt(const Stmt *S, const LocationContext *L, const void *tag,
> + const Stmt *SubStmt = 0)
> + : StmtPoint(S, SubStmt, PreStmtKind, L, tag) {}
>
> const Stmt *getSubStmt() const { return (const Stmt*) getData2(); }
>
> @@ -162,15 +177,16 @@
>
> class PostStmt : public StmtPoint {
> protected:
> - PostStmt(const Stmt* S, Kind k, const void *tag = 0)
> - : StmtPoint(S, NULL, k, tag) {}
> + PostStmt(const Stmt* S, Kind k, const LocationContext *L, const
> void *tag = 0)
> + : StmtPoint(S, NULL, k, L, tag) {}
>
> - PostStmt(const Stmt* S, const void* data, Kind k, const void *tag
> =0)
> - : StmtPoint(S, data, k, tag) {}
> + PostStmt(const Stmt* S, const void* data, Kind k, const
> LocationContext *L,
> + const void *tag =0)
> + : StmtPoint(S, data, k, L, tag) {}
>
> public:
> - explicit PostStmt(const Stmt* S, const void *tag = 0)
> - : StmtPoint(S, NULL, PostStmtKind, tag) {}
> + explicit PostStmt(const Stmt* S, const LocationContext *L,const
> void *tag = 0)
> + : StmtPoint(S, NULL, PostStmtKind, L, tag) {}
>
> static bool classof(const ProgramPoint* Location) {
> unsigned k = Location->getKind();
> @@ -180,8 +196,9 @@
>
> class PostLocationChecksSucceed : public PostStmt {
> public:
> - PostLocationChecksSucceed(const Stmt* S, const void *tag = 0)
> - : PostStmt(S, PostLocationChecksSucceedKind, tag) {}
> + PostLocationChecksSucceed(const Stmt* S, const LocationContext *L,
> + const void *tag = 0)
> + : PostStmt(S, PostLocationChecksSucceedKind, L, tag) {}
>
> static bool classof(const ProgramPoint* Location) {
> return Location->getKind() == PostLocationChecksSucceedKind;
> @@ -191,8 +208,9 @@
> class PostStmtCustom : public PostStmt {
> public:
> PostStmtCustom(const Stmt* S,
> - const std::pair<const void*, const void*>*
> TaggedData)
> - : PostStmt(S, TaggedData, PostStmtCustomKind) {}
> + const std::pair<const void*, const void*>*
> TaggedData,\
> + const LocationContext *L)
> + : PostStmt(S, TaggedData, PostStmtCustomKind, L) {}
>
> const std::pair<const void*, const void*>& getTaggedPair() const {
> return
> @@ -210,8 +228,9 @@
>
> class PostOutOfBoundsCheckFailed : public PostStmt {
> public:
> - PostOutOfBoundsCheckFailed(const Stmt* S, const void *tag = 0)
> - : PostStmt(S, PostOutOfBoundsCheckFailedKind, tag) {}
> + PostOutOfBoundsCheckFailed(const Stmt* S, const LocationContext *L,
> + const void *tag = 0)
> + : PostStmt(S, PostOutOfBoundsCheckFailedKind, L, tag) {}
>
> static bool classof(const ProgramPoint* Location) {
> return Location->getKind() == PostOutOfBoundsCheckFailedKind;
> @@ -220,8 +239,9 @@
>
> class PostUndefLocationCheckFailed : public PostStmt {
> public:
> - PostUndefLocationCheckFailed(const Stmt* S, const void *tag = 0)
> - : PostStmt(S, PostUndefLocationCheckFailedKind, tag) {}
> + PostUndefLocationCheckFailed(const Stmt* S, const LocationContext
> *L,
> + const void *tag = 0)
> + : PostStmt(S, PostUndefLocationCheckFailedKind, L, tag) {}
>
> static bool classof(const ProgramPoint* Location) {
> return Location->getKind() == PostUndefLocationCheckFailedKind;
> @@ -230,8 +250,9 @@
>
> class PostNullCheckFailed : public PostStmt {
> public:
> - PostNullCheckFailed(const Stmt* S, const void *tag = 0)
> - : PostStmt(S, PostNullCheckFailedKind, tag) {}
> + PostNullCheckFailed(const Stmt* S, const LocationContext *L,
> + const void *tag = 0)
> + : PostStmt(S, PostNullCheckFailedKind, L, tag) {}
>
> static bool classof(const ProgramPoint* Location) {
> return Location->getKind() == PostNullCheckFailedKind;
> @@ -240,8 +261,8 @@
>
> class PostLoad : public PostStmt {
> public:
> - PostLoad(const Stmt* S, const void *tag = 0)
> - : PostStmt(S, PostLoadKind, tag) {}
> + PostLoad(const Stmt* S, const LocationContext *L, const void *tag
> = 0)
> + : PostStmt(S, PostLoadKind, L, tag) {}
>
> static bool classof(const ProgramPoint* Location) {
> return Location->getKind() == PostLoadKind;
> @@ -250,8 +271,8 @@
>
> class PostStore : public PostStmt {
> public:
> - PostStore(const Stmt* S, const void *tag = 0)
> - : PostStmt(S, PostStoreKind, tag) {}
> + PostStore(const Stmt* S, const LocationContext *L, const void
> *tag = 0)
> + : PostStmt(S, PostStoreKind, L, tag) {}
>
> static bool classof(const ProgramPoint* Location) {
> return Location->getKind() == PostStoreKind;
> @@ -260,8 +281,8 @@
>
> class PostLValue : public PostStmt {
> public:
> - PostLValue(const Stmt* S, const void *tag = 0)
> - : PostStmt(S, PostLValueKind, tag) {}
> + PostLValue(const Stmt* S, const LocationContext *L, const void
> *tag = 0)
> + : PostStmt(S, PostLValueKind, L, tag) {}
>
> static bool classof(const ProgramPoint* Location) {
> return Location->getKind() == PostLValueKind;
> @@ -270,8 +291,9 @@
>
> class PostPurgeDeadSymbols : public PostStmt {
> public:
> - PostPurgeDeadSymbols(const Stmt* S, const void *tag = 0)
> - : PostStmt(S, PostPurgeDeadSymbolsKind, tag) {}
> + PostPurgeDeadSymbols(const Stmt* S, const LocationContext *L,
> + const void *tag = 0)
> + : PostStmt(S, PostPurgeDeadSymbolsKind, L, tag) {}
>
> static bool classof(const ProgramPoint* Location) {
> return Location->getKind() == PostPurgeDeadSymbolsKind;
> @@ -280,8 +302,8 @@
>
> class BlockEdge : public ProgramPoint {
> public:
> - BlockEdge(const CFGBlock* B1, const CFGBlock* B2)
> - : ProgramPoint(B1, B2, BlockEdgeKind) {}
> + BlockEdge(const CFGBlock* B1, const CFGBlock* B2, const
> LocationContext *L)
> + : ProgramPoint(B1, B2, BlockEdgeKind, L) {}
>
> CFGBlock* getSrc() const {
> return const_cast<CFGBlock*>(static_cast<const CFGBlock*>
> (getData1()));
> @@ -307,13 +329,13 @@
> static inline clang::ProgramPoint getEmptyKey() {
> uintptr_t x =
> reinterpret_cast<uintptr_t>(DenseMapInfo<void*>::getEmptyKey()) &
> ~0x7;
> - return clang::BlockEntrance(reinterpret_cast<clang::CFGBlock*>(x));
> + return clang::BlockEntrance(reinterpret_cast<clang::CFGBlock*>
> (x), 0);
> }
>
> static inline clang::ProgramPoint getTombstoneKey() {
> uintptr_t x =
> - reinterpret_cast<uintptr_t>(DenseMapInfo<void*>::getTombstoneKey
> ()) & ~0x7;
> - return clang::BlockEntrance(reinterpret_cast<clang::CFGBlock*>(x));
> + reinterpret_cast<uintptr_t>(DenseMapInfo<void*>::getTombstoneKey
> ()) & ~0x7;
> + return clang::BlockEntrance(reinterpret_cast<clang::CFGBlock*>
> (x), 0);
> }
>
> static unsigned getHashValue(const clang::ProgramPoint& Loc) {
>
> Modified: cfe/trunk/lib/Analysis/CFRefCount.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=79072&r1=79071&r2=79072&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)
> +++ cfe/trunk/lib/Analysis/CFRefCount.cpp Fri Aug 14 22:17:38 2009
> @@ -181,7 +181,8 @@
>
> ExplodedNode *MakeNode(const GRState *state, ExplodedNode *Pred) {
> if (SNB)
> - return SNB->generateNode(PostStmt(S, tag), state, Pred);
> + return SNB->generateNode(PostStmt(S, Pred->getLocationContext
> (), tag),
> + state, Pred);
>
> assert(ENB);
> return ENB->generateNode(state, Pred);
> @@ -3203,7 +3204,8 @@
> static int ReturnOwnLeakTag = 0;
> state = state->set<RefBindings>(Sym, X);
> ExplodedNode *N =
> - Builder.generateNode(PostStmt(S, &ReturnOwnLeakTag),
> state, Pred);
> + Builder.generateNode(PostStmt(S, Pred->getLocationContext
> (),
> + &ReturnOwnLeakTag), state,
> Pred);
> if (N) {
> CFRefReport *report =
> new CFRefLeakReport(*static_cast<CFRefBug*>
> (leakAtReturn), *this,
> @@ -3224,8 +3226,9 @@
> static int ReturnNotOwnedForOwnedTag = 0;
> state = state->set<RefBindings>(Sym, X ^
> RefVal::ErrorReturnedNotOwned);
> if (ExplodedNode *N =
> - Builder.generateNode(PostStmt(S,
> &ReturnNotOwnedForOwnedTag),
> - state, Pred)) {
> + Builder.generateNode(PostStmt(S, Pred-
> >getLocationContext(),
> +
> &ReturnNotOwnedForOwnedTag),
> + state, Pred)) {
> CFRefReport *report =
> new CFRefReport(*static_cast<CFRefBug*>
> (returnNotOwnedForOwned),
> *this, N, Sym);
>
> Modified: cfe/trunk/lib/Analysis/GRCoreEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRCoreEngine.cpp?rev=79072&r1=79071&r2=79072&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/lib/Analysis/GRCoreEngine.cpp (original)
> +++ cfe/trunk/lib/Analysis/GRCoreEngine.cpp Fri Aug 14 22:17:38 2009
> @@ -146,7 +146,7 @@
> }
>
> /// ExecuteWorkList - Run the worklist algorithm for a maximum
> number of steps.
> -bool GRCoreEngine::ExecuteWorkList(unsigned Steps) {
> +bool GRCoreEngine::ExecuteWorkList(const LocationContext *L,
> unsigned Steps) {
>
> if (G->num_roots() == 0) { // Initialize the analysis by
> constructing
> // the root if none exists.
> @@ -164,7 +164,7 @@
>
> // Construct an edge representing the
> // starting location in the function.
> - BlockEdge StartLoc(Entry, Succ);
> + BlockEdge StartLoc(Entry, Succ, L);
>
> // Set the current block counter to being empty.
> WList->setBlockCounter(BCounterFactory.GetEmptyCounter());
> @@ -230,7 +230,7 @@
> // FIXME: Should we allow ProcessBlockEntrance to also manipulate
> state?
>
> if (ProcessBlockEntrance(Blk, Pred->State, WList->getBlockCounter
> ()))
> - GenerateNode(BlockEntrance(Blk), Pred->State, Pred);
> + GenerateNode(BlockEntrance(Blk, Pred->getLocationContext()),
> Pred->State, Pred);
> }
>
> void GRCoreEngine::HandleBlockEntrance(const BlockEntrance& L,
> @@ -335,7 +335,8 @@
> assert (B->succ_size() == 1 &&
> "Blocks with no terminator should have at most 1
> successor.");
>
> - GenerateNode(BlockEdge(B, *(B->succ_begin())), Pred->State, Pred);
> + GenerateNode(BlockEdge(B, *(B->succ_begin()), Pred-
> >getLocationContext()),
> + Pred->State, Pred);
> }
>
> void GRCoreEngine::HandleBranch(Stmt* Cond, Stmt* Term, CFGBlock * B,
> @@ -400,7 +401,7 @@
> void GRStmtNodeBuilder::GenerateAutoTransition(ExplodedNode* N) {
> assert (!N->isSink());
>
> - PostStmt Loc(getStmt());
> + PostStmt Loc(getStmt(), N->getLocationContext());
>
> if (Loc == N->getLocation()) {
> // Note: 'N' should be a fresh node because otherwise it
> shouldn't be
> @@ -418,37 +419,37 @@
> }
>
> static inline PostStmt GetPostLoc(const Stmt* S, ProgramPoint::Kind K,
> - const void *tag) {
> + const LocationContext *L, const
> void *tag) {
> switch (K) {
> default:
> assert(false && "Invalid PostXXXKind.");
>
> case ProgramPoint::PostStmtKind:
> - return PostStmt(S, tag);
> + return PostStmt(S, L, tag);
>
> case ProgramPoint::PostLoadKind:
> - return PostLoad(S, tag);
> + return PostLoad(S, L, tag);
>
> case ProgramPoint::PostUndefLocationCheckFailedKind:
> - return PostUndefLocationCheckFailed(S, tag);
> + return PostUndefLocationCheckFailed(S, L, tag);
>
> case ProgramPoint::PostLocationChecksSucceedKind:
> - return PostLocationChecksSucceed(S, tag);
> + return PostLocationChecksSucceed(S, L, tag);
>
> case ProgramPoint::PostOutOfBoundsCheckFailedKind:
> - return PostOutOfBoundsCheckFailed(S, tag);
> + return PostOutOfBoundsCheckFailed(S, L, tag);
>
> case ProgramPoint::PostNullCheckFailedKind:
> - return PostNullCheckFailed(S, tag);
> + return PostNullCheckFailed(S, L, tag);
>
> case ProgramPoint::PostStoreKind:
> - return PostStore(S, tag);
> + return PostStore(S, L, tag);
>
> case ProgramPoint::PostLValueKind:
> - return PostLValue(S, tag);
> + return PostLValue(S, L, tag);
>
> case ProgramPoint::PostPurgeDeadSymbolsKind:
> - return PostPurgeDeadSymbols(S, tag);
> + return PostPurgeDeadSymbols(S, L, tag);
> }
> }
>
> @@ -458,8 +459,10 @@
> ProgramPoint::Kind K,
> const void *tag) {
> return K == ProgramPoint::PreStmtKind
> - ? generateNodeInternal(PreStmt(S, tag), State, Pred)
> - : generateNodeInternal(GetPostLoc(S, K, tag), State, Pred);
> + ? generateNodeInternal(PreStmt(S, Pred->getLocationContext
> (),tag),
> + State, Pred)
> + : generateNodeInternal(GetPostLoc(S, K, Pred-
> >getLocationContext(), tag),
> + State, Pred);
> }
>
> ExplodedNode*
> @@ -491,7 +494,8 @@
> bool IsNew;
>
> ExplodedNode* Succ =
> - Eng.G->getNode(BlockEdge(Src, branch ? DstT : DstF), State,
> &IsNew);
> + Eng.G->getNode(BlockEdge(Src,branch ? DstT:DstF,Pred-
> >getLocationContext()),
> + State, &IsNew);
>
> Succ->addPredecessor(Pred);
>
> @@ -522,7 +526,8 @@
> bool isSink) {
> bool IsNew;
>
> - ExplodedNode* Succ = Eng.G->getNode(BlockEdge(Src, I.getBlock()),
> St, &IsNew);
> + ExplodedNode* Succ = Eng.G->getNode(BlockEdge(Src, I.getBlock(),
> + Pred->getLocationContext()),
> St, &IsNew);
>
> Succ->addPredecessor(Pred);
>
> @@ -545,7 +550,8 @@
>
> bool IsNew;
>
> - ExplodedNode* Succ = Eng.G->getNode(BlockEdge(Src, I.getBlock()),
> St, &IsNew);
> + ExplodedNode* Succ = Eng.G->getNode(BlockEdge(Src, I.getBlock(),
> + Pred->getLocationContext()),
> St, &IsNew);
> Succ->addPredecessor(Pred);
>
> if (IsNew) {
> @@ -566,7 +572,8 @@
>
> bool IsNew;
>
> - ExplodedNode* Succ = Eng.G->getNode(BlockEdge(Src, DefaultBlock),
> St, &IsNew);
> + ExplodedNode* Succ = Eng.G->getNode(BlockEdge(Src, DefaultBlock,
> + Pred->getLocationContext()),
> St, &IsNew);
> Succ->addPredecessor(Pred);
>
> if (IsNew) {
> @@ -592,7 +599,8 @@
> HasGeneratedNode = true;
> bool IsNew;
>
> - ExplodedNode* Node = Eng.G->getNode(BlockEntrance(&B, tag),
> State, &IsNew);
> + ExplodedNode* Node = Eng.G->getNode(BlockEntrance(&B,
> + Pred->getLocationContext(), tag),
> State, &IsNew);
>
> Node->addPredecessor(P ? P : Pred);
>
>
> Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=79072&r1=79071&r2=79072&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
> +++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Fri Aug 14 22:17:38 2009
> @@ -149,11 +149,12 @@
>
>
> GRExprEngine::GRExprEngine(CFG& cfg, Decl& CD, ASTContext& Ctx,
> - LiveVariables& L, BugReporterData& BRD,
> + LiveVariables& L, AnalysisManager &mgr,
> bool purgeDead, bool eagerlyAssume,
> StoreManagerCreator SMC,
> ConstraintManagerCreator CMC)
> - : CoreEngine(cfg, CD, Ctx, *this),
> + : AMgr(mgr),
> + CoreEngine(cfg, CD, Ctx, *this),
> G(CoreEngine.getGraph()),
> Liveness(L),
> Builder(NULL),
> @@ -165,7 +166,7 @@
> NSExceptionII(NULL), NSExceptionInstanceRaiseSelectors(NULL),
> RaiseSel(GetNullarySelector("raise", G.getContext())),
> PurgeDead(purgeDead),
> - BR(BRD, *this),
> + BR(mgr, *this),
> EagerlyAssume(eagerlyAssume) {}
>
> GRExprEngine::~GRExprEngine() {
> @@ -1699,7 +1700,8 @@
> if (const GRState *stateTrue = state->assume(V, true)) {
> stateTrue = stateTrue->bindExpr(Ex,
> ValMgr.makeIntVal(1U, Ex-
> >getType()));
> - Dst.Add(Builder->generateNode(PostStmtCustom(Ex,
> &EagerlyAssumeTag),
> + Dst.Add(Builder->generateNode(PostStmtCustom(Ex,
> + &EagerlyAssumeTag, Pred-
> >getLocationContext()),
> stateTrue, Pred));
> }
>
> @@ -1707,7 +1709,8 @@
> if (const GRState *stateFalse = state->assume(V, false)) {
> stateFalse = stateFalse->bindExpr(Ex,
> ValMgr.makeIntVal(0U, Ex-
> >getType()));
> - Dst.Add(Builder->generateNode(PostStmtCustom(Ex,
> &EagerlyAssumeTag),
> + Dst.Add(Builder->generateNode(PostStmtCustom(Ex,
> &EagerlyAssumeTag,
> + Pred-
> >getLocationContext()),
> stateFalse, Pred));
> }
> }
>
> Modified: cfe/trunk/lib/Frontend/AnalysisConsumer.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/AnalysisConsumer.cpp?rev=79072&r1=79071&r2=79072&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/lib/Frontend/AnalysisConsumer.cpp (original)
> +++ cfe/trunk/lib/Frontend/AnalysisConsumer.cpp Fri Aug 14 22:17:38
> 2009
> @@ -258,7 +258,7 @@
> !Ctx->getSourceManager().isFromMainFile(D->getLocation()))
> return;
>
> - Mgr->setContext(D);
> + Mgr->setEntryContext(D);
>
> // Dispatch on the actions.
> for (Actions::iterator I = actions.begin(), E = actions.end(); I !
> = E; ++I)
> @@ -315,7 +315,7 @@
> }
>
> // Execute the worklist algorithm.
> - Eng.ExecuteWorkList();
> + Eng.ExecuteWorkList(mgr.getEntryStackFrame());
>
> // Release the auditor (if any) so that it doesn't monitor the graph
> // created BugReporter.
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list