diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-12-04 01:28:56 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-12-04 01:28:56 +0000 |
commit | 0ee4124012950d7bb853438629b8e7652febf183 (patch) | |
tree | d6bc7c14b55b8d0e0774704e854d6790e9d37c0a /include/clang/Analysis/PathSensitive | |
parent | dc0d909f0f6684159c8475db1a15967e5613cb27 (diff) |
Refactor LocationContext creation logic into a single member template.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90509 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang/Analysis/PathSensitive')
-rw-r--r-- | include/clang/Analysis/PathSensitive/AnalysisContext.h | 60 | ||||
-rw-r--r-- | include/clang/Analysis/PathSensitive/AnalysisManager.h | 2 |
2 files changed, 36 insertions, 26 deletions
diff --git a/include/clang/Analysis/PathSensitive/AnalysisContext.h b/include/clang/Analysis/PathSensitive/AnalysisContext.h index a5344e6b99..9d3221d1f1 100644 --- a/include/clang/Analysis/PathSensitive/AnalysisContext.h +++ b/include/clang/Analysis/PathSensitive/AnalysisContext.h @@ -29,6 +29,7 @@ class CFG; class LiveVariables; class ParentMap; class ImplicitParamDecl; +class LocationContextManager; /// AnalysisContext contains the context data for the function or method under /// analysis. @@ -91,7 +92,7 @@ protected: : Kind(k), Ctx(ctx), Parent(parent) {} public: - virtual ~LocationContext() {} + virtual ~LocationContext(); ContextKind getKind() const { return Kind; } @@ -115,16 +116,11 @@ public: return Ctx->getSelfDecl(); } - virtual void Profile(llvm::FoldingSetNodeID &ID) { - Profile(ID, Kind, Ctx, Parent); - } - - static void Profile(llvm::FoldingSetNodeID &ID, ContextKind k, - AnalysisContext *ctx, const LocationContext *parent); + virtual void Profile(llvm::FoldingSetNodeID &ID) = 0; static bool classof(const LocationContext*) { return true; } -protected: +public: static void ProfileCommon(llvm::FoldingSetNodeID &ID, ContextKind ck, AnalysisContext *ctx, @@ -134,15 +130,16 @@ protected: class StackFrameContext : public LocationContext { const Stmt *CallSite; -public: + + friend class LocationContextManager; StackFrameContext(AnalysisContext *ctx, const LocationContext *parent, const Stmt *s) : LocationContext(StackFrame, ctx, parent), CallSite(s) {} - - virtual ~StackFrameContext() {} +public: + ~StackFrameContext() {} - Stmt const *getCallSite() const { return CallSite; } + const Stmt *getCallSite() const { return CallSite; } void Profile(llvm::FoldingSetNodeID &ID); @@ -158,12 +155,14 @@ public: class ScopeContext : public LocationContext { const Stmt *Enter; -public: + + friend class LocationContextManager; ScopeContext(AnalysisContext *ctx, const LocationContext *parent, const Stmt *s) : LocationContext(Scope, ctx, parent), Enter(s) {} - - virtual ~ScopeContext() {} + +public: + ~ScopeContext() {} void Profile(llvm::FoldingSetNodeID &ID); @@ -179,11 +178,13 @@ public: class BlockInvocationContext : public LocationContext { const BlockDecl *BD; -public: - BlockInvocationContext(const BlockDecl *bd, AnalysisContext *ctx, - const LocationContext *parent = 0) + + friend class LocationContextManager; + BlockInvocationContext(AnalysisContext *ctx, const LocationContext *parent, + const BlockDecl *bd) : LocationContext(Block, ctx, parent), BD(bd) {} - + +public: ~BlockInvocationContext() {} const BlockDecl *getBlockDecl() const { return BD; } @@ -202,19 +203,28 @@ public: class LocationContextManager { llvm::FoldingSet<LocationContext> Contexts; - public: ~LocationContextManager(); - StackFrameContext *getStackFrame(AnalysisContext *ctx, - const LocationContext *parent, - const Stmt *s); + const StackFrameContext *getStackFrame(AnalysisContext *ctx, + const LocationContext *parent, + const Stmt *s); - ScopeContext *getScope(AnalysisContext *ctx, const LocationContext *parent, - const Stmt *s); + const ScopeContext *getScope(AnalysisContext *ctx, + const LocationContext *parent, + const Stmt *s); + + const BlockInvocationContext * + getBlockInvocation(AnalysisContext *ctx, const LocationContext *parent, + const BlockDecl *BD); /// Discard all previously created LocationContext objects. void clear(); +private: + template <typename LOC, typename DATA> + const LOC *getLocationContext(AnalysisContext *ctx, + const LocationContext *parent, + const DATA *d); }; } // end clang namespace diff --git a/include/clang/Analysis/PathSensitive/AnalysisManager.h b/include/clang/Analysis/PathSensitive/AnalysisManager.h index 18eae9ac9f..e2219ea845 100644 --- a/include/clang/Analysis/PathSensitive/AnalysisManager.h +++ b/include/clang/Analysis/PathSensitive/AnalysisManager.h @@ -132,7 +132,7 @@ public: } // Get the top level stack frame. - StackFrameContext *getStackFrame(Decl const *D) { + const StackFrameContext *getStackFrame(Decl const *D) { return LocCtxMgr.getStackFrame(AnaCtxMgr.getContext(D), 0, 0); } |