diff options
Diffstat (limited to 'llvm/lib/ProfileData/Coverage/CoverageMapping.cpp')
-rw-r--r-- | llvm/lib/ProfileData/Coverage/CoverageMapping.cpp | 123 |
1 files changed, 48 insertions, 75 deletions
diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp index 429ec5c..dd74eb0 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -823,8 +823,7 @@ public: Error CoverageMapping::loadFunctionRecord( const CoverageMappingRecord &Record, - const std::optional<std::reference_wrapper<IndexedInstrProfReader>> - &ProfileReader) { + IndexedInstrProfReader &ProfileReader) { StringRef OrigFuncName = Record.FunctionName; if (OrigFuncName.empty()) return make_error<CoverageMapError>(coveragemap_error::malformed, @@ -838,44 +837,35 @@ Error CoverageMapping::loadFunctionRecord( CounterMappingContext Ctx(Record.Expressions); std::vector<uint64_t> Counts; - if (ProfileReader) { - if (Error E = ProfileReader.value().get().getFunctionCounts( - Record.FunctionName, Record.FunctionHash, Counts)) { - instrprof_error IPE = std::get<0>(InstrProfError::take(std::move(E))); - if (IPE == instrprof_error::hash_mismatch) { - FuncHashMismatches.emplace_back(std::string(Record.FunctionName), - Record.FunctionHash); - return Error::success(); - } - if (IPE != instrprof_error::unknown_function) - return make_error<InstrProfError>(IPE); - Counts.assign(getMaxCounterID(Ctx, Record) + 1, 0); + if (Error E = ProfileReader.getFunctionCounts(Record.FunctionName, + Record.FunctionHash, Counts)) { + instrprof_error IPE = std::get<0>(InstrProfError::take(std::move(E))); + if (IPE == instrprof_error::hash_mismatch) { + FuncHashMismatches.emplace_back(std::string(Record.FunctionName), + Record.FunctionHash); + return Error::success(); } - } else { + if (IPE != instrprof_error::unknown_function) + return make_error<InstrProfError>(IPE); Counts.assign(getMaxCounterID(Ctx, Record) + 1, 0); } Ctx.setCounts(Counts); bool IsVersion11 = - ProfileReader && ProfileReader.value().get().getVersion() < - IndexedInstrProf::ProfVersion::Version12; + ProfileReader.getVersion() < IndexedInstrProf::ProfVersion::Version12; BitVector Bitmap; - if (ProfileReader) { - if (Error E = ProfileReader.value().get().getFunctionBitmap( - Record.FunctionName, Record.FunctionHash, Bitmap)) { - instrprof_error IPE = std::get<0>(InstrProfError::take(std::move(E))); - if (IPE == instrprof_error::hash_mismatch) { - FuncHashMismatches.emplace_back(std::string(Record.FunctionName), - Record.FunctionHash); - return Error::success(); - } - if (IPE != instrprof_error::unknown_function) - return make_error<InstrProfError>(IPE); - Bitmap = BitVector(getMaxBitmapSize(Record, IsVersion11)); + if (Error E = ProfileReader.getFunctionBitmap(Record.FunctionName, + Record.FunctionHash, Bitmap)) { + instrprof_error IPE = std::get<0>(InstrProfError::take(std::move(E))); + if (IPE == instrprof_error::hash_mismatch) { + FuncHashMismatches.emplace_back(std::string(Record.FunctionName), + Record.FunctionHash); + return Error::success(); } - } else { - Bitmap = BitVector(getMaxBitmapSize(Record, false)); + if (IPE != instrprof_error::unknown_function) + return make_error<InstrProfError>(IPE); + Bitmap = BitVector(getMaxBitmapSize(Record, IsVersion11)); } Ctx.setBitmap(std::move(Bitmap)); @@ -969,14 +959,10 @@ Error CoverageMapping::loadFunctionRecord( // of CoverageMappingReader instances. Error CoverageMapping::loadFromReaders( ArrayRef<std::unique_ptr<CoverageMappingReader>> CoverageReaders, - std::optional<std::reference_wrapper<IndexedInstrProfReader>> - &ProfileReader, - CoverageMapping &Coverage) { - assert(!Coverage.SingleByteCoverage || !ProfileReader || - *Coverage.SingleByteCoverage == - ProfileReader.value().get().hasSingleByteCoverage()); - Coverage.SingleByteCoverage = - !ProfileReader || ProfileReader.value().get().hasSingleByteCoverage(); + IndexedInstrProfReader &ProfileReader, CoverageMapping &Coverage) { + assert(!Coverage.SingleByteCoverage || + *Coverage.SingleByteCoverage == ProfileReader.hasSingleByteCoverage()); + Coverage.SingleByteCoverage = ProfileReader.hasSingleByteCoverage(); for (const auto &CoverageReader : CoverageReaders) { for (auto RecordOrErr : *CoverageReader) { if (Error E = RecordOrErr.takeError()) @@ -991,8 +977,7 @@ Error CoverageMapping::loadFromReaders( Expected<std::unique_ptr<CoverageMapping>> CoverageMapping::load( ArrayRef<std::unique_ptr<CoverageMappingReader>> CoverageReaders, - std::optional<std::reference_wrapper<IndexedInstrProfReader>> - &ProfileReader) { + IndexedInstrProfReader &ProfileReader) { auto Coverage = std::unique_ptr<CoverageMapping>(new CoverageMapping()); if (Error E = loadFromReaders(CoverageReaders, ProfileReader, *Coverage)) return std::move(E); @@ -1001,19 +986,18 @@ Expected<std::unique_ptr<CoverageMapping>> CoverageMapping::load( // If E is a no_data_found error, returns success. Otherwise returns E. static Error handleMaybeNoDataFoundError(Error E) { - return handleErrors(std::move(E), [](const CoverageMapError &CME) { - if (CME.get() == coveragemap_error::no_data_found) - return static_cast<Error>(Error::success()); - return make_error<CoverageMapError>(CME.get(), CME.getMessage()); - }); + return handleErrors( + std::move(E), [](const CoverageMapError &CME) { + if (CME.get() == coveragemap_error::no_data_found) + return static_cast<Error>(Error::success()); + return make_error<CoverageMapError>(CME.get(), CME.getMessage()); + }); } Error CoverageMapping::loadFromFile( StringRef Filename, StringRef Arch, StringRef CompilationDir, - std::optional<std::reference_wrapper<IndexedInstrProfReader>> - &ProfileReader, - CoverageMapping &Coverage, bool &DataFound, - SmallVectorImpl<object::BuildID> *FoundBinaryIDs) { + IndexedInstrProfReader &ProfileReader, CoverageMapping &Coverage, + bool &DataFound, SmallVectorImpl<object::BuildID> *FoundBinaryIDs) { auto CovMappingBufOrErr = MemoryBuffer::getFileOrSTDIN( Filename, /*IsText=*/false, /*RequiresNullTerminator=*/false); if (std::error_code EC = CovMappingBufOrErr.getError()) @@ -1049,23 +1033,13 @@ Error CoverageMapping::loadFromFile( } Expected<std::unique_ptr<CoverageMapping>> CoverageMapping::load( - ArrayRef<StringRef> ObjectFilenames, - std::optional<StringRef> ProfileFilename, vfs::FileSystem &FS, - ArrayRef<StringRef> Arches, StringRef CompilationDir, + ArrayRef<StringRef> ObjectFilenames, StringRef ProfileFilename, + vfs::FileSystem &FS, ArrayRef<StringRef> Arches, StringRef CompilationDir, const object::BuildIDFetcher *BIDFetcher, bool CheckBinaryIDs) { - std::unique_ptr<IndexedInstrProfReader> ProfileReader; - if (ProfileFilename) { - auto ProfileReaderOrErr = - IndexedInstrProfReader::create(ProfileFilename.value(), FS); - if (Error E = ProfileReaderOrErr.takeError()) - return createFileError(ProfileFilename.value(), std::move(E)); - ProfileReader = std::move(ProfileReaderOrErr.get()); - } - auto ProfileReaderRef = - ProfileReader - ? std::optional<std::reference_wrapper<IndexedInstrProfReader>>( - *ProfileReader) - : std::nullopt; + auto ProfileReaderOrErr = IndexedInstrProfReader::create(ProfileFilename, FS); + if (Error E = ProfileReaderOrErr.takeError()) + return createFileError(ProfileFilename, std::move(E)); + auto ProfileReader = std::move(ProfileReaderOrErr.get()); auto Coverage = std::unique_ptr<CoverageMapping>(new CoverageMapping()); bool DataFound = false; @@ -1079,17 +1053,16 @@ Expected<std::unique_ptr<CoverageMapping>> CoverageMapping::load( SmallVector<object::BuildID> FoundBinaryIDs; for (const auto &File : llvm::enumerate(ObjectFilenames)) { - if (Error E = loadFromFile(File.value(), GetArch(File.index()), - CompilationDir, ProfileReaderRef, *Coverage, - DataFound, &FoundBinaryIDs)) + if (Error E = + loadFromFile(File.value(), GetArch(File.index()), CompilationDir, + *ProfileReader, *Coverage, DataFound, &FoundBinaryIDs)) return std::move(E); } if (BIDFetcher) { std::vector<object::BuildID> ProfileBinaryIDs; - if (ProfileReader) - if (Error E = ProfileReader->readBinaryIds(ProfileBinaryIDs)) - return createFileError(ProfileFilename.value(), std::move(E)); + if (Error E = ProfileReader->readBinaryIds(ProfileBinaryIDs)) + return createFileError(ProfileFilename, std::move(E)); SmallVector<object::BuildIDRef> BinaryIDsToFetch; if (!ProfileBinaryIDs.empty()) { @@ -1109,12 +1082,12 @@ Expected<std::unique_ptr<CoverageMapping>> CoverageMapping::load( if (PathOpt) { std::string Path = std::move(*PathOpt); StringRef Arch = Arches.size() == 1 ? Arches.front() : StringRef(); - if (Error E = loadFromFile(Path, Arch, CompilationDir, ProfileReaderRef, - *Coverage, DataFound)) + if (Error E = loadFromFile(Path, Arch, CompilationDir, *ProfileReader, + *Coverage, DataFound)) return std::move(E); } else if (CheckBinaryIDs) { return createFileError( - ProfileFilename.value(), + ProfileFilename, createStringError(errc::no_such_file_or_directory, "Missing binary ID: " + llvm::toHex(BinaryID, /*LowerCase=*/true))); |