Index: llvm/trunk/lib/ProfileData/CoverageMapping.cpp =================================================================== --- llvm/trunk/lib/ProfileData/CoverageMapping.cpp +++ llvm/trunk/lib/ProfileData/CoverageMapping.cpp @@ -272,9 +272,11 @@ }; class SegmentBuilder { - std::vector Segments; + std::vector &Segments; SmallVector ActiveRegions; + SegmentBuilder(std::vector &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 @@ startSegment(Line, Col, false, *ActiveRegions.back()); } -public: - /// Build a list of CoverageSegments from a sorted list of Regions. - std::vector buildSegments(ArrayRef Regions) { + void buildSegmentsImpl(ArrayRef Regions) { const CountedRegion *PrevRegion = nullptr; for (const auto &Region : Regions) { // Pop any regions that end before this one starts. @@ -341,6 +341,15 @@ // 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 + buildSegments(ArrayRef Regions) { + std::vector Segments; + SegmentBuilder Builder(Segments); + Builder.buildSegmentsImpl(Regions); return Segments; } }; @@ -426,7 +435,7 @@ 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 @@ 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 @@ 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; }