diff options
author | Ted Kremenek <kremenek@apple.com> | 2012-06-01 20:04:04 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2012-06-01 20:04:04 +0000 |
commit | 7fa9b4f258636d89342eda28f21a986c8ac353b1 (patch) | |
tree | d7b3c4df21fc87a3f8eb202703db8f322d73aa5d /lib/Analysis/AnalysisDeclContext.cpp | |
parent | 784ae8e5c6b557e2395991c6008293660f5afe66 (diff) |
static analyzer: add inlining support for directly called blocks.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@157833 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/AnalysisDeclContext.cpp')
-rw-r--r-- | lib/Analysis/AnalysisDeclContext.cpp | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/lib/Analysis/AnalysisDeclContext.cpp b/lib/Analysis/AnalysisDeclContext.cpp index 624373330f..b618569cd7 100644 --- a/lib/Analysis/AnalysisDeclContext.cpp +++ b/lib/Analysis/AnalysisDeclContext.cpp @@ -204,6 +204,14 @@ AnalysisDeclContext::getStackFrame(LocationContext const *Parent, const Stmt *S, return getLocationContextManager().getStackFrame(this, Parent, S, Blk, Idx); } +const BlockInvocationContext * +AnalysisDeclContext::getBlockInvocationContext(const LocationContext *parent, + const clang::BlockDecl *BD, + const void *ContextData) { + return getLocationContextManager().getBlockInvocationContext(this, parent, + BD, ContextData); +} + LocationContextManager & AnalysisDeclContext::getLocationContextManager() { assert(Manager && "Cannot create LocationContexts without an AnalysisDeclContextManager!"); @@ -234,7 +242,7 @@ void ScopeContext::Profile(llvm::FoldingSetNodeID &ID) { } void BlockInvocationContext::Profile(llvm::FoldingSetNodeID &ID) { - Profile(ID, getAnalysisDeclContext(), getParent(), BD); + Profile(ID, getAnalysisDeclContext(), getParent(), BD, ContextData); } //===----------------------------------------------------------------------===// @@ -283,6 +291,24 @@ LocationContextManager::getScope(AnalysisDeclContext *ctx, return getLocationContext<ScopeContext, Stmt>(ctx, parent, s); } +const BlockInvocationContext * +LocationContextManager::getBlockInvocationContext(AnalysisDeclContext *ctx, + const LocationContext *parent, + const BlockDecl *BD, + const void *ContextData) { + llvm::FoldingSetNodeID ID; + BlockInvocationContext::Profile(ID, ctx, parent, BD, ContextData); + void *InsertPos; + BlockInvocationContext *L = + cast_or_null<BlockInvocationContext>(Contexts.FindNodeOrInsertPos(ID, + InsertPos)); + if (!L) { + L = new BlockInvocationContext(ctx, parent, BD, ContextData); + Contexts.InsertNode(L, InsertPos); + } + return L; +} + //===----------------------------------------------------------------------===// // LocationContext methods. //===----------------------------------------------------------------------===// @@ -297,19 +323,6 @@ const StackFrameContext *LocationContext::getCurrentStackFrame() const { return NULL; } -const StackFrameContext * -LocationContext::getStackFrameForDeclContext(const DeclContext *DC) const { - const LocationContext *LC = this; - while (LC) { - if (const StackFrameContext *SFC = dyn_cast<StackFrameContext>(LC)) { - if (cast<DeclContext>(SFC->getDecl()) == DC) - return SFC; - } - LC = LC->getParent(); - } - return NULL; -} - bool LocationContext::isParentOf(const LocationContext *LC) const { do { const LocationContext *Parent = LC->getParent(); |