From 75f8bd01319000b3e1438847505302670514759d Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Sat, 30 Mar 2013 01:31:35 +0000 Subject: [PATCH] [analyzer] Add debug helper LocationContext::dumpStack(). Sample output: #0 void construct(pointer __p, llvm::ImutAVLTree > *const &__val) #1 void push_back(const value_type &__x) #2 void destroy() #3 void release() #4 void ~ImmutableSet() git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178400 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Analysis/AnalysisContext.h | 2 ++ lib/Analysis/AnalysisDeclContext.cpp | 26 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/include/clang/Analysis/AnalysisContext.h b/include/clang/Analysis/AnalysisContext.h index 59140d4736..46d7d07e09 100644 --- a/include/clang/Analysis/AnalysisContext.h +++ b/include/clang/Analysis/AnalysisContext.h @@ -256,6 +256,8 @@ public: virtual void Profile(llvm::FoldingSetNodeID &ID) = 0; + LLVM_ATTRIBUTE_USED void dumpStack() const; + public: static void ProfileCommon(llvm::FoldingSetNodeID &ID, ContextKind ck, diff --git a/lib/Analysis/AnalysisDeclContext.cpp b/lib/Analysis/AnalysisDeclContext.cpp index ebbafbf4a9..5ff7842407 100644 --- a/lib/Analysis/AnalysisDeclContext.cpp +++ b/lib/Analysis/AnalysisDeclContext.cpp @@ -28,6 +28,7 @@ #include "clang/Analysis/Support/BumpVector.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/Support/SaveAndRestore.h" using namespace clang; @@ -386,6 +387,31 @@ bool LocationContext::isParentOf(const LocationContext *LC) const { return false; } +void LocationContext::dumpStack() const { + ASTContext &Ctx = getAnalysisDeclContext()->getASTContext(); + PrintingPolicy PP(Ctx.getLangOpts()); + PP.TerseOutput = 1; + + unsigned Frame = 0; + for (const LocationContext *LCtx = this; LCtx; LCtx = LCtx->getParent()) { + switch (LCtx->getKind()) { + case StackFrame: + llvm::errs() << '#' << Frame++ << ' '; + cast(LCtx)->getDecl()->print(llvm::errs(), PP); + llvm::errs() << '\n'; + break; + case Scope: + llvm::errs() << " (scope)\n"; + break; + case Block: + llvm::errs() << " (block context: " + << cast(LCtx)->getContextData() + << ")\n"; + break; + } + } +} + //===----------------------------------------------------------------------===// // Lazily generated map to query the external variables referenced by a Block. //===----------------------------------------------------------------------===// -- 2.40.0