From 61f5694c30199046100164bb222cfb464ce4e06c Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Thu, 15 Sep 2016 06:44:51 +0000 Subject: [PATCH] [llvm-cov] Hide instantiation views for unexecuted functions Copying in the full text of the function doesn't help at all when we already know that it's never executed. Just say that it's unexecuted -- the relevant source text has already been printed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281589 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Inputs/hideUnexecutedSubviews.proftext | 16 ++++++++++ .../llvm-cov/hideUnexecutedSubviews.test | 10 +++++++ tools/llvm-cov/CodeCoverage.cpp | 30 ++++++++++--------- tools/llvm-cov/SourceCoverageViewHTML.cpp | 10 ++++++- tools/llvm-cov/SourceCoverageViewText.cpp | 7 ++++- 5 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 test/tools/llvm-cov/Inputs/hideUnexecutedSubviews.proftext create mode 100644 test/tools/llvm-cov/hideUnexecutedSubviews.test diff --git a/test/tools/llvm-cov/Inputs/hideUnexecutedSubviews.proftext b/test/tools/llvm-cov/Inputs/hideUnexecutedSubviews.proftext new file mode 100644 index 00000000000..e31d562d716 --- /dev/null +++ b/test/tools/llvm-cov/Inputs/hideUnexecutedSubviews.proftext @@ -0,0 +1,16 @@ +_Z4funcIbEiT_ +10 +2 +0 +0 + +_Z4funcIiEiT_ +10 +2 +0 +0 + +main +0 +1 +0 diff --git a/test/tools/llvm-cov/hideUnexecutedSubviews.test b/test/tools/llvm-cov/hideUnexecutedSubviews.test new file mode 100644 index 00000000000..44a788401d8 --- /dev/null +++ b/test/tools/llvm-cov/hideUnexecutedSubviews.test @@ -0,0 +1,10 @@ +RUN: llvm-profdata merge %S/Inputs/hideUnexecutedSubviews.proftext -o %t.profdata + +RUN: llvm-cov show %S/Inputs/templateInstantiations.covmapping -instr-profile %t.profdata -filename-equivalence %S/showTemplateInstantiations.cpp | FileCheck %s + +RUN: llvm-cov show %S/Inputs/templateInstantiations.covmapping -instr-profile %t.profdata -format html -o %t.html.dir -filename-equivalence %S/showTemplateInstantiations.cpp +RUN: FileCheck %s -input-file %t.html.dir/coverage/tmp/showTemplateInstantiations.cpp.html + +CHECK: Unexecuted instantiation: _Z4funcIbEiT_ +CHECK: Unexecuted instantiation: _Z4funcIiEiT_ +CHECK-NOT: Unexecuted instantiation diff --git a/tools/llvm-cov/CodeCoverage.cpp b/tools/llvm-cov/CodeCoverage.cpp index 6edca9f6071..9eacbcad5ce 100644 --- a/tools/llvm-cov/CodeCoverage.cpp +++ b/tools/llvm-cov/CodeCoverage.cpp @@ -234,21 +234,23 @@ CodeCoverageTool::createSourceFileView(StringRef SourceFile, attachExpansionSubViews(*View, Expansions, Coverage); for (const auto *Function : Coverage.getInstantiations(SourceFile)) { - auto SubViewCoverage = Coverage.getCoverageForFunction(*Function); - auto SubViewExpansions = SubViewCoverage.getExpansions(); - auto SubView = SourceCoverageView::create( - getSymbolForHumans(Function->Name), SourceBuffer.get(), ViewOpts, - std::move(SubViewCoverage)); - attachExpansionSubViews(*SubView, SubViewExpansions, Coverage); - - if (SubView) { - unsigned FileID = Function->CountedRegions.front().FileID; - unsigned Line = 0; - for (const auto &CR : Function->CountedRegions) - if (CR.FileID == FileID) - Line = std::max(CR.LineEnd, Line); - View->addInstantiation(Function->Name, Line, std::move(SubView)); + std::unique_ptr SubView{nullptr}; + + if (Function->ExecutionCount > 0) { + auto SubViewCoverage = Coverage.getCoverageForFunction(*Function); + auto SubViewExpansions = SubViewCoverage.getExpansions(); + SubView = SourceCoverageView::create( + getSymbolForHumans(Function->Name), SourceBuffer.get(), ViewOpts, + std::move(SubViewCoverage)); + attachExpansionSubViews(*SubView, SubViewExpansions, Coverage); } + + unsigned FileID = Function->CountedRegions.front().FileID; + unsigned Line = 0; + for (const auto &CR : Function->CountedRegions) + if (CR.FileID == FileID) + Line = std::max(CR.LineEnd, Line); + View->addInstantiation(Function->Name, Line, std::move(SubView)); } return View; } diff --git a/tools/llvm-cov/SourceCoverageViewHTML.cpp b/tools/llvm-cov/SourceCoverageViewHTML.cpp index 0f176551550..31d6fd3048b 100644 --- a/tools/llvm-cov/SourceCoverageViewHTML.cpp +++ b/tools/llvm-cov/SourceCoverageViewHTML.cpp @@ -584,7 +584,15 @@ void SourceCoverageViewHTML::renderInstantiationView(raw_ostream &OS, InstantiationView &ISV, unsigned ViewDepth) { OS << BeginExpansionDiv; - ISV.View->print(OS, /*WholeFile=*/false, /*ShowSourceName=*/true, ViewDepth); + if (!ISV.View) + OS << BeginSourceNameDiv + << tag("pre", + escape("Unexecuted instantiation: " + ISV.FunctionName.str(), + getOptions())) + << EndSourceNameDiv; + else + ISV.View->print(OS, /*WholeFile=*/false, /*ShowSourceName=*/true, + ViewDepth); OS << EndExpansionDiv; } diff --git a/tools/llvm-cov/SourceCoverageViewText.cpp b/tools/llvm-cov/SourceCoverageViewText.cpp index 51c6463db30..f5201d9c808 100644 --- a/tools/llvm-cov/SourceCoverageViewText.cpp +++ b/tools/llvm-cov/SourceCoverageViewText.cpp @@ -215,7 +215,12 @@ void SourceCoverageViewText::renderInstantiationView(raw_ostream &OS, unsigned ViewDepth) { renderLinePrefix(OS, ViewDepth); OS << ' '; - ISV.View->print(OS, /*WholeFile=*/false, /*ShowSourceName=*/true, ViewDepth); + if (!ISV.View) + getOptions().colored_ostream(OS, raw_ostream::RED) + << "Unexecuted instantiation: " << ISV.FunctionName << "\n"; + else + ISV.View->print(OS, /*WholeFile=*/false, /*ShowSourceName=*/true, + ViewDepth); } void SourceCoverageViewText::renderTitle(raw_ostream &OS, StringRef Title) { -- 2.50.1