@@ -808,6 +808,7 @@ Error CoverageMapping::loadFunctionRecord(
808
808
else
809
809
OrigFuncName = getFuncNameWithoutPrefix (OrigFuncName, Record.Filenames [0 ]);
810
810
811
+ bool SingleByteCoverage = ProfileReader.hasSingleByteCoverage ();
811
812
CounterMappingContext Ctx (Record.Expressions );
812
813
813
814
std::vector<uint64_t > Counts;
@@ -855,7 +856,7 @@ Error CoverageMapping::loadFunctionRecord(
855
856
return Error::success ();
856
857
857
858
MCDCDecisionRecorder MCDCDecisions;
858
- FunctionRecord Function (OrigFuncName, Record.Filenames );
859
+ FunctionRecord Function (OrigFuncName, Record.Filenames , SingleByteCoverage );
859
860
for (const auto &Region : Record.MappingRegions ) {
860
861
// MCDCDecisionRegion should be handled first since it overlaps with
861
862
// others inside.
@@ -873,8 +874,7 @@ Error CoverageMapping::loadFunctionRecord(
873
874
consumeError (std::move (E));
874
875
return Error::success ();
875
876
}
876
- Function.pushRegion (Region, *ExecutionCount, *AltExecutionCount,
877
- ProfileReader.hasSingleByteCoverage ());
877
+ Function.pushRegion (Region, *ExecutionCount, *AltExecutionCount);
878
878
879
879
// Record ExpansionRegion.
880
880
if (Region.Kind == CounterMappingRegion::ExpansionRegion) {
@@ -1270,7 +1270,8 @@ class SegmentBuilder {
1270
1270
1271
1271
// / Combine counts of regions which cover the same area.
1272
1272
static ArrayRef<CountedRegion>
1273
- combineRegions (MutableArrayRef<CountedRegion> Regions) {
1273
+ combineRegions (MutableArrayRef<CountedRegion> Regions,
1274
+ bool SingleByteCoverage) {
1274
1275
if (Regions.empty ())
1275
1276
return Regions;
1276
1277
auto Active = Regions.begin ();
@@ -1297,9 +1298,7 @@ class SegmentBuilder {
1297
1298
// We add counts of the regions of the same kind as the active region
1298
1299
// to handle the both situations.
1299
1300
if (I->Kind == Active->Kind ) {
1300
- assert (I->HasSingleByteCoverage == Active->HasSingleByteCoverage &&
1301
- " Regions are generated in different coverage modes" );
1302
- if (I->HasSingleByteCoverage )
1301
+ if (SingleByteCoverage)
1303
1302
Active->ExecutionCount = Active->ExecutionCount || I->ExecutionCount ;
1304
1303
else
1305
1304
Active->ExecutionCount += I->ExecutionCount ;
@@ -1311,12 +1310,14 @@ class SegmentBuilder {
1311
1310
public:
1312
1311
// / Build a sorted list of CoverageSegments from a list of Regions.
1313
1312
static std::vector<CoverageSegment>
1314
- buildSegments (MutableArrayRef<CountedRegion> Regions) {
1313
+ buildSegments (MutableArrayRef<CountedRegion> Regions,
1314
+ bool SingleByteCoverage) {
1315
1315
std::vector<CoverageSegment> Segments;
1316
1316
SegmentBuilder Builder (Segments);
1317
1317
1318
1318
sortNestedRegions (Regions);
1319
- ArrayRef<CountedRegion> CombinedRegions = combineRegions (Regions);
1319
+ ArrayRef<CountedRegion> CombinedRegions =
1320
+ combineRegions (Regions, SingleByteCoverage);
1320
1321
1321
1322
LLVM_DEBUG ({
1322
1323
dbgs () << " Combined regions:\n " ;
@@ -1403,10 +1404,14 @@ CoverageData CoverageMapping::getCoverageForFile(StringRef Filename) const {
1403
1404
// the filename, we may get back some records that are not in the file.
1404
1405
ArrayRef<unsigned > RecordIndices =
1405
1406
getImpreciseRecordIndicesForFilename (Filename);
1407
+ std::optional<bool > SingleByteCoverage;
1406
1408
for (unsigned RecordIndex : RecordIndices) {
1407
1409
const FunctionRecord &Function = Functions[RecordIndex];
1408
1410
auto MainFileID = findMainViewFileID (Filename, Function);
1409
1411
auto FileIDs = gatherFileIDs (Filename, Function);
1412
+ assert (!SingleByteCoverage ||
1413
+ *SingleByteCoverage == Function.SingleByteCoverage );
1414
+ SingleByteCoverage = Function.SingleByteCoverage ;
1410
1415
for (const auto &CR : Function.CountedRegions )
1411
1416
if (FileIDs.test (CR.FileID )) {
1412
1417
Regions.push_back (CR);
@@ -1424,7 +1429,8 @@ CoverageData CoverageMapping::getCoverageForFile(StringRef Filename) const {
1424
1429
}
1425
1430
1426
1431
LLVM_DEBUG (dbgs () << " Emitting segments for file: " << Filename << " \n " );
1427
- FileCoverage.Segments = SegmentBuilder::buildSegments (Regions);
1432
+ FileCoverage.Segments =
1433
+ SegmentBuilder::buildSegments (Regions, *SingleByteCoverage);
1428
1434
1429
1435
return FileCoverage;
1430
1436
}
@@ -1480,7 +1486,8 @@ CoverageMapping::getCoverageForFunction(const FunctionRecord &Function) const {
1480
1486
1481
1487
LLVM_DEBUG (dbgs () << " Emitting segments for function: " << Function.Name
1482
1488
<< " \n " );
1483
- FunctionCoverage.Segments = SegmentBuilder::buildSegments (Regions);
1489
+ FunctionCoverage.Segments =
1490
+ SegmentBuilder::buildSegments (Regions, Function.SingleByteCoverage );
1484
1491
1485
1492
return FunctionCoverage;
1486
1493
}
@@ -1490,8 +1497,12 @@ CoverageData CoverageMapping::getCoverageForExpansion(
1490
1497
CoverageData ExpansionCoverage (
1491
1498
Expansion.Function .Filenames [Expansion.FileID ]);
1492
1499
std::vector<CountedRegion> Regions;
1500
+ std::optional<bool > SingleByteCoverage;
1493
1501
for (const auto &CR : Expansion.Function .CountedRegions )
1494
1502
if (CR.FileID == Expansion.FileID ) {
1503
+ assert (!SingleByteCoverage ||
1504
+ *SingleByteCoverage == Expansion.Function .SingleByteCoverage );
1505
+ SingleByteCoverage = Expansion.Function .SingleByteCoverage ;
1495
1506
Regions.push_back (CR);
1496
1507
if (isExpansion (CR, Expansion.FileID ))
1497
1508
ExpansionCoverage.Expansions .emplace_back (CR, Expansion.Function );
@@ -1503,7 +1514,8 @@ CoverageData CoverageMapping::getCoverageForExpansion(
1503
1514
1504
1515
LLVM_DEBUG (dbgs () << " Emitting segments for expansion of file "
1505
1516
<< Expansion.FileID << " \n " );
1506
- ExpansionCoverage.Segments = SegmentBuilder::buildSegments (Regions);
1517
+ ExpansionCoverage.Segments =
1518
+ SegmentBuilder::buildSegments (Regions, *SingleByteCoverage);
1507
1519
1508
1520
return ExpansionCoverage;
1509
1521
}
0 commit comments