aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Analysis/PathSensitive/AnalysisContext.h52
-rw-r--r--lib/Analysis/AnalysisContext.cpp33
2 files changed, 65 insertions, 20 deletions
diff --git a/include/clang/Analysis/PathSensitive/AnalysisContext.h b/include/clang/Analysis/PathSensitive/AnalysisContext.h
index 8b1a329c03..a5344e6b99 100644
--- a/include/clang/Analysis/PathSensitive/AnalysisContext.h
+++ b/include/clang/Analysis/PathSensitive/AnalysisContext.h
@@ -78,7 +78,7 @@ public:
class LocationContext : public llvm::FoldingSetNode {
public:
- enum ContextKind { StackFrame, Scope };
+ enum ContextKind { StackFrame, Scope, Block };
private:
ContextKind Kind;
@@ -123,11 +123,17 @@ public:
AnalysisContext *ctx, const LocationContext *parent);
static bool classof(const LocationContext*) { return true; }
+
+protected:
+ static void ProfileCommon(llvm::FoldingSetNodeID &ID,
+ ContextKind ck,
+ AnalysisContext *ctx,
+ const LocationContext *parent,
+ const void* data);
};
class StackFrameContext : public LocationContext {
const Stmt *CallSite;
-
public:
StackFrameContext(AnalysisContext *ctx, const LocationContext *parent,
const Stmt *s)
@@ -138,12 +144,12 @@ public:
Stmt const *getCallSite() const { return CallSite; }
- virtual void Profile(llvm::FoldingSetNodeID &ID) {
- Profile(ID, getAnalysisContext(), getParent(), CallSite);
- }
-
+ void Profile(llvm::FoldingSetNodeID &ID);
+
static void Profile(llvm::FoldingSetNodeID &ID, AnalysisContext *ctx,
- const LocationContext *parent, const Stmt *s);
+ const LocationContext *parent, const Stmt *s) {
+ ProfileCommon(ID, StackFrame, ctx, parent, s);
+ }
static bool classof(const LocationContext* Ctx) {
return Ctx->getKind() == StackFrame;
@@ -152,7 +158,6 @@ public:
class ScopeContext : public LocationContext {
const Stmt *Enter;
-
public:
ScopeContext(AnalysisContext *ctx, const LocationContext *parent,
const Stmt *s)
@@ -160,18 +165,41 @@ public:
virtual ~ScopeContext() {}
- virtual void Profile(llvm::FoldingSetNodeID &ID) {
- Profile(ID, getAnalysisContext(), getParent(), Enter);
- }
+ void Profile(llvm::FoldingSetNodeID &ID);
static void Profile(llvm::FoldingSetNodeID &ID, AnalysisContext *ctx,
- const LocationContext *parent, const Stmt *s);
+ const LocationContext *parent, const Stmt *s) {
+ ProfileCommon(ID, Scope, ctx, parent, s);
+ }
static bool classof(const LocationContext* Ctx) {
return Ctx->getKind() == Scope;
}
};
+class BlockInvocationContext : public LocationContext {
+ const BlockDecl *BD;
+public:
+ BlockInvocationContext(const BlockDecl *bd, AnalysisContext *ctx,
+ const LocationContext *parent = 0)
+ : LocationContext(Block, ctx, parent), BD(bd) {}
+
+ ~BlockInvocationContext() {}
+
+ const BlockDecl *getBlockDecl() const { return BD; }
+
+ void Profile(llvm::FoldingSetNodeID &ID);
+
+ static void Profile(llvm::FoldingSetNodeID &ID, AnalysisContext *ctx,
+ const LocationContext *parent, const BlockDecl *bd) {
+ ProfileCommon(ID, Block, ctx, parent, bd);
+ }
+
+ static bool classof(const LocationContext* Ctx) {
+ return Ctx->getKind() == Block;
+ }
+};
+
class LocationContextManager {
llvm::FoldingSet<LocationContext> Contexts;
diff --git a/lib/Analysis/AnalysisContext.cpp b/lib/Analysis/AnalysisContext.cpp
index 339e2c93ce..d79b4e7fe5 100644
--- a/lib/Analysis/AnalysisContext.cpp
+++ b/lib/Analysis/AnalysisContext.cpp
@@ -80,6 +80,10 @@ AnalysisContext *AnalysisContextManager::getContext(const Decl *D) {
return AC;
}
+//===----------------------------------------------------------------------===//
+// FoldingSet profiling.
+//===----------------------------------------------------------------------===//
+
void LocationContext::Profile(llvm::FoldingSetNodeID &ID, ContextKind k,
AnalysisContext *ctx,
const LocationContext *parent) {
@@ -88,18 +92,31 @@ void LocationContext::Profile(llvm::FoldingSetNodeID &ID, ContextKind k,
ID.AddPointer(parent);
}
-void StackFrameContext::Profile(llvm::FoldingSetNodeID &ID,AnalysisContext *ctx,
- const LocationContext *parent, const Stmt *s) {
- LocationContext::Profile(ID, StackFrame, ctx, parent);
- ID.AddPointer(s);
+void LocationContext::ProfileCommon(llvm::FoldingSetNodeID &ID,
+ ContextKind ck,
+ AnalysisContext *ctx,
+ const LocationContext *parent,
+ const void* data) {
+ LocationContext::Profile(ID, ck, ctx, parent);
+ ID.AddPointer(data);
}
-void ScopeContext::Profile(llvm::FoldingSetNodeID &ID, AnalysisContext *ctx,
- const LocationContext *parent, const Stmt *s) {
- LocationContext::Profile(ID, Scope, ctx, parent);
- ID.AddPointer(s);
+void StackFrameContext::Profile(llvm::FoldingSetNodeID &ID) {
+ Profile(ID, getAnalysisContext(), getParent(), CallSite);
}
+void ScopeContext::Profile(llvm::FoldingSetNodeID &ID) {
+ Profile(ID, getAnalysisContext(), getParent(), Enter);
+}
+
+void BlockInvocationContext::Profile(llvm::FoldingSetNodeID &ID) {
+ Profile(ID, getAnalysisContext(), getParent(), BD);
+}
+
+//===----------------------------------------------------------------------===//
+// Cleanup.
+//===----------------------------------------------------------------------===//
+
LocationContextManager::~LocationContextManager() {
clear();
}