mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 12:19:53 +00:00
llvm-cov: Only combine segments if they overlap exactly
If two coverage segments cover the same area we need to combine them, as per r218432. OTOH, just because they start at the same place doesn't mean they cover the same area. This fixes the check to be more exact about this. This is pretty hard to test right now. The frontend doesn't currently emit regions that start at the same place but don't overlap, but some upcoming work changes this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@227017 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
62c3d80359
commit
65a5e71298
@ -304,13 +304,14 @@ class SegmentBuilder {
|
||||
public:
|
||||
/// Build a list of CoverageSegments from a sorted list of Regions.
|
||||
std::vector<CoverageSegment> buildSegments(ArrayRef<CountedRegion> Regions) {
|
||||
const CountedRegion *PrevRegion = nullptr;
|
||||
for (const auto &Region : Regions) {
|
||||
// Pop any regions that end before this one starts.
|
||||
while (!ActiveRegions.empty() &&
|
||||
ActiveRegions.back()->endLoc() <= Region.startLoc())
|
||||
popRegion();
|
||||
if (!Segments.empty() && Segments.back().Line == Region.LineStart &&
|
||||
Segments.back().Col == Region.ColumnStart) {
|
||||
if (PrevRegion && PrevRegion->startLoc() == Region.startLoc() &&
|
||||
PrevRegion->endLoc() == Region.endLoc()) {
|
||||
if (Region.Kind != coverage::CounterMappingRegion::SkippedRegion)
|
||||
Segments.back().addCount(Region.ExecutionCount);
|
||||
} else {
|
||||
@ -318,6 +319,7 @@ public:
|
||||
ActiveRegions.push_back(&Region);
|
||||
startSegment(Region);
|
||||
}
|
||||
PrevRegion = &Region;
|
||||
}
|
||||
// Pop any regions that are left in the stack.
|
||||
while (!ActiveRegions.empty())
|
||||
@ -409,6 +411,7 @@ CoverageData CoverageMapping::getCoverageForFile(StringRef Filename) {
|
||||
}
|
||||
|
||||
sortNestedRegions(Regions.begin(), Regions.end());
|
||||
DEBUG(dbgs() << "Emitting segments for file: " << Filename << "\n");
|
||||
FileCoverage.Segments = SegmentBuilder().buildSegments(Regions);
|
||||
|
||||
return FileCoverage;
|
||||
@ -450,6 +453,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);
|
||||
|
||||
return FunctionCoverage;
|
||||
@ -468,6 +472,8 @@ 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);
|
||||
|
||||
return ExpansionCoverage;
|
||||
|
Loading…
Reference in New Issue
Block a user