From 5222733b4c67eff1624f36de2248f58995d392ac Mon Sep 17 00:00:00 2001 From: Gulfem Savrun Yeniceri Date: Tue, 15 Aug 2023 20:28:30 +0000 Subject: Revert "[llvm-cov] Fix a bug about using `convert-for-testing` on multi-source object files" This reverts commit f8ad86c23405168a8cd189590184fdcc296627e0 because it broke some downsteam tests reported in https://reviews.llvm.org/D156611. --- .../ProfileData/Coverage/CoverageMappingReader.cpp | 49 ++++++++++------------ 1 file changed, 22 insertions(+), 27 deletions(-) (limited to 'llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp') diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp index 2f290b2..0573732 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp @@ -886,46 +886,41 @@ loadTestingFormat(StringRef Data, StringRef CompilationDir) { if (Error E = ProfileNames.create(Data.substr(0, ProfileNamesSize), Address)) return std::move(E); Data = Data.substr(ProfileNamesSize); - - N = 0; - uint64_t CoverageMappingSize = decodeULEB128(Data.bytes_begin(), &N); - if (N > Data.size()) - return make_error(coveragemap_error::malformed); - Data = Data.substr(N); - // Skip the padding bytes because coverage map data has an alignment of 8. size_t Pad = offsetToAlignedAddr(Data.data(), Align(8)); if (Data.size() < Pad) return make_error(coveragemap_error::malformed); Data = Data.substr(Pad); - if (Data.size() < CoverageMappingSize) - return make_error(coveragemap_error::malformed); - StringRef CoverageMapping = Data.substr(0, CoverageMappingSize); - 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) + if (Data.size() < sizeof(CovMapHeader)) return make_error(coveragemap_error::malformed); - Data = Data.substr(Pad); - BinaryCoverageReader::FuncRecordsStorage CoverageRecords = - MemoryBuffer::getMemBuffer(Data); - - // Some extra checking. - if (CoverageMapping.size() < sizeof(CovMapHeader)) - return make_error(coveragemap_error::truncated); - auto const *CovHeader = - reinterpret_cast(CoverageMapping.data()); + auto const *CovHeader = reinterpret_cast( + Data.substr(0, sizeof(CovMapHeader)).data()); CovMapVersion Version = (CovMapVersion)CovHeader->getVersion(); + StringRef CoverageMapping; + BinaryCoverageReader::FuncRecordsStorage CoverageRecords; if (Version < CovMapVersion::Version4) { - if (CoverageRecords->getBufferSize() != 0) - return make_error(coveragemap_error::malformed); + CoverageMapping = Data; + if (CoverageMapping.empty()) + return make_error(coveragemap_error::truncated); + CoverageRecords = MemoryBuffer::getMemBuffer(""); } else { + uint32_t FilenamesSize = + CovHeader->getFilenamesSize(); + uint32_t CoverageMappingSize = sizeof(CovMapHeader) + FilenamesSize; + CoverageMapping = Data.substr(0, CoverageMappingSize); + if (CoverageMapping.empty()) + return make_error(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(coveragemap_error::malformed); + CoverageRecords = MemoryBuffer::getMemBuffer(Data.substr(Pad)); if (CoverageRecords->getBufferSize() == 0) return make_error(coveragemap_error::truncated); } - return BinaryCoverageReader::createCoverageReaderFromBuffer( CoverageMapping, std::move(CoverageRecords), std::move(ProfileNames), BytesInAddress, Endian, CompilationDir); -- cgit v1.1