Refactor FoldingSet profiling code for LocationContexts, and add a new BlockInvocationContext to represent the invocation of a block.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90506 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/AnalysisContext.cpp b/lib/Analysis/AnalysisContext.cpp
index 339e2c9..d79b4e7 100644
--- a/lib/Analysis/AnalysisContext.cpp
+++ b/lib/Analysis/AnalysisContext.cpp
@@ -80,6 +80,10 @@
   return AC;
 }
 
+//===----------------------------------------------------------------------===//
+// FoldingSet profiling.
+//===----------------------------------------------------------------------===//
+
 void LocationContext::Profile(llvm::FoldingSetNodeID &ID, ContextKind k,
                               AnalysisContext *ctx,
                               const LocationContext *parent) {
@@ -88,18 +92,31 @@
   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();
 }