]> granicus.if.org Git - clang/commitdiff
Refactor FoldingSet profiling code for LocationContexts, and add a new BlockInvocatio...
authorTed Kremenek <kremenek@apple.com>
Fri, 4 Dec 2009 00:50:10 +0000 (00:50 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 4 Dec 2009 00:50:10 +0000 (00:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90506 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathSensitive/AnalysisContext.h
lib/Analysis/AnalysisContext.cpp

index 8b1a329c0335ce41ab0b90bfde4622b7871088e2..a5344e6b99e0b5a5a84ce06f929ebc0f6df7364a 100644 (file)
@@ -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;
 
index 339e2c93cea90bcebf5238e373cfdacba2f8fdc6..d79b4e7fe59bb13a49aaf3d78dedcfd73608f76e 100644 (file)
@@ -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();
 }