Error CoverageMapping::loadFunctionRecord( const CoverageMappingRecord &Record, IndexedInstrProfReader &ProfileReader) { StringRef OrigFuncName = Record.FunctionName; if (OrigFuncName.empty()) return make_error<CoverageMapError>(coveragemap_error::malformed); if (Record.Filenames.empty()) OrigFuncName = getFuncNameWithoutPrefix(OrigFuncName); else OrigFuncName = getFuncNameWithoutPrefix(OrigFuncName, Record.Filenames[0]); // Don't load records for functions we've already seen. if (!FunctionNames.insert(OrigFuncName).second) return Error::success(); CounterMappingContext Ctx(Record.Expressions); std::vector<uint64_t> Counts; if (Error E = ProfileReader.getFunctionCounts(Record.FunctionName, Record.FunctionHash, Counts)) { instrprof_error IPE = InstrProfError::take(std::move(E)); if (IPE == instrprof_error::hash_mismatch) { FuncHashMismatches.emplace_back(Record.FunctionName, Record.FunctionHash); return Error::success(); } else if (IPE != instrprof_error::unknown_function) return make_error<InstrProfError>(IPE); Counts.assign(Record.MappingRegions.size(), 0); } Ctx.setCounts(Counts); assert(!Record.MappingRegions.empty() && "Function has no regions"); FunctionRecord Function(OrigFuncName, Record.Filenames); for (const auto &Region : Record.MappingRegions) { Expected<int64_t> ExecutionCount = Ctx.evaluate(Region.Count); if (auto E = ExecutionCount.takeError()) { consumeError(std::move(E)); return Error::success(); } Function.pushRegion(Region, *ExecutionCount); } if (Function.CountedRegions.size() != Record.MappingRegions.size()) { FuncCounterMismatches.emplace_back(Record.FunctionName, Function.CountedRegions.size()); return Error::success(); } Functions.push_back(std::move(Function)); return Error::success(); }
Expected<std::unique_ptr<CoverageMapping>> CoverageMapping::load(CoverageMappingReader &CoverageReader, IndexedInstrProfReader &ProfileReader) { auto Coverage = std::unique_ptr<CoverageMapping>(new CoverageMapping()); std::vector<uint64_t> Counts; for (const auto &Record : CoverageReader) { CounterMappingContext Ctx(Record.Expressions); Counts.clear(); if (Error E = ProfileReader.getFunctionCounts( Record.FunctionName, Record.FunctionHash, Counts)) { instrprof_error IPE = InstrProfError::take(std::move(E)); if (IPE == instrprof_error::hash_mismatch) { Coverage->MismatchedFunctionCount++; continue; } else if (IPE != instrprof_error::unknown_function) return make_error<InstrProfError>(IPE); Counts.assign(Record.MappingRegions.size(), 0); } Ctx.setCounts(Counts); assert(!Record.MappingRegions.empty() && "Function has no regions"); StringRef OrigFuncName = Record.FunctionName; if (Record.Filenames.empty()) OrigFuncName = getFuncNameWithoutPrefix(OrigFuncName); else OrigFuncName = getFuncNameWithoutPrefix(OrigFuncName, Record.Filenames[0]); FunctionRecord Function(OrigFuncName, Record.Filenames); for (const auto &Region : Record.MappingRegions) { Expected<int64_t> ExecutionCount = Ctx.evaluate(Region.Count); if (auto E = ExecutionCount.takeError()) { llvm::consumeError(std::move(E)); break; } Function.pushRegion(Region, *ExecutionCount); } if (Function.CountedRegions.size() != Record.MappingRegions.size()) { Coverage->MismatchedFunctionCount++; continue; } Coverage->Functions.push_back(std::move(Function)); } return std::move(Coverage); }
ErrorOr<std::unique_ptr<CoverageMapping>> CoverageMapping::load(CoverageMappingReader &CoverageReader, IndexedInstrProfReader &ProfileReader) { auto Coverage = std::unique_ptr<CoverageMapping>(new CoverageMapping()); std::vector<uint64_t> Counts; for (const auto &Record : CoverageReader) { CounterMappingContext Ctx(Record.Expressions); Counts.clear(); if (std::error_code EC = ProfileReader.getFunctionCounts( Record.FunctionName, Record.FunctionHash, Counts)) { if (EC == instrprof_error::hash_mismatch) { Coverage->MismatchedFunctionCount++; continue; } else if (EC != instrprof_error::unknown_function) return EC; Counts.assign(Record.MappingRegions.size(), 0); } Ctx.setCounts(Counts); assert(!Record.MappingRegions.empty() && "Function has no regions"); FunctionRecord Function(getFuncNameWithoutPrefix(Record), Record.Filenames); for (const auto &Region : Record.MappingRegions) { ErrorOr<int64_t> ExecutionCount = Ctx.evaluate(Region.Count); if (!ExecutionCount) break; Function.pushRegion(Region, *ExecutionCount); } if (Function.CountedRegions.size() != Record.MappingRegions.size()) { Coverage->MismatchedFunctionCount++; continue; } Coverage->Functions.push_back(std::move(Function)); } return std::move(Coverage); }
ErrorOr<std::unique_ptr<CoverageMapping>> CoverageMapping::load(ObjectFileCoverageMappingReader &CoverageReader, IndexedInstrProfReader &ProfileReader) { auto Coverage = std::unique_ptr<CoverageMapping>(new CoverageMapping()); std::vector<uint64_t> Counts; for (const auto &Record : CoverageReader) { Counts.clear(); if (std::error_code EC = ProfileReader.getFunctionCounts( Record.FunctionName, Record.FunctionHash, Counts)) { if (EC != instrprof_error::hash_mismatch && EC != instrprof_error::unknown_function) return EC; Coverage->MismatchedFunctionCount++; continue; } assert(Counts.size() != 0 && "Function's counts are empty"); FunctionRecord Function(Record.FunctionName, Record.Filenames, Counts.front()); CounterMappingContext Ctx(Record.Expressions, Counts); for (const auto &Region : Record.MappingRegions) { ErrorOr<int64_t> ExecutionCount = Ctx.evaluate(Region.Count); if (!ExecutionCount) break; Function.CountedRegions.push_back(CountedRegion(Region, *ExecutionCount)); } if (Function.CountedRegions.size() != Record.MappingRegions.size()) { Coverage->MismatchedFunctionCount++; continue; } Coverage->Functions.push_back(std::move(Function)); } return std::move(Coverage); }