diff options
Diffstat (limited to 'llvm/lib/ProfileData/CoverageMapping.cpp')
-rw-r--r-- | llvm/lib/ProfileData/CoverageMapping.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/llvm/lib/ProfileData/CoverageMapping.cpp b/llvm/lib/ProfileData/CoverageMapping.cpp index aa43019a899..e130565500f 100644 --- a/llvm/lib/ProfileData/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/CoverageMapping.cpp @@ -272,9 +272,11 @@ public: }; class SegmentBuilder { - std::vector<CoverageSegment> Segments; + std::vector<CoverageSegment> &Segments; SmallVector<const CountedRegion *, 8> ActiveRegions; + SegmentBuilder(std::vector<CoverageSegment> &Segments) : Segments(Segments) {} + /// Start a segment with no count specified. void startSegment(unsigned Line, unsigned Col) { DEBUG(dbgs() << "Top level segment at " << Line << ":" << Col << "\n"); @@ -318,9 +320,7 @@ class SegmentBuilder { startSegment(Line, Col, false, *ActiveRegions.back()); } -public: - /// Build a list of CoverageSegments from a sorted list of Regions. - std::vector<CoverageSegment> buildSegments(ArrayRef<CountedRegion> Regions) { + void buildSegmentsImpl(ArrayRef<CountedRegion> Regions) { const CountedRegion *PrevRegion = nullptr; for (const auto &Region : Regions) { // Pop any regions that end before this one starts. @@ -341,6 +341,15 @@ public: // Pop any regions that are left in the stack. while (!ActiveRegions.empty()) popRegion(); + } + +public: + /// Build a list of CoverageSegments from a sorted list of Regions. + static std::vector<CoverageSegment> + buildSegments(ArrayRef<CountedRegion> Regions) { + std::vector<CoverageSegment> Segments; + SegmentBuilder Builder(Segments); + Builder.buildSegmentsImpl(Regions); return Segments; } }; @@ -426,7 +435,7 @@ CoverageData CoverageMapping::getCoverageForFile(StringRef Filename) { sortNestedRegions(Regions.begin(), Regions.end()); DEBUG(dbgs() << "Emitting segments for file: " << Filename << "\n"); - FileCoverage.Segments = SegmentBuilder().buildSegments(Regions); + FileCoverage.Segments = SegmentBuilder::buildSegments(Regions); return FileCoverage; } @@ -468,7 +477,7 @@ CoverageMapping::getCoverageForFunction(const FunctionRecord &Function) { sortNestedRegions(Regions.begin(), Regions.end()); DEBUG(dbgs() << "Emitting segments for function: " << Function.Name << "\n"); - FunctionCoverage.Segments = SegmentBuilder().buildSegments(Regions); + FunctionCoverage.Segments = SegmentBuilder::buildSegments(Regions); return FunctionCoverage; } @@ -488,7 +497,7 @@ CoverageMapping::getCoverageForExpansion(const ExpansionRecord &Expansion) { sortNestedRegions(Regions.begin(), Regions.end()); DEBUG(dbgs() << "Emitting segments for expansion of file " << Expansion.FileID << "\n"); - ExpansionCoverage.Segments = SegmentBuilder().buildSegments(Regions); + ExpansionCoverage.Segments = SegmentBuilder::buildSegments(Regions); return ExpansionCoverage; } |