From 98f0f26fdfa3a43daa95587378de355e27d5dfeb Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Wed, 13 May 2015 22:41:48 +0000 Subject: [PATCH] InstrProf: Fix display of large numbers in llvm-cov llvm-cov was truncating numbers that were larger than a particular fixed width, which is as confusing as it is useless. Instead, we use engineering notation with SI prefix for magnitude. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237307 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Inputs/lineExecutionCounts.proftext | 6 +-- .../llvm-cov/Inputs/regionMarkers.proftext | 6 +-- .../llvm-cov/showLineExecutionCounts.cpp | 48 +++++++++---------- test/tools/llvm-cov/showRegionMarkers.cpp | 14 +++--- tools/llvm-cov/SourceCoverageView.cpp | 46 ++++++++++-------- 5 files changed, 62 insertions(+), 58 deletions(-) diff --git a/test/tools/llvm-cov/Inputs/lineExecutionCounts.proftext b/test/tools/llvm-cov/Inputs/lineExecutionCounts.proftext index 1966d42ce30..38387a6237a 100644 --- a/test/tools/llvm-cov/Inputs/lineExecutionCounts.proftext +++ b/test/tools/llvm-cov/Inputs/lineExecutionCounts.proftext @@ -1,8 +1,8 @@ main 0x000000000028434d 5 -1 +161 0 -100 -1 +16100 +161 0 diff --git a/test/tools/llvm-cov/Inputs/regionMarkers.proftext b/test/tools/llvm-cov/Inputs/regionMarkers.proftext index 1966d42ce30..5199edc5394 100644 --- a/test/tools/llvm-cov/Inputs/regionMarkers.proftext +++ b/test/tools/llvm-cov/Inputs/regionMarkers.proftext @@ -1,8 +1,8 @@ main 0x000000000028434d 5 -1 +1111000 0 -100 -1 +111100000 +1111000 0 diff --git a/test/tools/llvm-cov/showLineExecutionCounts.cpp b/test/tools/llvm-cov/showLineExecutionCounts.cpp index d5254da788b..83fee977e6d 100644 --- a/test/tools/llvm-cov/showLineExecutionCounts.cpp +++ b/test/tools/llvm-cov/showLineExecutionCounts.cpp @@ -1,30 +1,30 @@ // Basic handling of line counts. // RUN: llvm-profdata merge %S/Inputs/lineExecutionCounts.proftext -o %t.profdata -// before any coverage // WHOLE-FILE: | [[@LINE]]|// before - // FILTER-NOT: | [[@LINE-1]]|// before -int main() { // CHECK: 1| [[@LINE]]|int main( - int x = 0; // CHECK: 1| [[@LINE]]| int x - // CHECK: 1| [[@LINE]]| - if (x) { // CHECK: 0| [[@LINE]]| if (x) - x = 0; // CHECK: 0| [[@LINE]]| x = 0 - } else { // CHECK: 1| [[@LINE]]| } else - x = 1; // CHECK: 1| [[@LINE]]| x = 1 - } // CHECK: 1| [[@LINE]]| } - // CHECK: 1| [[@LINE]]| - for (int i = 0; i < 100; ++i) { // CHECK: 101| [[@LINE]]| for ( - x = 1; // CHECK: 100| [[@LINE]]| x = 1 - } // CHECK: 100| [[@LINE]]| } - // CHECK: 1| [[@LINE]]| - x = x < 10 ? x + 1 : x - 1; // CHECK: 1| [[@LINE]]| x = - x = x > 10 ? // CHECK: 1| [[@LINE]]| x = - x - 1: // CHECK: 0| [[@LINE]]| x - x + 1; // CHECK: 1| [[@LINE]]| x - // CHECK: 1| [[@LINE]]| - return 0; // CHECK: 1| [[@LINE]]| return -} // CHECK: 1| [[@LINE]]|} -// after coverage // WHOLE-FILE: | [[@LINE]]|// after - // FILTER-NOT: | [[@LINE-1]]|// after +// before any coverage // WHOLE-FILE: | [[@LINE]]|// before + // FILTER-NOT: | [[@LINE-1]]|// before +int main() { // CHECK: 161| [[@LINE]]|int main( + int x = 0; // CHECK: 161| [[@LINE]]| int x + // CHECK: 161| [[@LINE]]| + if (x) { // CHECK: 0| [[@LINE]]| if (x) + x = 0; // CHECK: 0| [[@LINE]]| x = 0 + } else { // CHECK: 161| [[@LINE]]| } else + x = 1; // CHECK: 161| [[@LINE]]| x = 1 + } // CHECK: 161| [[@LINE]]| } + // CHECK: 161| [[@LINE]]| + for (int i = 0; i < 100; ++i) { // CHECK: 16.2k| [[@LINE]]| for ( + x = 1; // CHECK: 16.1k| [[@LINE]]| x = 1 + } // CHECK: 16.1k| [[@LINE]]| } + // CHECK: 161| [[@LINE]]| + x = x < 10 ? x + 1 : x - 1; // CHECK: 161| [[@LINE]]| x = + x = x > 10 ? // CHECK: 161| [[@LINE]]| x = + x - 1: // CHECK: 0| [[@LINE]]| x + x + 1; // CHECK: 161| [[@LINE]]| x + // CHECK: 161| [[@LINE]]| + return 0; // CHECK: 161| [[@LINE]]| return +} // CHECK: 161| [[@LINE]]|} +// after coverage // WHOLE-FILE: | [[@LINE]]|// after + // FILTER-NOT: | [[@LINE-1]]|// after // RUN: llvm-cov show %S/Inputs/lineExecutionCounts.covmapping -instr-profile %t.profdata -filename-equivalence %s | FileCheck -check-prefix=CHECK -check-prefix=WHOLE-FILE %s // RUN: llvm-cov show %S/Inputs/lineExecutionCounts.covmapping -instr-profile %t.profdata -filename-equivalence -name=main %s | FileCheck -check-prefix=CHECK -check-prefix=FILTER %s diff --git a/test/tools/llvm-cov/showRegionMarkers.cpp b/test/tools/llvm-cov/showRegionMarkers.cpp index d1b83d25985..5507367c0ed 100644 --- a/test/tools/llvm-cov/showRegionMarkers.cpp +++ b/test/tools/llvm-cov/showRegionMarkers.cpp @@ -1,23 +1,23 @@ // RUN: llvm-profdata merge %S/Inputs/regionMarkers.proftext -o %t.profdata -int main() { // CHECK: Marker at [[@LINE]]:12 = 1 +int main() { // CHECK: Marker at [[@LINE]]:12 = 1.11M int x = 0; if (x) { // CHECK: Marker at [[@LINE]]:10 = 0 x = 0; - } else { // CHECK: Marker at [[@LINE]]:10 = 1 + } else { // CHECK: Marker at [[@LINE]]:10 = 1.11M x = 1; } - // CHECK: Marker at [[@LINE+2]]:19 = 101 - // CHECK: Marker at [[@LINE+1]]:28 = 100 - for (int i = 0; i < 100; ++i) { // CHECK: Marker at [[@LINE]]:33 = 100 + // CHECK: Marker at [[@LINE+2]]:19 = 112M + // CHECK: Marker at [[@LINE+1]]:28 = 111M + for (int i = 0; i < 100; ++i) { // CHECK: Marker at [[@LINE]]:33 = 111M x = 1; } - // CHECK: Marker at [[@LINE+1]]:16 = 1 + // CHECK: Marker at [[@LINE+1]]:16 = 1.11M x = x < 10 ? x + 1 : x - 1; // CHECK: Marker at [[@LINE]]:24 = 0 x = x > 10 ? x - 1: // CHECK: Marker at [[@LINE]]:9 = 0 - x + 1; // CHECK: Marker at [[@LINE]]:9 = 1 + x + 1; // CHECK: Marker at [[@LINE]]:9 = 1.11M return 0; } diff --git a/tools/llvm-cov/SourceCoverageView.cpp b/tools/llvm-cov/SourceCoverageView.cpp index 015099c7d02..58c8a679529 100644 --- a/tools/llvm-cov/SourceCoverageView.cpp +++ b/tools/llvm-cov/SourceCoverageView.cpp @@ -14,6 +14,7 @@ #include "SourceCoverageView.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/Support/LineIterator.h" using namespace llvm; @@ -77,6 +78,22 @@ void SourceCoverageView::renderViewDivider(unsigned Level, unsigned Length, OS << "-"; } +/// Format a count using engineering notation with 3 significant digits. +static std::string formatCount(uint64_t N) { + std::string Number = utostr(N); + int Len = Number.size(); + if (Len <= 3) + return Number; + int IntLen = Len % 3 == 0 ? 3 : Len % 3; + std::string Result(Number.data(), IntLen); + if (IntLen != 3) { + Result.push_back('.'); + Result += Number.substr(IntLen, 3 - IntLen); + } + Result.push_back(" kMGTPEZY"[(Len - 1) / 3]); + return Result; +} + void SourceCoverageView::renderLineCoverageColumn(raw_ostream &OS, const LineCoverageInfo &Line) { @@ -84,17 +101,11 @@ SourceCoverageView::renderLineCoverageColumn(raw_ostream &OS, OS.indent(LineCoverageColumnWidth) << '|'; return; } - SmallString<32> Buffer; - raw_svector_ostream BufferOS(Buffer); - BufferOS << Line.ExecutionCount; - auto Str = BufferOS.str(); - // Trim - Str = Str.substr(0, std::min(Str.size(), (size_t)LineCoverageColumnWidth)); - // Align to the right - OS.indent(LineCoverageColumnWidth - Str.size()); + std::string C = formatCount(Line.ExecutionCount); + OS.indent(LineCoverageColumnWidth - C.size()); colored_ostream(OS, raw_ostream::MAGENTA, Line.hasMultipleRegions() && Options.Colors) - << Str; + << C; OS << '|'; } @@ -111,9 +122,6 @@ void SourceCoverageView::renderLineNumberColumn(raw_ostream &OS, void SourceCoverageView::renderRegionMarkers( raw_ostream &OS, ArrayRef Segments) { - SmallString<32> Buffer; - raw_svector_ostream BufferOS(Buffer); - unsigned PrevColumn = 1; for (const auto *S : Segments) { if (!S->IsRegionEntry) @@ -122,20 +130,16 @@ void SourceCoverageView::renderRegionMarkers( if (S->Col > PrevColumn) OS.indent(S->Col - PrevColumn); PrevColumn = S->Col + 1; - BufferOS << S->Count; - StringRef Str = BufferOS.str(); - // Trim the execution count - Str = Str.substr(0, std::min(Str.size(), (size_t)7)); - PrevColumn += Str.size(); - OS << '^' << Str; - Buffer.clear(); + std::string C = formatCount(S->Count); + PrevColumn += C.size(); + OS << '^' << C; } OS << "\n"; if (Options.Debug) for (const auto *S : Segments) - errs() << "Marker at " << S->Line << ":" << S->Col << " = " << S->Count - << (S->IsRegionEntry ? "\n" : " (pop)\n"); + errs() << "Marker at " << S->Line << ":" << S->Col << " = " + << formatCount(S->Count) << (S->IsRegionEntry ? "\n" : " (pop)\n"); } void SourceCoverageView::render(raw_ostream &OS, bool WholeFile, -- 2.34.1