Index: clang/include/clang/Analysis/AnalysisDeclContext.h =================================================================== --- clang/include/clang/Analysis/AnalysisDeclContext.h +++ clang/include/clang/Analysis/AnalysisDeclContext.h @@ -200,7 +200,7 @@ /// \returns Whether the root namespace of \p D is the \c std C++ namespace. static bool isInStdNamespace(const Decl *D); - static std::string getFunctionName(const Decl *D); + static std::string getFunctionOrDeclName(const Decl *D); private: std::unique_ptr &getAnalysisImpl(const void *tag); Index: clang/lib/Analysis/AnalysisDeclContext.cpp =================================================================== --- clang/lib/Analysis/AnalysisDeclContext.cpp +++ clang/lib/Analysis/AnalysisDeclContext.cpp @@ -337,7 +337,7 @@ return ND->isStdNamespace(); } -std::string AnalysisDeclContext::getFunctionName(const Decl *D) { +std::string AnalysisDeclContext::getFunctionOrDeclName(const Decl *D) { std::string Str; llvm::raw_string_ostream OS(Str); const ASTContext &Ctx = D->getASTContext(); @@ -385,6 +385,8 @@ OS << OCD->getClassInterface()->getName() << '(' << OCD->getName() << ')'; } OS << ' ' << OMD->getSelector().getAsString() << ']'; + } else if (const auto *ND = dyn_cast(D)) { + OS << ND->getQualifiedNameAsString(); } return OS.str(); @@ -509,7 +511,7 @@ Out << "\t#" << Frame << ' '; ++Frame; if (const auto *D = dyn_cast(LCtx->getDecl())) - Out << "Calling " << AnalysisDeclContext::getFunctionName(D); + Out << "Calling " << AnalysisDeclContext::getFunctionOrDeclName(D); else Out << "Calling anonymous code"; if (const Stmt *S = cast(LCtx)->getCallSite()) { Index: clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp =================================================================== --- clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp +++ clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp @@ -187,6 +187,15 @@ } } + void DisplayDeclTime(const Decl *D, llvm::TimeRecord &Time) { + if (!Opts->AnalyzerDisplayProgress) { + return; + } + llvm::errs() << "Running checker callbacks on: " + << AnalysisDeclContext::getFunctionOrDeclName(D); + DisplayTime(Time); + } + void DisplayTime(llvm::TimeRecord &Time) { if (!Opts->AnalyzerDisplayProgress) { return; @@ -222,7 +231,7 @@ assert(Mode == (AM_Syntax | AM_Path) && "Unexpected mode!"); llvm::errs() << ": " << Loc.getFilename() << ' ' - << AnalysisDeclContext::getFunctionName(D); + << AnalysisDeclContext::getFunctionOrDeclName(D); } } @@ -274,11 +283,18 @@ bool VisitDecl(Decl *D) { AnalysisMode Mode = getModeForDecl(D, RecVisitorMode); if (Mode & AM_Syntax) { - if (SyntaxCheckTimer) + llvm::TimeRecord CheckerStartTime; + if (SyntaxCheckTimer) { + CheckerStartTime = SyntaxCheckTimer->getTotalTime(); SyntaxCheckTimer->startTimer(); + } checkerMgr->runCheckersOnASTDecl(D, *Mgr, *RecVisitorBR); - if (SyntaxCheckTimer) + if (SyntaxCheckTimer) { SyntaxCheckTimer->stopTimer(); + llvm::TimeRecord CheckerEndTime = SyntaxCheckTimer->getTotalTime(); + CheckerEndTime -= CheckerStartTime; + DisplayDeclTime(D, CheckerEndTime); + } } return true; } @@ -357,7 +373,7 @@ private: void storeTopLevelDecls(DeclGroupRef DG); - std::string getFunctionName(const Decl *D); + std::string getFunctionOrDeclName(const Decl *D); /// Check if we should skip (not analyze) the given function. AnalysisMode getModeForDecl(Decl *D, AnalysisMode Mode); @@ -583,7 +599,7 @@ AnalysisConsumer::AnalysisMode AnalysisConsumer::getModeForDecl(Decl *D, AnalysisMode Mode) { if (!Opts->AnalyzeSpecificFunction.empty() && - AnalysisDeclContext::getFunctionName(D) != Opts->AnalyzeSpecificFunction) + AnalysisDeclContext::getFunctionOrDeclName(D) != Opts->AnalyzeSpecificFunction) return AM_None; // Unless -analyze-all is specified, treat decls differently depending on Index: clang/test/Analysis/inlining/analysis-order.c =================================================================== --- clang/test/Analysis/inlining/analysis-order.c +++ clang/test/Analysis/inlining/analysis-order.c @@ -10,6 +10,9 @@ void test1() { } -// CHECK: analysis-order.c test2 +// CHECK: Running checker callbacks on: test1 : {{[0-9]+\.[0-9]+}} ms +// CHECK-NEXT: Running checker callbacks on: test2 : {{[0-9]+\.[0-9]+}} ms +// CHECK-NEXT: analysis-order.c test2 +// CHECK-NEXT: Running checker callbacks on: test1 : {{[0-9]+\.[0-9]+}} ms // CHECK-NEXT: analysis-order.c test1 // CHECK-NEXT: analysis-order.c test2