summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/ProfileData/CoverageMapping.h11
-rw-r--r--llvm/lib/ProfileData/CoverageMappingReader.cpp16
-rw-r--r--llvm/lib/ProfileData/CoverageMappingWriter.cpp6
3 files changed, 24 insertions, 9 deletions
diff --git a/llvm/include/llvm/ProfileData/CoverageMapping.h b/llvm/include/llvm/ProfileData/CoverageMapping.h
index 39d1ae1bf57..51b4ccd9827 100644
--- a/llvm/include/llvm/ProfileData/CoverageMapping.h
+++ b/llvm/include/llvm/ProfileData/CoverageMapping.h
@@ -144,17 +144,24 @@ struct CounterMappingRegion {
SkippedRegion
};
+ static const unsigned EncodingHasCodeBeforeBits = 1;
+
Counter Count;
unsigned FileID, ExpandedFileID;
unsigned LineStart, ColumnStart, LineEnd, ColumnEnd;
RegionKind Kind;
+ /// \brief A flag that is set to true when there is already code before
+ /// this region on the same line.
+ /// This is useful to accurately compute the execution counts for a line.
+ bool HasCodeBefore;
CounterMappingRegion(Counter Count, unsigned FileID, unsigned LineStart,
unsigned ColumnStart, unsigned LineEnd,
- unsigned ColumnEnd, RegionKind Kind = CodeRegion)
+ unsigned ColumnEnd, bool HasCodeBefore = false,
+ RegionKind Kind = CodeRegion)
: Count(Count), FileID(FileID), ExpandedFileID(0), LineStart(LineStart),
ColumnStart(ColumnStart), LineEnd(LineEnd), ColumnEnd(ColumnEnd),
- Kind(Kind) {}
+ Kind(Kind), HasCodeBefore(HasCodeBefore) {}
bool operator<(const CounterMappingRegion &Other) const {
if (FileID != Other.FileID)
diff --git a/llvm/lib/ProfileData/CoverageMappingReader.cpp b/llvm/lib/ProfileData/CoverageMappingReader.cpp
index c58df0fc093..c8108d4ce99 100644
--- a/llvm/lib/ProfileData/CoverageMappingReader.cpp
+++ b/llvm/lib/ProfileData/CoverageMappingReader.cpp
@@ -170,13 +170,17 @@ std::error_code RawCoverageMappingReader::readMappingRegionsSubArray(
}
// Read the source range.
- uint64_t LineStartDelta, ColumnStart, NumLines, ColumnEnd;
+ uint64_t LineStartDelta, CodeBeforeColumnStart, NumLines, ColumnEnd;
if (auto Err =
readIntMax(LineStartDelta, std::numeric_limits<unsigned>::max()))
return Err;
- if (auto Err =
- readIntMax(ColumnStart, std::numeric_limits<unsigned>::max()))
+ if (auto Err = readULEB128(CodeBeforeColumnStart))
return Err;
+ bool HasCodeBefore = CodeBeforeColumnStart & 1;
+ uint64_t ColumnStart = CodeBeforeColumnStart >>
+ CounterMappingRegion::EncodingHasCodeBeforeBits;
+ if (ColumnStart > std::numeric_limits<unsigned>::max())
+ return error(instrprof_error::malformed);
if (auto Err = readIntMax(NumLines, std::numeric_limits<unsigned>::max()))
return Err;
if (auto Err = readIntMax(ColumnEnd, std::numeric_limits<unsigned>::max()))
@@ -194,9 +198,9 @@ std::error_code RawCoverageMappingReader::readMappingRegionsSubArray(
ColumnStart = 1;
ColumnEnd = std::numeric_limits<unsigned>::max();
}
- MappingRegions.push_back(
- CounterMappingRegion(C, InferredFileID, LineStart, ColumnStart,
- LineStart + NumLines, ColumnEnd, Kind));
+ MappingRegions.push_back(CounterMappingRegion(
+ C, InferredFileID, LineStart, ColumnStart, LineStart + NumLines,
+ ColumnEnd, HasCodeBefore, Kind));
MappingRegions.back().ExpandedFileID = ExpandedFileID;
}
return success();
diff --git a/llvm/lib/ProfileData/CoverageMappingWriter.cpp b/llvm/lib/ProfileData/CoverageMappingWriter.cpp
index f9bbe61fb48..f5e6ab46380 100644
--- a/llvm/lib/ProfileData/CoverageMappingWriter.cpp
+++ b/llvm/lib/ProfileData/CoverageMappingWriter.cpp
@@ -181,7 +181,11 @@ void CoverageMappingWriter::write(raw_ostream &OS) {
}
assert(I.LineStart >= PrevLineStart);
encodeULEB128(I.LineStart - PrevLineStart, OS);
- encodeULEB128(I.ColumnStart, OS);
+ uint64_t CodeBeforeColumnStart =
+ uint64_t(I.HasCodeBefore) |
+ (uint64_t(I.ColumnStart)
+ << CounterMappingRegion::EncodingHasCodeBeforeBits);
+ encodeULEB128(CodeBeforeColumnStart, OS);
assert(I.LineEnd >= I.LineStart);
encodeULEB128(I.LineEnd - I.LineStart, OS);
encodeULEB128(I.ColumnEnd, OS);
OpenPOWER on IntegriCloud