diff options
author | Petr Hosek <phosek@google.com> | 2021-04-15 01:22:04 -0700 |
---|---|---|
committer | Petr Hosek <phosek@google.com> | 2021-05-11 14:41:55 -0700 |
commit | 489a3531a42fe97c7fa00255fc5e8d31a610492d (patch) | |
tree | 22d76bf849142b88ef771981f0c444612a0cea33 /llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp | |
parent | 3a64b7080d5033b3bd6f28fbac4a24d9490dc3c3 (diff) | |
download | llvm-489a3531a42fe97c7fa00255fc5e8d31a610492d.zip llvm-489a3531a42fe97c7fa00255fc5e8d31a610492d.tar.gz llvm-489a3531a42fe97c7fa00255fc5e8d31a610492d.tar.bz2 |
[llvm-cov] Support for v4 format in convert-for-testing
v4 moves function records to a dedicated section so we need to write
and read it separately.
https://reviews.llvm.org/D100535
Diffstat (limited to 'llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp')
-rw-r--r-- | llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp index 3f1249a..d7352f2 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp @@ -875,16 +875,43 @@ loadTestingFormat(StringRef Data) { InstrProfSymtab ProfileNames; if (Error E = ProfileNames.create(Data.substr(0, ProfileNamesSize), Address)) return std::move(E); - StringRef CoverageMapping = Data.substr(ProfileNamesSize); + Data = Data.substr(ProfileNamesSize); // Skip the padding bytes because coverage map data has an alignment of 8. - if (CoverageMapping.empty()) - return make_error<CoverageMapError>(coveragemap_error::truncated); - size_t Pad = offsetToAlignedAddr(CoverageMapping.data(), Align(8)); - if (CoverageMapping.size() < Pad) + size_t Pad = offsetToAlignedAddr(Data.data(), Align(8)); + if (Data.size() < Pad) + return make_error<CoverageMapError>(coveragemap_error::malformed); + Data = Data.substr(Pad); + if (Data.size() < sizeof(CovMapHeader)) return make_error<CoverageMapError>(coveragemap_error::malformed); - CoverageMapping = CoverageMapping.substr(Pad); + auto const *CovHeader = reinterpret_cast<const CovMapHeader *>( + Data.substr(0, sizeof(CovMapHeader)).data()); + CovMapVersion Version = + (CovMapVersion)CovHeader->getVersion<support::endianness::little>(); + StringRef CoverageMapping, CoverageRecords; + if (Version < CovMapVersion::Version4) { + CoverageMapping = Data; + if (CoverageMapping.empty()) + return make_error<CoverageMapError>(coveragemap_error::truncated); + } else { + uint32_t FilenamesSize = + CovHeader->getFilenamesSize<support::endianness::little>(); + uint32_t CoverageMappingSize = sizeof(CovMapHeader) + FilenamesSize; + CoverageMapping = Data.substr(0, CoverageMappingSize); + if (CoverageMapping.empty()) + return make_error<CoverageMapError>(coveragemap_error::truncated); + Data = Data.substr(CoverageMappingSize); + // Skip the padding bytes because coverage records data has an alignment + // of 8. + Pad = offsetToAlignedAddr(Data.data(), Align(8)); + if (Data.size() < Pad) + return make_error<CoverageMapError>(coveragemap_error::malformed); + CoverageRecords = Data.substr(Pad); + if (CoverageRecords.empty()) + return make_error<CoverageMapError>(coveragemap_error::truncated); + } return BinaryCoverageReader::createCoverageReaderFromBuffer( - CoverageMapping, "", std::move(ProfileNames), BytesInAddress, Endian); + CoverageMapping, CoverageRecords.str(), std::move(ProfileNames), + BytesInAddress, Endian); } /// Find all sections that match \p Name. There may be more than one if comdats |