Lines Matching +full:data +full:- +full:mapping
1 //===- CoverageMappingReader.cpp - Code coverage mapping reader -----------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file contains support for reading coverage mapping data for
12 //===----------------------------------------------------------------------===//
45 #define DEBUG_TYPE "coverage-mapping"
56 if (auto E = Reader->readNextRecord(Record)) in increment()
66 if (Data.empty()) in readULEB128()
69 Result = decodeULEB128(Data.bytes_begin(), &N); in readULEB128()
70 if (N > Data.size()) in readULEB128()
73 Data = Data.substr(N); in readULEB128()
90 if (Result > Data.size()) in readSize()
100 Result = Data.substr(0, Length); in readString()
101 Data = Data.substr(Length); in readString()
135 StringRef CompressedFilenames = Data.substr(0, CompressedLen); in read()
136 Data = Data.substr(CompressedLen); in read()
203 Tag -= Counter::Expression; in decodeCounter()
235 /// Read the sub-array of regions for the given inferred file id.
248 // They are stored as internal values plus 1 (min is -1) in readMappingRegionsSubArray()
319 static_cast<int16_t>(static_cast<int16_t>(ID1) - 1), in readMappingRegionsSubArray()
320 {static_cast<int16_t>(static_cast<int16_t>(FID1) - 1), in readMappingRegionsSubArray()
321 static_cast<int16_t>(static_cast<int16_t>(TID1) - 1)}}; in readMappingRegionsSubArray()
363 // column range (1 -> std::numeric_limits<unsigned>::max()), but because in readMappingRegionsSubArray()
365 // we set the column range to (0 -> 0) to ensure that the column start and in readMappingRegionsSubArray()
376 << ColumnStart << " -> " << (LineStart + NumLines) << ":" in readMappingRegionsSubArray()
391 "counter mapping region locations are incorrect"); in readMappingRegionsSubArray()
398 // Read the virtual file mapping. in read()
410 // Construct the files using unique filenames and virtual file mapping. in read()
432 // Read the mapping regions sub-arrays. in read()
456 FileIDExpansionRegionMapping[R.FileID]->Count = R.Count; in read()
466 // A dummy coverage mapping data consists of just one region with zero count. in isDummy()
499 Data = *DataOrErr; in create()
507 if (isa<COFFObjectFile>(Obj) && !Obj->isRelocatableObject()) in create()
510 Data = Data.drop_front(1); in create()
518 auto Offset = Pointer - Address; in getFuncName()
519 if (Offset + Size > Data.size()) in getFuncName()
521 return Data.substr(Pointer - Address, Size); in getFuncName()
524 // Check if the mapping data is a dummy, i.e. is emitted for an unused function.
525 static Expected<bool> isCoverageMappingDummy(uint64_t Hash, StringRef Mapping) { in isCoverageMappingDummy() argument
526 // The hash value of dummy mapping records is always zero. in isCoverageMappingDummy()
529 return RawCoverageMappingDummyChecker(Mapping).isDummy(); in isCoverageMappingDummy()
533 /// filenames in a vector-like container.
547 /// The interface to read coverage mapping function records for a module.
554 // mapping data associated with the module.
584 // A class for reading coverage mapping function records for a module.
606 // In addition, prefer records with real coverage mapping data to dummy
610 StringRef Mapping, in insertFunctionRecordIfNeeded() argument
613 uint64_t FuncHash = CFR->template getFuncHash<Endian>(); in insertFunctionRecordIfNeeded()
614 NameRefType NameRef = CFR->template getFuncNameRef<Endian>(); in insertFunctionRecordIfNeeded()
619 if (Error Err = CFR->template getFuncName<Endian>(ProfileNames, FuncName)) in insertFunctionRecordIfNeeded()
625 Records.emplace_back(Version, FuncName, FuncHash, Mapping, in insertFunctionRecordIfNeeded()
630 size_t OldRecordIndex = InsertResult.first->second; in insertFunctionRecordIfNeeded()
640 isCoverageMappingDummy(FuncHash, Mapping); in insertFunctionRecordIfNeeded()
647 OldRecord.CoverageMapping = Mapping; in insertFunctionRecordIfNeeded()
669 "coverage mapping header section is larger than buffer size"); in readCoverageHeader()
671 uint32_t NRecords = CovHeader->getNRecords<Endian>(); in readCoverageHeader()
672 uint32_t FilenamesSize = CovHeader->getFilenamesSize<Endian>(); in readCoverageHeader()
673 uint32_t CoverageSize = CovHeader->getCoverageSize<Endian>(); in readCoverageHeader()
674 assert((CovMapVersion)CovHeader->getVersion<Endian>() == Version); in readCoverageHeader()
678 // This is a no-op in Version4 (function records are read after all headers in readCoverageHeader()
700 FilenameRange FileRange(FilenamesBegin, Filenames.size() - FilenamesBegin); in readCoverageHeader()
713 FilenameRange &OrigRange = Insert.first->getSecond(); in readCoverageHeader()
726 // We'll read the coverage mapping records in the loop below. in readCoverageHeader()
727 // This is a no-op in Version4 (coverage mappings are not affixed to the in readCoverageHeader()
732 "coverage mapping size is not zero"); in readCoverageHeader()
761 // Validate the length of the coverage mapping for this function. in readFunctionRecords()
765 CFR->template advanceByOne<Endian>(OutOfLineMappingBuf); in readFunctionRecords()
770 "next mapping buffer is larger than buffer size"); in readFunctionRecords()
777 uint64_t FilenamesRef = CFR->template getFilenamesRef<Endian>(); in readFunctionRecords()
785 FileRange = It->getSecond(); in readFunctionRecords()
788 // Now, read the coverage data. in readFunctionRecords()
789 if (FileRange && !FileRange->isInvalid()) { in readFunctionRecords()
790 StringRef Mapping = in readFunctionRecords() local
791 CFR->template getCoverageMapping<Endian>(OutOfLineMappingBuf); in readFunctionRecords()
793 Mapping.data() + Mapping.size() > FuncRecBufEnd) in readFunctionRecords()
796 "coverage mapping data is larger than buffer size"); in readFunctionRecords()
797 if (Error Err = insertFunctionRecordIfNeeded(CFR, Mapping, *FileRange)) in readFunctionRecords()
826 // Decompress the name data. in get()
858 // Read the records in the coverage data section. in readCoverageMappingData()
860 reinterpret_cast<const CovMapHeader *>(CovMap.data()); in readCoverageMappingData()
861 CovMapVersion Version = (CovMapVersion)CovHeader->getVersion<Endian>(); in readCoverageMappingData()
870 const char *CovBuf = CovMap.data(); in readCoverageMappingData()
872 const char *FuncRecBuf = FuncRecords.data(); in readCoverageMappingData()
873 const char *FuncRecBufEnd = FuncRecords.data() + FuncRecords.size(); in readCoverageMappingData()
875 // Read the current coverage header & filename data. in readCoverageMappingData()
881 auto NextOrErr = Reader->readCoverageHeader(CovBuf, CovBufEnd); in readCoverageMappingData()
889 return Reader->readFunctionRecords(FuncRecBuf, FuncRecBufEnd, std::nullopt, in readCoverageMappingData()
904 InstrProfSymtab &ProfileNames = *Reader->ProfileNames; in createCoverageReaderFromBuffer()
905 StringRef FuncRecordsRef = Reader->FuncRecords->getBuffer(); in createCoverageReaderFromBuffer()
908 ProfileNames, Coverage, FuncRecordsRef, Reader->MappingRecords, in createCoverageReaderFromBuffer()
909 CompilationDir, Reader->Filenames)) in createCoverageReaderFromBuffer()
913 ProfileNames, Coverage, FuncRecordsRef, Reader->MappingRecords, in createCoverageReaderFromBuffer()
914 CompilationDir, Reader->Filenames)) in createCoverageReaderFromBuffer()
918 ProfileNames, Coverage, FuncRecordsRef, Reader->MappingRecords, in createCoverageReaderFromBuffer()
919 CompilationDir, Reader->Filenames)) in createCoverageReaderFromBuffer()
923 ProfileNames, Coverage, FuncRecordsRef, Reader->MappingRecords, in createCoverageReaderFromBuffer()
924 CompilationDir, Reader->Filenames)) in createCoverageReaderFromBuffer()
934 loadTestingFormat(StringRef Data, StringRef CompilationDir) { in loadTestingFormat() argument
939 Data = Data.substr(sizeof(TestingFormatMagic)); in loadTestingFormat()
940 if (Data.size() < sizeof(uint64_t)) in loadTestingFormat()
942 "the size of data is too small"); in loadTestingFormat()
945 *reinterpret_cast<const uint64_t *>(Data.data())); in loadTestingFormat()
946 Data = Data.substr(sizeof(uint64_t)); in loadTestingFormat()
948 // Read the ProfileNames data. in loadTestingFormat()
949 if (Data.empty()) in loadTestingFormat()
952 uint64_t ProfileNamesSize = decodeULEB128(Data.bytes_begin(), &N); in loadTestingFormat()
953 if (N > Data.size()) in loadTestingFormat()
957 Data = Data.substr(N); in loadTestingFormat()
958 if (Data.empty()) in loadTestingFormat()
961 uint64_t Address = decodeULEB128(Data.bytes_begin(), &N); in loadTestingFormat()
962 if (N > Data.size()) in loadTestingFormat()
965 Data = Data.substr(N); in loadTestingFormat()
966 if (Data.size() < ProfileNamesSize) in loadTestingFormat()
970 if (Error E = ProfileNames->create(Data.substr(0, ProfileNamesSize), Address)) in loadTestingFormat()
972 Data = Data.substr(ProfileNamesSize); in loadTestingFormat()
978 CoverageMappingSize = decodeULEB128(Data.bytes_begin(), &N); in loadTestingFormat()
979 if (N > Data.size()) in loadTestingFormat()
982 Data = Data.substr(N); in loadTestingFormat()
991 // Skip the padding bytes because coverage map data has an alignment of 8. in loadTestingFormat()
992 auto Pad = offsetToAlignedAddr(Data.data(), Align(8)); in loadTestingFormat()
993 if (Data.size() < Pad) in loadTestingFormat()
996 Data = Data.substr(Pad); in loadTestingFormat()
997 if (Data.size() < sizeof(CovMapHeader)) in loadTestingFormat()
1000 "coverage mapping header section is larger than data size"); in loadTestingFormat()
1002 Data.substr(0, sizeof(CovMapHeader)).data()); in loadTestingFormat()
1004 CovMapVersion(CovHeader->getVersion<llvm::endianness::little>()); in loadTestingFormat()
1009 CoverageMappingSize = Data.size(); in loadTestingFormat()
1012 CovHeader->getFilenamesSize<llvm::endianness::little>(); in loadTestingFormat()
1017 auto CoverageMapping = Data.substr(0, CoverageMappingSize); in loadTestingFormat()
1018 Data = Data.substr(CoverageMappingSize); in loadTestingFormat()
1020 // Read the CoverageRecords data. in loadTestingFormat()
1022 if (!Data.empty()) in loadTestingFormat()
1024 "data is not empty"); in loadTestingFormat()
1026 // Skip the padding bytes because coverage records data has an alignment in loadTestingFormat()
1028 Pad = offsetToAlignedAddr(Data.data(), Align(8)); in loadTestingFormat()
1029 if (Data.size() < Pad) in loadTestingFormat()
1032 Data = Data.substr(Pad); in loadTestingFormat()
1035 MemoryBuffer::getMemBuffer(Data); in loadTestingFormat()
1084 auto ObjectFileOrErr = Universal->getMachOObjectForArch(Arch); in loadBinaryFormat()
1092 if (!Arch.empty() && OF->getArch() != Triple(Arch).getArch()) in loadBinaryFormat()
1100 uint8_t BytesInAddress = OF->getBytesInAddress(); in loadBinaryFormat()
1102 OF->isLittleEndian() ? llvm::endianness::little : llvm::endianness::big; in loadBinaryFormat()
1121 "the size of coverage mapping section is not one"); in loadBinaryFormat()
1122 if (Error E = ProfileNames->create(NamesSectionRefs.back())) in loadBinaryFormat()
1155 FuncRecordsSize += alignTo(CoverageRecordsOrErr->size(), RecordAlignment); in loadBinaryFormat()
1159 char *FuncRecordsBuffer = WritableBuffer->getBufferStart(); in loadBinaryFormat()
1172 alignAddr(FuncRecordsBuffer, RecordAlignment) - in loadBinaryFormat()
1176 assert(FuncRecordsBuffer == WritableBuffer->getBufferEnd() && in loadBinaryFormat()
1194 for (auto &ObjForArch : Universal->objects()) in isArchSpecifierInvalidOrMissing()
1236 for (auto &ObjForArch : Universal->objects()) { in create()
1250 ArchiveOrErr.get()->getMemoryBufferRef(), Arch, ObjectFileBuffers, in create()
1258 for (auto &Child : Ar->children(Err)) { in create()
1277 if (Ar->isThin()) in create()
1278 for (auto &Buffer : Ar->takeThinBuffers()) in create()
1291 BinaryIDs->push_back(BinaryID); in create()