diff options
author | Justin Bogner <mail@justinbogner.com> | 2014-09-17 18:23:47 +0000 |
---|---|---|
committer | Justin Bogner <mail@justinbogner.com> | 2014-09-17 18:23:47 +0000 |
commit | fe357c003f3a7c23aef0176d18eb22f0c5b0cd70 (patch) | |
tree | 91356d6e1b929f80d7229f9035a0421b2f0a0750 /llvm/tools/llvm-cov/SourceCoverageView.h | |
parent | 2c8ed4b84fa01115deff4c5fc1d3b76924c354be (diff) | |
download | bcm5719-llvm-fe357c003f3a7c23aef0176d18eb22f0c5b0cd70.tar.gz bcm5719-llvm-fe357c003f3a7c23aef0176d18eb22f0c5b0cd70.zip |
llvm-cov: Rework the API for getting the coverage of a file (NFC)
This encapsulates how we handle the coverage regions of a file or
function. In the old model, the user had to deal with nested regions,
so they needed to maintain their own auxiliary data structures to get
any useful information out of this. The new API provides a sequence of
non-overlapping coverage segments, which makes it possible to render
coverage information in a single pass and avoids a fair amount of
extra work.
llvm-svn: 217975
Diffstat (limited to 'llvm/tools/llvm-cov/SourceCoverageView.h')
-rw-r--r-- | llvm/tools/llvm-cov/SourceCoverageView.h | 95 |
1 files changed, 15 insertions, 80 deletions
diff --git a/llvm/tools/llvm-cov/SourceCoverageView.h b/llvm/tools/llvm-cov/SourceCoverageView.h index 80669d37f76..54a11d8c51c 100644 --- a/llvm/tools/llvm-cov/SourceCoverageView.h +++ b/llvm/tools/llvm-cov/SourceCoverageView.h @@ -77,7 +77,7 @@ struct InstantiationView { /// \brief A code coverage view of a specific source file. /// It can have embedded coverage views. class SourceCoverageView { -public: +private: /// \brief Coverage information for a single line. struct LineCoverageInfo { uint64_t ExecutionCount; @@ -98,90 +98,22 @@ public: void addRegionCount(uint64_t Count) { Mapped = true; - ExecutionCount = Count; - } - }; - - /// \brief A marker that points at the start - /// of a specific mapping region. - struct RegionMarker { - unsigned Line, Column; - uint64_t ExecutionCount; - - RegionMarker(unsigned Line, unsigned Column, uint64_t Value) - : Line(Line), Column(Column), ExecutionCount(Value) {} - }; - - /// \brief A single line source range used to - /// render highlighted text. - struct HighlightRange { - enum HighlightKind { - /// The code that wasn't executed. - NotCovered, - - /// The region of code that was expanded. - Expanded - }; - HighlightKind Kind; - unsigned Line; - unsigned ColumnStart; - unsigned ColumnEnd; - - HighlightRange(unsigned Line, unsigned ColumnStart, unsigned ColumnEnd, - HighlightKind Kind = NotCovered) - : Kind(Kind), Line(Line), ColumnStart(ColumnStart), - ColumnEnd(ColumnEnd) {} - - bool operator<(const HighlightRange &Other) const { - if (Line == Other.Line) - return ColumnStart < Other.ColumnStart; - return Line < Other.Line; - } - - bool columnStartOverlaps(const HighlightRange &Other) const { - return ColumnStart <= Other.ColumnStart && ColumnEnd > Other.ColumnStart; - } - bool columnEndOverlaps(const HighlightRange &Other) const { - return ColumnEnd >= Other.ColumnEnd && ColumnStart < Other.ColumnEnd; - } - bool contains(const HighlightRange &Other) const { - if (Line != Other.Line) - return false; - return ColumnStart <= Other.ColumnStart && ColumnEnd >= Other.ColumnEnd; - } - - bool overlaps(const HighlightRange &Other) const { - if (Line != Other.Line) - return false; - return columnStartOverlaps(Other) || columnEndOverlaps(Other); + if (!RegionCount) + ExecutionCount = Count; } }; -private: const MemoryBuffer &File; const CoverageViewOptions &Options; - unsigned LineOffset; + std::unique_ptr<SourceCoverageDataManager> RegionManager; std::vector<ExpansionView> ExpansionSubViews; std::vector<InstantiationView> InstantiationSubViews; - std::vector<LineCoverageInfo> LineStats; - std::vector<HighlightRange> HighlightRanges; - std::vector<RegionMarker> Markers; - - /// \brief Initialize the visible source range for this view. - void setUpVisibleRange(SourceCoverageDataManager &Data); - - /// \brief Create the line coverage information using the coverage data. - void createLineCoverageInfo(SourceCoverageDataManager &Data); - - /// \brief Create the line highlighting ranges using the coverage data. - void createHighlightRanges(SourceCoverageDataManager &Data); - - /// \brief Create the region markers using the coverage data. - void createRegionMarkers(SourceCoverageDataManager &Data); /// \brief Render a source line with highlighting. - void renderLine(raw_ostream &OS, StringRef Line, - ArrayRef<HighlightRange> Ranges); + void renderLine(raw_ostream &OS, StringRef Line, int64_t LineNumber, + const CoverageSegment *WrappedSegment, + ArrayRef<const CoverageSegment *> Segments, + unsigned ExpansionCol); void renderIndent(raw_ostream &OS, unsigned Level); @@ -194,7 +126,8 @@ private: void renderLineNumberColumn(raw_ostream &OS, unsigned LineNo); /// \brief Render all the region's execution counts on a line. - void renderRegionMarkers(raw_ostream &OS, ArrayRef<RegionMarker> Regions); + void renderRegionMarkers(raw_ostream &OS, + ArrayRef<const CoverageSegment *> Segments); static const unsigned LineCoverageColumnWidth = 7; static const unsigned LineNumberColumnWidth = 5; @@ -202,7 +135,7 @@ private: public: SourceCoverageView(const MemoryBuffer &File, const CoverageViewOptions &Options) - : File(File), Options(Options), LineOffset(0) {} + : File(File), Options(Options) {} const CoverageViewOptions &getOptions() const { return Options; } @@ -220,11 +153,13 @@ public: /// \brief Print the code coverage information for a specific /// portion of a source file to the output stream. - void render(raw_ostream &OS, unsigned IndentLevel = 0); + void render(raw_ostream &OS, bool WholeFile, unsigned IndentLevel = 0); /// \brief Load the coverage information required for rendering /// from the mapping regions in the data manager. - void load(SourceCoverageDataManager &Data); + void load(std::unique_ptr<SourceCoverageDataManager> Data) { + RegionManager = std::move(Data); + } }; } // namespace llvm |