Allow BlockInvocationContext to wrap either a BlockDecl* or a BlockDataRegion*, giving us choice in our degree of context-sensitivity.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90516 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/AnalysisContext.cpp b/lib/Analysis/AnalysisContext.cpp
index e28b74d..e903c80 100644
--- a/lib/Analysis/AnalysisContext.cpp
+++ b/lib/Analysis/AnalysisContext.cpp
@@ -13,6 +13,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "clang/Analysis/PathSensitive/AnalysisContext.h"
+#include "clang/Analysis/PathSensitive/MemRegion.h"
 #include "clang/Analysis/Analyses/LiveVariables.h"
 #include "clang/Analysis/CFG.h"
 #include "clang/AST/Decl.h"
@@ -80,6 +81,12 @@
   return AC;
 }
 
+const BlockDecl *BlockInvocationContext::getBlockDecl() const {
+  return Data.is<const BlockDataRegion*>() ?
+    Data.get<const BlockDataRegion*>()->getDecl()
+  : Data.get<const BlockDecl*>();
+}
+
 //===----------------------------------------------------------------------===//
 // FoldingSet profiling.
 //===----------------------------------------------------------------------===//
@@ -104,7 +111,11 @@
 }
 
 void BlockInvocationContext::Profile(llvm::FoldingSetNodeID &ID) {
-  Profile(ID, getAnalysisContext(), getParent(), BD);
+  if (const BlockDataRegion *BR = getBlockRegion())
+    Profile(ID, getAnalysisContext(), getParent(), BR);
+  else
+    Profile(ID, getAnalysisContext(), getParent(),
+            Data.get<const BlockDecl*>());    
 }
 
 //===----------------------------------------------------------------------===//
@@ -146,8 +157,10 @@
 const BlockInvocationContext *
 LocationContextManager::getBlockInvocation(AnalysisContext *ctx,
                                  const LocationContext *parent,
-                                 const BlockDecl *BD) {
-  return getLocationContext<BlockInvocationContext, BlockDecl>(ctx, parent, BD);
+                                 const BlockDataRegion *BR) {
+  return getLocationContext<BlockInvocationContext, BlockDataRegion>(ctx,
+                                                                     parent,
+                                                                     BR);
 }
 
 //===----------------------------------------------------------------------===//