diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-12-04 02:03:51 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-12-04 02:03:51 +0000 |
commit | d02e83a548359df978f40cc1a52ffd78b7ef371b (patch) | |
tree | f341ff4968e3edd6d1fbfb00fc8f957ad128e167 /lib/Analysis/AnalysisContext.cpp | |
parent | c7ab1a8dfc3e37b7c2967ff6a97ed684f0ac1015 (diff) |
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
Diffstat (limited to 'lib/Analysis/AnalysisContext.cpp')
-rw-r--r-- | lib/Analysis/AnalysisContext.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/lib/Analysis/AnalysisContext.cpp b/lib/Analysis/AnalysisContext.cpp index e28b74dff5..e903c80597 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 @@ 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); } //===----------------------------------------------------------------------===// |