From: Jordan Rose Date: Sat, 18 May 2013 02:26:59 +0000 (+0000) Subject: [analyzer] Add a debug dump for PathPieces, a list of PathDiagnosticPieces. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d1913d89e2ff3b38bb6293833cfd9d8ead76348e;p=clang [analyzer] Add a debug dump for PathPieces, a list of PathDiagnosticPieces. Originally implemented by Ted, extended by me. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@182186 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h b/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h index e15b5e7fe7..cae47f8916 100644 --- a/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h +++ b/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h @@ -415,6 +415,8 @@ public: flattenTo(Result, Result, ShouldFlattenMacros); return Result; } + + LLVM_ATTRIBUTE_USED void dump() const; }; class PathDiagnosticSpotPiece : public PathDiagnosticPiece { diff --git a/lib/StaticAnalyzer/Core/BugReporter.cpp b/lib/StaticAnalyzer/Core/BugReporter.cpp index 519555396d..d4277fc218 100644 --- a/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -1873,6 +1873,60 @@ static bool isIncrementOrInitInForLoop(const Stmt *S, const Stmt *FL) { typedef llvm::DenseSet OptimizedCallsSet; +void PathPieces::dump() const { + unsigned index = 0; + for (PathPieces::const_iterator I = begin(), E = end(); I != E; ++I ) { + llvm::errs() << "[" << index++ << "]"; + + switch ((*I)->getKind()) { + case PathDiagnosticPiece::Call: + llvm::errs() << " CALL\n--------------\n"; + + if (const Stmt *SLoc = getLocStmt((*I)->getLocation())) { + SLoc->dump(); + } else { + const PathDiagnosticCallPiece *Call = cast(*I); + if (const NamedDecl *ND = dyn_cast(Call->getCallee())) + llvm::errs() << *ND << "\n"; + } + break; + case PathDiagnosticPiece::Event: + llvm::errs() << " EVENT\n--------------\n"; + llvm::errs() << (*I)->getString() << "\n"; + if (const Stmt *SLoc = getLocStmt((*I)->getLocation())) { + llvm::errs() << " ---- at ----\n"; + SLoc->dump(); + } + break; + case PathDiagnosticPiece::Macro: + llvm::errs() << " MACRO\n--------------\n"; + // FIXME: print which macro is being invoked. + break; + case PathDiagnosticPiece::ControlFlow: { + const PathDiagnosticControlFlowPiece *CP = + cast(*I); + llvm::errs() << " CONTROL\n--------------\n"; + + if (const Stmt *s1Start = getLocStmt(CP->getStartLocation())) + s1Start->dump(); + else + llvm::errs() << "NULL\n"; + + llvm::errs() << " ---- to ----\n"; + + if (const Stmt *s1End = getLocStmt(CP->getEndLocation())) + s1End->dump(); + else + llvm::errs() << "NULL\n"; + + break; + } + } + + llvm::errs() << "\n"; + } +} + static bool optimizeEdges(PathPieces &path, SourceManager &SM, OptimizedCallsSet &OCS, LocationContextMap &LCM) {