summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/AnalysisContext.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-12-04 02:03:51 +0000
committerTed Kremenek <kremenek@apple.com>2009-12-04 02:03:51 +0000
commitc7916f9ff27c834a8e2b9cc6843021bb4c5f09bc (patch)
tree2f38b29ae046958b01e2f0afd948687a6bca8df2 /clang/lib/Analysis/AnalysisContext.cpp
parenta84b6e85f04ac66d2afbb52fad5960c01e228c0e (diff)
downloadbcm5719-llvm-c7916f9ff27c834a8e2b9cc6843021bb4c5f09bc.tar.gz
bcm5719-llvm-c7916f9ff27c834a8e2b9cc6843021bb4c5f09bc.zip
Allow BlockInvocationContext to wrap either a BlockDecl* or a BlockDataRegion*, giving us choice in our degree of context-sensitivity.
llvm-svn: 90516
Diffstat (limited to 'clang/lib/Analysis/AnalysisContext.cpp')
-rw-r--r--clang/lib/Analysis/AnalysisContext.cpp19
1 files changed, 16 insertions, 3 deletions
diff --git a/clang/lib/Analysis/AnalysisContext.cpp b/clang/lib/Analysis/AnalysisContext.cpp
index e28b74dff57..e903c805974 100644
--- a/clang/lib/Analysis/AnalysisContext.cpp
+++ b/clang/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 @@ AnalysisContext *AnalysisContextManager::getContext(const Decl *D) {
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 ScopeContext::Profile(llvm::FoldingSetNodeID &ID) {
}
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 @@ LocationContextManager::getScope(AnalysisContext *ctx,
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);
}
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud