aboutsummaryrefslogtreecommitdiff
path: root/include/clang/Analysis/PathSensitive
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-12-04 01:28:56 +0000
committerTed Kremenek <kremenek@apple.com>2009-12-04 01:28:56 +0000
commit0ee4124012950d7bb853438629b8e7652febf183 (patch)
treed6bc7c14b55b8d0e0774704e854d6790e9d37c0a /include/clang/Analysis/PathSensitive
parentdc0d909f0f6684159c8475db1a15967e5613cb27 (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.h60
-rw-r--r--include/clang/Analysis/PathSensitive/AnalysisManager.h2
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);
}