X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fllvm-cov%2FSourceCoverageView.cpp;h=58c8a679529464e90a56b8345451c8db879fb3aa;hb=00552e3875ee5f382db6c98286a241a7d0efe1b8;hp=2a212e5173d4fe854f66ef85a8fb17636f3b51f3;hpb=b3edb564859b93eabc86392c38d925384f136e0e;p=oota-llvm.git diff --git a/tools/llvm-cov/SourceCoverageView.cpp b/tools/llvm-cov/SourceCoverageView.cpp index 2a212e5173d..58c8a679529 100644 --- a/tools/llvm-cov/SourceCoverageView.cpp +++ b/tools/llvm-cov/SourceCoverageView.cpp @@ -14,15 +14,16 @@ #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; -void SourceCoverageView::renderLine(raw_ostream &OS, StringRef Line, - int64_t LineNumber, - const CoverageSegment *WrappedSegment, - ArrayRef Segments, - unsigned ExpansionCol) { +void SourceCoverageView::renderLine( + raw_ostream &OS, StringRef Line, int64_t LineNumber, + const coverage::CoverageSegment *WrappedSegment, + ArrayRef Segments, + unsigned ExpansionCol) { Optional Highlight; SmallVector, 2> HighlightedRanges; @@ -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 << '|'; } @@ -110,10 +121,7 @@ void SourceCoverageView::renderLineNumberColumn(raw_ostream &OS, } void SourceCoverageView::renderRegionMarkers( - raw_ostream &OS, ArrayRef Segments) { - SmallString<32> Buffer; - raw_svector_ostream BufferOS(Buffer); - + raw_ostream &OS, ArrayRef Segments) { 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, @@ -158,20 +162,19 @@ void SourceCoverageView::render(raw_ostream &OS, bool WholeFile, auto EndISV = InstantiationSubViews.end(); // Get the coverage information for the file. - auto CoverageSegments = RegionManager->getCoverageSegments(); - assert(CoverageSegments.size() && "View with no coverage?"); - auto NextSegment = CoverageSegments.begin(); - auto EndSegment = CoverageSegments.end(); + auto NextSegment = CoverageInfo.begin(); + auto EndSegment = CoverageInfo.end(); - const CoverageSegment *WrappedSegment = nullptr; - SmallVector LineSegments; + unsigned FirstLine = NextSegment != EndSegment ? NextSegment->Line : 0; + const coverage::CoverageSegment *WrappedSegment = nullptr; + SmallVector LineSegments; for (line_iterator LI(File, /*SkipBlanks=*/false); !LI.is_at_eof(); ++LI) { // If we aren't rendering the whole file, we need to filter out the prologue // and epilogue. if (!WholeFile) { if (NextSegment == EndSegment) break; - else if (LI.line_number() < NextSegment->Line) + else if (LI.line_number() < FirstLine) continue; } @@ -235,6 +238,10 @@ void SourceCoverageView::render(raw_ostream &OS, bool WholeFile, OS << "\n"; } // Render the child subview + if (Options.Debug) + errs() << "Expansion at line " << NextESV->getLine() << ", " + << NextESV->getStartCol() << " -> " << NextESV->getEndCol() + << "\n"; NextESV->View->render(OS, false, NestedIndent); RenderedSubView = true; }