diff options
Diffstat (limited to 'lib/Analysis/AnalysisDeclContext.cpp')
-rw-r--r-- | lib/Analysis/AnalysisDeclContext.cpp | 63 |
1 files changed, 40 insertions, 23 deletions
diff --git a/lib/Analysis/AnalysisDeclContext.cpp b/lib/Analysis/AnalysisDeclContext.cpp index 659cc6d..7de7f39 100644 --- a/lib/Analysis/AnalysisDeclContext.cpp +++ b/lib/Analysis/AnalysisDeclContext.cpp @@ -12,6 +12,7 @@ // //===----------------------------------------------------------------------===// +#include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclObjC.h" #include "clang/AST/DeclTemplate.h" @@ -34,11 +35,9 @@ typedef llvm::DenseMap<const void *, ManagedAnalysis *> ManagedAnalysisMap; AnalysisDeclContext::AnalysisDeclContext(AnalysisDeclContextManager *Mgr, const Decl *d, - idx::TranslationUnit *tu, const CFG::BuildOptions &buildOptions) : Manager(Mgr), D(d), - TU(tu), cfgBuildOptions(buildOptions), forcedBlkExprs(0), builtCFG(false), @@ -50,11 +49,9 @@ AnalysisDeclContext::AnalysisDeclContext(AnalysisDeclContextManager *Mgr, } AnalysisDeclContext::AnalysisDeclContext(AnalysisDeclContextManager *Mgr, - const Decl *d, - idx::TranslationUnit *tu) + const Decl *d) : Manager(Mgr), D(d), - TU(tu), forcedBlkExprs(0), builtCFG(false), builtCompleteCFG(false), @@ -184,8 +181,16 @@ void AnalysisDeclContext::dumpCFG(bool ShowColors) { } ParentMap &AnalysisDeclContext::getParentMap() { - if (!PM) + if (!PM) { PM.reset(new ParentMap(getBody())); + if (const CXXConstructorDecl *C = dyn_cast<CXXConstructorDecl>(getDecl())) { + for (CXXConstructorDecl::init_const_iterator I = C->init_begin(), + E = C->init_end(); + I != E; ++I) { + PM->addStmt((*I)->getInit()); + } + } + } return *PM; } @@ -195,11 +200,10 @@ PseudoConstantAnalysis *AnalysisDeclContext::getPseudoConstantAnalysis() { return PCA.get(); } -AnalysisDeclContext *AnalysisDeclContextManager::getContext(const Decl *D, - idx::TranslationUnit *TU) { +AnalysisDeclContext *AnalysisDeclContextManager::getContext(const Decl *D) { AnalysisDeclContext *&AC = Contexts[D]; if (!AC) - AC = new AnalysisDeclContext(this, D, TU, cfgBuildOptions); + AC = new AnalysisDeclContext(this, D, cfgBuildOptions); return AC; } @@ -209,6 +213,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!"); @@ -239,7 +251,7 @@ void ScopeContext::Profile(llvm::FoldingSetNodeID &ID) { } void BlockInvocationContext::Profile(llvm::FoldingSetNodeID &ID) { - Profile(ID, getAnalysisDeclContext(), getParent(), BD); + Profile(ID, getAnalysisDeclContext(), getParent(), BD, ContextData); } //===----------------------------------------------------------------------===// @@ -288,6 +300,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. //===----------------------------------------------------------------------===// @@ -302,19 +332,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(); |