Skip to content

Commit f96b435

Browse files
committed
New SingleByteCoverage
1 parent 805dbd9 commit f96b435

File tree

3 files changed

+33
-35
lines changed

3 files changed

+33
-35
lines changed

llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -364,19 +364,16 @@ struct CountedRegion : public CounterMappingRegion {
364364
uint64_t FalseExecutionCount;
365365
bool TrueFolded;
366366
bool FalseFolded;
367-
bool HasSingleByteCoverage;
368367

369-
CountedRegion(const CounterMappingRegion &R, uint64_t ExecutionCount,
370-
bool HasSingleByteCoverage)
368+
CountedRegion(const CounterMappingRegion &R, uint64_t ExecutionCount)
371369
: CounterMappingRegion(R), ExecutionCount(ExecutionCount),
372-
FalseExecutionCount(0), TrueFolded(false), FalseFolded(true),
373-
HasSingleByteCoverage(HasSingleByteCoverage) {}
370+
FalseExecutionCount(0), TrueFolded(false), FalseFolded(true) {}
374371

375372
CountedRegion(const CounterMappingRegion &R, uint64_t ExecutionCount,
376-
uint64_t FalseExecutionCount, bool HasSingleByteCoverage)
373+
uint64_t FalseExecutionCount)
377374
: CounterMappingRegion(R), ExecutionCount(ExecutionCount),
378375
FalseExecutionCount(FalseExecutionCount), TrueFolded(false),
379-
FalseFolded(false), HasSingleByteCoverage(HasSingleByteCoverage) {}
376+
FalseFolded(false) {}
380377
};
381378

382379
/// MCDC Record grouping all information together.
@@ -719,10 +716,9 @@ struct FunctionRecord {
719716
}
720717

721718
void pushRegion(CounterMappingRegion Region, uint64_t Count,
722-
uint64_t FalseCount, bool HasSingleByteCoverage) {
719+
uint64_t FalseCount) {
723720
if (Region.isBranch()) {
724-
CountedBranchRegions.emplace_back(Region, Count, FalseCount,
725-
HasSingleByteCoverage);
721+
CountedBranchRegions.emplace_back(Region, Count, FalseCount);
726722
// If either counter is hard-coded to zero, then this region represents a
727723
// constant-folded branch.
728724
CountedBranchRegions.back().TrueFolded = Region.Count.isZero();
@@ -731,8 +727,7 @@ struct FunctionRecord {
731727
}
732728
if (CountedRegions.empty())
733729
ExecutionCount = Count;
734-
CountedRegions.emplace_back(Region, Count, FalseCount,
735-
HasSingleByteCoverage);
730+
CountedRegions.emplace_back(Region, Count, FalseCount);
736731
}
737732
};
738733

@@ -895,14 +890,19 @@ class CoverageData {
895890
std::vector<CountedRegion> BranchRegions;
896891
std::vector<MCDCRecord> MCDCRecords;
897892

893+
bool SingleByteCoverage;
894+
898895
public:
899-
CoverageData() = default;
896+
CoverageData() = delete;
900897

901-
CoverageData(StringRef Filename) : Filename(Filename) {}
898+
CoverageData(bool Single, StringRef Filename = StringRef())
899+
: Filename(Filename), SingleByteCoverage(Single) {}
902900

903901
/// Get the name of the file this data covers.
904902
StringRef getFilename() const { return Filename; }
905903

904+
bool getSingleByteCoverage() const { return SingleByteCoverage; }
905+
906906
/// Get an iterator over the coverage segments for this object. The segments
907907
/// are guaranteed to be uniqued and sorted by location.
908908
std::vector<CoverageSegment>::const_iterator begin() const {
@@ -935,7 +935,9 @@ class CoverageMapping {
935935
DenseMap<size_t, SmallVector<unsigned, 0>> FilenameHash2RecordIndices;
936936
std::vector<std::pair<std::string, uint64_t>> FuncHashMismatches;
937937

938-
CoverageMapping() = default;
938+
bool SingleByteCoverage;
939+
940+
CoverageMapping(bool Single) : SingleByteCoverage(Single) {}
939941

940942
// Load coverage records from readers.
941943
static Error loadFromReaders(
@@ -979,6 +981,8 @@ class CoverageMapping {
979981
const object::BuildIDFetcher *BIDFetcher = nullptr,
980982
bool CheckBinaryIDs = false);
981983

984+
bool getSingleByteCoverage() const { return SingleByteCoverage; }
985+
982986
/// The number of functions that couldn't have their profiles mapped.
983987
///
984988
/// This is a count of functions whose profile is out of date or otherwise

llvm/lib/ProfileData/Coverage/CoverageMapping.cpp

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -805,7 +805,6 @@ Error CoverageMapping::loadFunctionRecord(
805805
else
806806
OrigFuncName = getFuncNameWithoutPrefix(OrigFuncName, Record.Filenames[0]);
807807

808-
bool SingleByteCoverage = ProfileReader.hasSingleByteCoverage();
809808
CounterMappingContext Ctx(Record.Expressions);
810809

811810
std::vector<uint64_t> Counts;
@@ -871,10 +870,7 @@ Error CoverageMapping::loadFunctionRecord(
871870
consumeError(std::move(E));
872871
return Error::success();
873872
}
874-
Function.pushRegion(
875-
Region, (SingleByteCoverage && *ExecutionCount ? 1 : *ExecutionCount),
876-
(SingleByteCoverage && *AltExecutionCount ? 1 : *AltExecutionCount),
877-
SingleByteCoverage);
873+
Function.pushRegion(Region, *ExecutionCount, *AltExecutionCount);
878874

879875
// Record ExpansionRegion.
880876
if (Region.Kind == CounterMappingRegion::ExpansionRegion) {
@@ -951,7 +947,8 @@ Error CoverageMapping::loadFromReaders(
951947
Expected<std::unique_ptr<CoverageMapping>> CoverageMapping::load(
952948
ArrayRef<std::unique_ptr<CoverageMappingReader>> CoverageReaders,
953949
IndexedInstrProfReader &ProfileReader) {
954-
auto Coverage = std::unique_ptr<CoverageMapping>(new CoverageMapping());
950+
auto Coverage = std::unique_ptr<CoverageMapping>(
951+
new CoverageMapping(ProfileReader.hasSingleByteCoverage()));
955952
if (Error E = loadFromReaders(CoverageReaders, ProfileReader, *Coverage))
956953
return std::move(E);
957954
return std::move(Coverage);
@@ -1013,7 +1010,8 @@ Expected<std::unique_ptr<CoverageMapping>> CoverageMapping::load(
10131010
if (Error E = ProfileReaderOrErr.takeError())
10141011
return createFileError(ProfileFilename, std::move(E));
10151012
auto ProfileReader = std::move(ProfileReaderOrErr.get());
1016-
auto Coverage = std::unique_ptr<CoverageMapping>(new CoverageMapping());
1013+
auto Coverage = std::unique_ptr<CoverageMapping>(
1014+
new CoverageMapping(ProfileReader->hasSingleByteCoverage()));
10171015
bool DataFound = false;
10181016

10191017
auto GetArch = [&](size_t Idx) {
@@ -1296,14 +1294,8 @@ class SegmentBuilder {
12961294
// value for that area.
12971295
// We add counts of the regions of the same kind as the active region
12981296
// to handle the both situations.
1299-
if (I->Kind == Active->Kind) {
1300-
assert(I->HasSingleByteCoverage == Active->HasSingleByteCoverage &&
1301-
"Regions are generated in different coverage modes");
1302-
if (I->HasSingleByteCoverage)
1303-
Active->ExecutionCount = Active->ExecutionCount || I->ExecutionCount;
1304-
else
1305-
Active->ExecutionCount += I->ExecutionCount;
1306-
}
1297+
if (I->Kind == Active->Kind)
1298+
Active->ExecutionCount += I->ExecutionCount;
13071299
}
13081300
return Regions.drop_back(std::distance(++Active, End));
13091301
}
@@ -1396,7 +1388,7 @@ static bool isExpansion(const CountedRegion &R, unsigned FileID) {
13961388
}
13971389

13981390
CoverageData CoverageMapping::getCoverageForFile(StringRef Filename) const {
1399-
CoverageData FileCoverage(Filename);
1391+
CoverageData FileCoverage(SingleByteCoverage, Filename);
14001392
std::vector<CountedRegion> Regions;
14011393

14021394
// Look up the function records in the given file. Due to hash collisions on
@@ -1458,9 +1450,10 @@ CoverageData
14581450
CoverageMapping::getCoverageForFunction(const FunctionRecord &Function) const {
14591451
auto MainFileID = findMainViewFileID(Function);
14601452
if (!MainFileID)
1461-
return CoverageData();
1453+
return CoverageData(SingleByteCoverage);
14621454

1463-
CoverageData FunctionCoverage(Function.Filenames[*MainFileID]);
1455+
CoverageData FunctionCoverage(SingleByteCoverage,
1456+
Function.Filenames[*MainFileID]);
14641457
std::vector<CountedRegion> Regions;
14651458
for (const auto &CR : Function.CountedRegions)
14661459
if (CR.FileID == *MainFileID) {
@@ -1488,7 +1481,7 @@ CoverageMapping::getCoverageForFunction(const FunctionRecord &Function) const {
14881481
CoverageData CoverageMapping::getCoverageForExpansion(
14891482
const ExpansionRecord &Expansion) const {
14901483
CoverageData ExpansionCoverage(
1491-
Expansion.Function.Filenames[Expansion.FileID]);
1484+
SingleByteCoverage, Expansion.Function.Filenames[Expansion.FileID]);
14921485
std::vector<CountedRegion> Regions;
14931486
for (const auto &CR : Expansion.Function.CountedRegions)
14941487
if (CR.FileID == Expansion.FileID) {

llvm/tools/llvm-cov/SourceCoverageView.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,8 @@ class SourceCoverageView {
283283
CoverageData &&CoverageInfo)
284284
: SourceName(SourceName), File(File), Options(Options),
285285
CoverageInfo(std::move(CoverageInfo)),
286-
BinaryCounters(Options.BinaryCounters) {}
286+
BinaryCounters(Options.BinaryCounters ||
287+
CoverageInfo.getSingleByteCoverage()) {}
287288

288289
public:
289290
static std::unique_ptr<SourceCoverageView>

0 commit comments

Comments
 (0)