Coverage: add HasCodeBefore flag to a mapping region.

This flag will be used by the coverage tool to help 
compute the execution counts for each line in a source file.

Differential Revision: http://reviews.llvm.org/D4746


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214740 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alex Lorenz 2014-08-04 18:00:51 +00:00
parent b88bbc0e9d
commit aafa4b5c86
3 changed files with 24 additions and 9 deletions

View File

@ -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)

View File

@ -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();

View File

@ -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);