xref: /freebsd/contrib/llvm-project/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp (revision a977168c48d45085cdf0c40f9b9bde3850b1f3ea)
1  //===- CoverageMappingReader.cpp - Code coverage mapping reader -----------===//
2  //
3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4  // See https://llvm.org/LICENSE.txt for license information.
5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6  //
7  //===----------------------------------------------------------------------===//
8  //
9  // This file contains support for reading coverage mapping data for
10  // instrumentation based coverage.
11  //
12  //===----------------------------------------------------------------------===//
13  
14  #include "llvm/ProfileData/Coverage/CoverageMappingReader.h"
15  #include "llvm/ADT/ArrayRef.h"
16  #include "llvm/ADT/DenseMap.h"
17  #include "llvm/ADT/STLExtras.h"
18  #include "llvm/ADT/SmallVector.h"
19  #include "llvm/ADT/Statistic.h"
20  #include "llvm/ADT/StringRef.h"
21  #include "llvm/ADT/Triple.h"
22  #include "llvm/Object/Binary.h"
23  #include "llvm/Object/COFF.h"
24  #include "llvm/Object/Error.h"
25  #include "llvm/Object/MachOUniversal.h"
26  #include "llvm/Object/ObjectFile.h"
27  #include "llvm/ProfileData/InstrProf.h"
28  #include "llvm/Support/Casting.h"
29  #include "llvm/Support/Compression.h"
30  #include "llvm/Support/Debug.h"
31  #include "llvm/Support/Endian.h"
32  #include "llvm/Support/Error.h"
33  #include "llvm/Support/ErrorHandling.h"
34  #include "llvm/Support/LEB128.h"
35  #include "llvm/Support/MathExtras.h"
36  #include "llvm/Support/Path.h"
37  #include "llvm/Support/raw_ostream.h"
38  #include <vector>
39  
40  using namespace llvm;
41  using namespace coverage;
42  using namespace object;
43  
44  #define DEBUG_TYPE "coverage-mapping"
45  
46  STATISTIC(CovMapNumRecords, "The # of coverage function records");
47  STATISTIC(CovMapNumUsedRecords, "The # of used coverage function records");
48  
49  void CoverageMappingIterator::increment() {
50    if (ReadErr != coveragemap_error::success)
51      return;
52  
53    // Check if all the records were read or if an error occurred while reading
54    // the next record.
55    if (auto E = Reader->readNextRecord(Record))
56      handleAllErrors(std::move(E), [&](const CoverageMapError &CME) {
57        if (CME.get() == coveragemap_error::eof)
58          *this = CoverageMappingIterator();
59        else
60          ReadErr = CME.get();
61      });
62  }
63  
64  Error RawCoverageReader::readULEB128(uint64_t &Result) {
65    if (Data.empty())
66      return make_error<CoverageMapError>(coveragemap_error::truncated);
67    unsigned N = 0;
68    Result = decodeULEB128(Data.bytes_begin(), &N);
69    if (N > Data.size())
70      return make_error<CoverageMapError>(coveragemap_error::malformed);
71    Data = Data.substr(N);
72    return Error::success();
73  }
74  
75  Error RawCoverageReader::readIntMax(uint64_t &Result, uint64_t MaxPlus1) {
76    if (auto Err = readULEB128(Result))
77      return Err;
78    if (Result >= MaxPlus1)
79      return make_error<CoverageMapError>(coveragemap_error::malformed);
80    return Error::success();
81  }
82  
83  Error RawCoverageReader::readSize(uint64_t &Result) {
84    if (auto Err = readULEB128(Result))
85      return Err;
86    if (Result > Data.size())
87      return make_error<CoverageMapError>(coveragemap_error::malformed);
88    return Error::success();
89  }
90  
91  Error RawCoverageReader::readString(StringRef &Result) {
92    uint64_t Length;
93    if (auto Err = readSize(Length))
94      return Err;
95    Result = Data.substr(0, Length);
96    Data = Data.substr(Length);
97    return Error::success();
98  }
99  
100  Error RawCoverageFilenamesReader::read(CovMapVersion Version) {
101    uint64_t NumFilenames;
102    if (auto Err = readSize(NumFilenames))
103      return Err;
104    if (!NumFilenames)
105      return make_error<CoverageMapError>(coveragemap_error::malformed);
106  
107    if (Version < CovMapVersion::Version4)
108      return readUncompressed(Version, NumFilenames);
109  
110    // The uncompressed length may exceed the size of the encoded filenames.
111    // Skip size validation.
112    uint64_t UncompressedLen;
113    if (auto Err = readULEB128(UncompressedLen))
114      return Err;
115  
116    uint64_t CompressedLen;
117    if (auto Err = readSize(CompressedLen))
118      return Err;
119  
120    if (CompressedLen > 0) {
121      if (!zlib::isAvailable())
122        return make_error<CoverageMapError>(
123            coveragemap_error::decompression_failed);
124  
125      // Allocate memory for the decompressed filenames.
126      SmallVector<char, 0> StorageBuf;
127  
128      // Read compressed filenames.
129      StringRef CompressedFilenames = Data.substr(0, CompressedLen);
130      Data = Data.substr(CompressedLen);
131      auto Err =
132          zlib::uncompress(CompressedFilenames, StorageBuf, UncompressedLen);
133      if (Err) {
134        consumeError(std::move(Err));
135        return make_error<CoverageMapError>(
136            coveragemap_error::decompression_failed);
137      }
138  
139      StringRef UncompressedFilenames(StorageBuf.data(), StorageBuf.size());
140      RawCoverageFilenamesReader Delegate(UncompressedFilenames, Filenames,
141                                          CompilationDir);
142      return Delegate.readUncompressed(Version, NumFilenames);
143    }
144  
145    return readUncompressed(Version, NumFilenames);
146  }
147  
148  Error RawCoverageFilenamesReader::readUncompressed(CovMapVersion Version,
149                                                     uint64_t NumFilenames) {
150    // Read uncompressed filenames.
151    if (Version < CovMapVersion::Version6) {
152      for (size_t I = 0; I < NumFilenames; ++I) {
153        StringRef Filename;
154        if (auto Err = readString(Filename))
155          return Err;
156        Filenames.push_back(Filename.str());
157      }
158    } else {
159      StringRef CWD;
160      if (auto Err = readString(CWD))
161        return Err;
162      Filenames.push_back(CWD.str());
163  
164      for (size_t I = 1; I < NumFilenames; ++I) {
165        StringRef Filename;
166        if (auto Err = readString(Filename))
167          return Err;
168        if (sys::path::is_absolute(Filename)) {
169          Filenames.push_back(Filename.str());
170        } else {
171          SmallString<256> P;
172          if (!CompilationDir.empty())
173            P.assign(CompilationDir);
174          else
175            P.assign(CWD);
176          llvm::sys::path::append(P, Filename);
177          Filenames.push_back(static_cast<std::string>(P));
178        }
179      }
180    }
181    return Error::success();
182  }
183  
184  Error RawCoverageMappingReader::decodeCounter(unsigned Value, Counter &C) {
185    auto Tag = Value & Counter::EncodingTagMask;
186    switch (Tag) {
187    case Counter::Zero:
188      C = Counter::getZero();
189      return Error::success();
190    case Counter::CounterValueReference:
191      C = Counter::getCounter(Value >> Counter::EncodingTagBits);
192      return Error::success();
193    default:
194      break;
195    }
196    Tag -= Counter::Expression;
197    switch (Tag) {
198    case CounterExpression::Subtract:
199    case CounterExpression::Add: {
200      auto ID = Value >> Counter::EncodingTagBits;
201      if (ID >= Expressions.size())
202        return make_error<CoverageMapError>(coveragemap_error::malformed);
203      Expressions[ID].Kind = CounterExpression::ExprKind(Tag);
204      C = Counter::getExpression(ID);
205      break;
206    }
207    default:
208      return make_error<CoverageMapError>(coveragemap_error::malformed);
209    }
210    return Error::success();
211  }
212  
213  Error RawCoverageMappingReader::readCounter(Counter &C) {
214    uint64_t EncodedCounter;
215    if (auto Err =
216            readIntMax(EncodedCounter, std::numeric_limits<unsigned>::max()))
217      return Err;
218    if (auto Err = decodeCounter(EncodedCounter, C))
219      return Err;
220    return Error::success();
221  }
222  
223  static const unsigned EncodingExpansionRegionBit = 1
224                                                     << Counter::EncodingTagBits;
225  
226  /// Read the sub-array of regions for the given inferred file id.
227  /// \param NumFileIDs the number of file ids that are defined for this
228  /// function.
229  Error RawCoverageMappingReader::readMappingRegionsSubArray(
230      std::vector<CounterMappingRegion> &MappingRegions, unsigned InferredFileID,
231      size_t NumFileIDs) {
232    uint64_t NumRegions;
233    if (auto Err = readSize(NumRegions))
234      return Err;
235    unsigned LineStart = 0;
236    for (size_t I = 0; I < NumRegions; ++I) {
237      Counter C, C2;
238      CounterMappingRegion::RegionKind Kind = CounterMappingRegion::CodeRegion;
239  
240      // Read the combined counter + region kind.
241      uint64_t EncodedCounterAndRegion;
242      if (auto Err = readIntMax(EncodedCounterAndRegion,
243                                std::numeric_limits<unsigned>::max()))
244        return Err;
245      unsigned Tag = EncodedCounterAndRegion & Counter::EncodingTagMask;
246      uint64_t ExpandedFileID = 0;
247  
248      // If Tag does not represent a ZeroCounter, then it is understood to refer
249      // to a counter or counter expression with region kind assumed to be
250      // "CodeRegion". In that case, EncodedCounterAndRegion actually encodes the
251      // referenced counter or counter expression (and nothing else).
252      //
253      // If Tag represents a ZeroCounter and EncodingExpansionRegionBit is set,
254      // then EncodedCounterAndRegion is interpreted to represent an
255      // ExpansionRegion. In all other cases, EncodedCounterAndRegion is
256      // interpreted to refer to a specific region kind, after which additional
257      // fields may be read (e.g. BranchRegions have two encoded counters that
258      // follow an encoded region kind value).
259      if (Tag != Counter::Zero) {
260        if (auto Err = decodeCounter(EncodedCounterAndRegion, C))
261          return Err;
262      } else {
263        // Is it an expansion region?
264        if (EncodedCounterAndRegion & EncodingExpansionRegionBit) {
265          Kind = CounterMappingRegion::ExpansionRegion;
266          ExpandedFileID = EncodedCounterAndRegion >>
267                           Counter::EncodingCounterTagAndExpansionRegionTagBits;
268          if (ExpandedFileID >= NumFileIDs)
269            return make_error<CoverageMapError>(coveragemap_error::malformed);
270        } else {
271          switch (EncodedCounterAndRegion >>
272                  Counter::EncodingCounterTagAndExpansionRegionTagBits) {
273          case CounterMappingRegion::CodeRegion:
274            // Don't do anything when we have a code region with a zero counter.
275            break;
276          case CounterMappingRegion::SkippedRegion:
277            Kind = CounterMappingRegion::SkippedRegion;
278            break;
279          case CounterMappingRegion::BranchRegion:
280            // For a Branch Region, read two successive counters.
281            Kind = CounterMappingRegion::BranchRegion;
282            if (auto Err = readCounter(C))
283              return Err;
284            if (auto Err = readCounter(C2))
285              return Err;
286            break;
287          default:
288            return make_error<CoverageMapError>(coveragemap_error::malformed);
289          }
290        }
291      }
292  
293      // Read the source range.
294      uint64_t LineStartDelta, ColumnStart, NumLines, ColumnEnd;
295      if (auto Err =
296              readIntMax(LineStartDelta, std::numeric_limits<unsigned>::max()))
297        return Err;
298      if (auto Err = readULEB128(ColumnStart))
299        return Err;
300      if (ColumnStart > std::numeric_limits<unsigned>::max())
301        return make_error<CoverageMapError>(coveragemap_error::malformed);
302      if (auto Err = readIntMax(NumLines, std::numeric_limits<unsigned>::max()))
303        return Err;
304      if (auto Err = readIntMax(ColumnEnd, std::numeric_limits<unsigned>::max()))
305        return Err;
306      LineStart += LineStartDelta;
307  
308      // If the high bit of ColumnEnd is set, this is a gap region.
309      if (ColumnEnd & (1U << 31)) {
310        Kind = CounterMappingRegion::GapRegion;
311        ColumnEnd &= ~(1U << 31);
312      }
313  
314      // Adjust the column locations for the empty regions that are supposed to
315      // cover whole lines. Those regions should be encoded with the
316      // column range (1 -> std::numeric_limits<unsigned>::max()), but because
317      // the encoded std::numeric_limits<unsigned>::max() is several bytes long,
318      // we set the column range to (0 -> 0) to ensure that the column start and
319      // column end take up one byte each.
320      // The std::numeric_limits<unsigned>::max() is used to represent a column
321      // position at the end of the line without knowing the length of that line.
322      if (ColumnStart == 0 && ColumnEnd == 0) {
323        ColumnStart = 1;
324        ColumnEnd = std::numeric_limits<unsigned>::max();
325      }
326  
327      LLVM_DEBUG({
328        dbgs() << "Counter in file " << InferredFileID << " " << LineStart << ":"
329               << ColumnStart << " -> " << (LineStart + NumLines) << ":"
330               << ColumnEnd << ", ";
331        if (Kind == CounterMappingRegion::ExpansionRegion)
332          dbgs() << "Expands to file " << ExpandedFileID;
333        else
334          CounterMappingContext(Expressions).dump(C, dbgs());
335        dbgs() << "\n";
336      });
337  
338      auto CMR = CounterMappingRegion(C, C2, InferredFileID, ExpandedFileID,
339                                      LineStart, ColumnStart,
340                                      LineStart + NumLines, ColumnEnd, Kind);
341      if (CMR.startLoc() > CMR.endLoc())
342        return make_error<CoverageMapError>(coveragemap_error::malformed);
343      MappingRegions.push_back(CMR);
344    }
345    return Error::success();
346  }
347  
348  Error RawCoverageMappingReader::read() {
349    // Read the virtual file mapping.
350    SmallVector<unsigned, 8> VirtualFileMapping;
351    uint64_t NumFileMappings;
352    if (auto Err = readSize(NumFileMappings))
353      return Err;
354    for (size_t I = 0; I < NumFileMappings; ++I) {
355      uint64_t FilenameIndex;
356      if (auto Err = readIntMax(FilenameIndex, TranslationUnitFilenames.size()))
357        return Err;
358      VirtualFileMapping.push_back(FilenameIndex);
359    }
360  
361    // Construct the files using unique filenames and virtual file mapping.
362    for (auto I : VirtualFileMapping) {
363      Filenames.push_back(TranslationUnitFilenames[I]);
364    }
365  
366    // Read the expressions.
367    uint64_t NumExpressions;
368    if (auto Err = readSize(NumExpressions))
369      return Err;
370    // Create an array of dummy expressions that get the proper counters
371    // when the expressions are read, and the proper kinds when the counters
372    // are decoded.
373    Expressions.resize(
374        NumExpressions,
375        CounterExpression(CounterExpression::Subtract, Counter(), Counter()));
376    for (size_t I = 0; I < NumExpressions; ++I) {
377      if (auto Err = readCounter(Expressions[I].LHS))
378        return Err;
379      if (auto Err = readCounter(Expressions[I].RHS))
380        return Err;
381    }
382  
383    // Read the mapping regions sub-arrays.
384    for (unsigned InferredFileID = 0, S = VirtualFileMapping.size();
385         InferredFileID < S; ++InferredFileID) {
386      if (auto Err = readMappingRegionsSubArray(MappingRegions, InferredFileID,
387                                                VirtualFileMapping.size()))
388        return Err;
389    }
390  
391    // Set the counters for the expansion regions.
392    // i.e. Counter of expansion region = counter of the first region
393    // from the expanded file.
394    // Perform multiple passes to correctly propagate the counters through
395    // all the nested expansion regions.
396    SmallVector<CounterMappingRegion *, 8> FileIDExpansionRegionMapping;
397    FileIDExpansionRegionMapping.resize(VirtualFileMapping.size(), nullptr);
398    for (unsigned Pass = 1, S = VirtualFileMapping.size(); Pass < S; ++Pass) {
399      for (auto &R : MappingRegions) {
400        if (R.Kind != CounterMappingRegion::ExpansionRegion)
401          continue;
402        assert(!FileIDExpansionRegionMapping[R.ExpandedFileID]);
403        FileIDExpansionRegionMapping[R.ExpandedFileID] = &R;
404      }
405      for (auto &R : MappingRegions) {
406        if (FileIDExpansionRegionMapping[R.FileID]) {
407          FileIDExpansionRegionMapping[R.FileID]->Count = R.Count;
408          FileIDExpansionRegionMapping[R.FileID] = nullptr;
409        }
410      }
411    }
412  
413    return Error::success();
414  }
415  
416  Expected<bool> RawCoverageMappingDummyChecker::isDummy() {
417    // A dummy coverage mapping data consists of just one region with zero count.
418    uint64_t NumFileMappings;
419    if (Error Err = readSize(NumFileMappings))
420      return std::move(Err);
421    if (NumFileMappings != 1)
422      return false;
423    // We don't expect any specific value for the filename index, just skip it.
424    uint64_t FilenameIndex;
425    if (Error Err =
426            readIntMax(FilenameIndex, std::numeric_limits<unsigned>::max()))
427      return std::move(Err);
428    uint64_t NumExpressions;
429    if (Error Err = readSize(NumExpressions))
430      return std::move(Err);
431    if (NumExpressions != 0)
432      return false;
433    uint64_t NumRegions;
434    if (Error Err = readSize(NumRegions))
435      return std::move(Err);
436    if (NumRegions != 1)
437      return false;
438    uint64_t EncodedCounterAndRegion;
439    if (Error Err = readIntMax(EncodedCounterAndRegion,
440                               std::numeric_limits<unsigned>::max()))
441      return std::move(Err);
442    unsigned Tag = EncodedCounterAndRegion & Counter::EncodingTagMask;
443    return Tag == Counter::Zero;
444  }
445  
446  Error InstrProfSymtab::create(SectionRef &Section) {
447    Expected<StringRef> DataOrErr = Section.getContents();
448    if (!DataOrErr)
449      return DataOrErr.takeError();
450    Data = *DataOrErr;
451    Address = Section.getAddress();
452  
453    // If this is a linked PE/COFF file, then we have to skip over the null byte
454    // that is allocated in the .lprfn$A section in the LLVM profiling runtime.
455    const ObjectFile *Obj = Section.getObject();
456    if (isa<COFFObjectFile>(Obj) && !Obj->isRelocatableObject())
457      Data = Data.drop_front(1);
458  
459    return Error::success();
460  }
461  
462  StringRef InstrProfSymtab::getFuncName(uint64_t Pointer, size_t Size) {
463    if (Pointer < Address)
464      return StringRef();
465    auto Offset = Pointer - Address;
466    if (Offset + Size > Data.size())
467      return StringRef();
468    return Data.substr(Pointer - Address, Size);
469  }
470  
471  // Check if the mapping data is a dummy, i.e. is emitted for an unused function.
472  static Expected<bool> isCoverageMappingDummy(uint64_t Hash, StringRef Mapping) {
473    // The hash value of dummy mapping records is always zero.
474    if (Hash)
475      return false;
476    return RawCoverageMappingDummyChecker(Mapping).isDummy();
477  }
478  
479  /// A range of filename indices. Used to specify the location of a batch of
480  /// filenames in a vector-like container.
481  struct FilenameRange {
482    unsigned StartingIndex;
483    unsigned Length;
484  
485    FilenameRange(unsigned StartingIndex, unsigned Length)
486        : StartingIndex(StartingIndex), Length(Length) {}
487  
488    void markInvalid() { Length = 0; }
489    bool isInvalid() const { return Length == 0; }
490  };
491  
492  namespace {
493  
494  /// The interface to read coverage mapping function records for a module.
495  struct CovMapFuncRecordReader {
496    virtual ~CovMapFuncRecordReader() = default;
497  
498    // Read a coverage header.
499    //
500    // \p CovBuf points to the buffer containing the \c CovHeader of the coverage
501    // mapping data associated with the module.
502    //
503    // Returns a pointer to the next \c CovHeader if it exists, or to an address
504    // greater than \p CovEnd if not.
505    virtual Expected<const char *> readCoverageHeader(const char *CovBuf,
506                                                      const char *CovBufEnd) = 0;
507  
508    // Read function records.
509    //
510    // \p FuncRecBuf points to the buffer containing a batch of function records.
511    // \p FuncRecBufEnd points past the end of the batch of records.
512    //
513    // Prior to Version4, \p OutOfLineFileRange points to a sequence of filenames
514    // associated with the function records. It is unused in Version4.
515    //
516    // Prior to Version4, \p OutOfLineMappingBuf points to a sequence of coverage
517    // mappings associated with the function records. It is unused in Version4.
518    virtual Error readFunctionRecords(const char *FuncRecBuf,
519                                      const char *FuncRecBufEnd,
520                                      Optional<FilenameRange> OutOfLineFileRange,
521                                      const char *OutOfLineMappingBuf,
522                                      const char *OutOfLineMappingBufEnd) = 0;
523  
524    template <class IntPtrT, support::endianness Endian>
525    static Expected<std::unique_ptr<CovMapFuncRecordReader>>
526    get(CovMapVersion Version, InstrProfSymtab &P,
527        std::vector<BinaryCoverageReader::ProfileMappingRecord> &R, StringRef D,
528        std::vector<std::string> &F);
529  };
530  
531  // A class for reading coverage mapping function records for a module.
532  template <CovMapVersion Version, class IntPtrT, support::endianness Endian>
533  class VersionedCovMapFuncRecordReader : public CovMapFuncRecordReader {
534    using FuncRecordType =
535        typename CovMapTraits<Version, IntPtrT>::CovMapFuncRecordType;
536    using NameRefType = typename CovMapTraits<Version, IntPtrT>::NameRefType;
537  
538    // Maps function's name references to the indexes of their records
539    // in \c Records.
540    DenseMap<NameRefType, size_t> FunctionRecords;
541    InstrProfSymtab &ProfileNames;
542    StringRef CompilationDir;
543    std::vector<std::string> &Filenames;
544    std::vector<BinaryCoverageReader::ProfileMappingRecord> &Records;
545  
546    // Maps a hash of the filenames in a TU to a \c FileRange. The range
547    // specifies the location of the hashed filenames in \c Filenames.
548    DenseMap<uint64_t, FilenameRange> FileRangeMap;
549  
550    // Add the record to the collection if we don't already have a record that
551    // points to the same function name. This is useful to ignore the redundant
552    // records for the functions with ODR linkage.
553    // In addition, prefer records with real coverage mapping data to dummy
554    // records, which were emitted for inline functions which were seen but
555    // not used in the corresponding translation unit.
556    Error insertFunctionRecordIfNeeded(const FuncRecordType *CFR,
557                                       StringRef Mapping,
558                                       FilenameRange FileRange) {
559      ++CovMapNumRecords;
560      uint64_t FuncHash = CFR->template getFuncHash<Endian>();
561      NameRefType NameRef = CFR->template getFuncNameRef<Endian>();
562      auto InsertResult =
563          FunctionRecords.insert(std::make_pair(NameRef, Records.size()));
564      if (InsertResult.second) {
565        StringRef FuncName;
566        if (Error Err = CFR->template getFuncName<Endian>(ProfileNames, FuncName))
567          return Err;
568        if (FuncName.empty())
569          return make_error<InstrProfError>(instrprof_error::malformed,
570                                            "function name is empty");
571        ++CovMapNumUsedRecords;
572        Records.emplace_back(Version, FuncName, FuncHash, Mapping,
573                             FileRange.StartingIndex, FileRange.Length);
574        return Error::success();
575      }
576      // Update the existing record if it's a dummy and the new record is real.
577      size_t OldRecordIndex = InsertResult.first->second;
578      BinaryCoverageReader::ProfileMappingRecord &OldRecord =
579          Records[OldRecordIndex];
580      Expected<bool> OldIsDummyExpected = isCoverageMappingDummy(
581          OldRecord.FunctionHash, OldRecord.CoverageMapping);
582      if (Error Err = OldIsDummyExpected.takeError())
583        return Err;
584      if (!*OldIsDummyExpected)
585        return Error::success();
586      Expected<bool> NewIsDummyExpected =
587          isCoverageMappingDummy(FuncHash, Mapping);
588      if (Error Err = NewIsDummyExpected.takeError())
589        return Err;
590      if (*NewIsDummyExpected)
591        return Error::success();
592      ++CovMapNumUsedRecords;
593      OldRecord.FunctionHash = FuncHash;
594      OldRecord.CoverageMapping = Mapping;
595      OldRecord.FilenamesBegin = FileRange.StartingIndex;
596      OldRecord.FilenamesSize = FileRange.Length;
597      return Error::success();
598    }
599  
600  public:
601    VersionedCovMapFuncRecordReader(
602        InstrProfSymtab &P,
603        std::vector<BinaryCoverageReader::ProfileMappingRecord> &R, StringRef D,
604        std::vector<std::string> &F)
605        : ProfileNames(P), CompilationDir(D), Filenames(F), Records(R) {}
606  
607    ~VersionedCovMapFuncRecordReader() override = default;
608  
609    Expected<const char *> readCoverageHeader(const char *CovBuf,
610                                              const char *CovBufEnd) override {
611      using namespace support;
612  
613      if (CovBuf + sizeof(CovMapHeader) > CovBufEnd)
614        return make_error<CoverageMapError>(coveragemap_error::malformed);
615      auto CovHeader = reinterpret_cast<const CovMapHeader *>(CovBuf);
616      uint32_t NRecords = CovHeader->getNRecords<Endian>();
617      uint32_t FilenamesSize = CovHeader->getFilenamesSize<Endian>();
618      uint32_t CoverageSize = CovHeader->getCoverageSize<Endian>();
619      assert((CovMapVersion)CovHeader->getVersion<Endian>() == Version);
620      CovBuf = reinterpret_cast<const char *>(CovHeader + 1);
621  
622      // Skip past the function records, saving the start and end for later.
623      // This is a no-op in Version4 (function records are read after all headers
624      // are read).
625      const char *FuncRecBuf = nullptr;
626      const char *FuncRecBufEnd = nullptr;
627      if (Version < CovMapVersion::Version4)
628        FuncRecBuf = CovBuf;
629      CovBuf += NRecords * sizeof(FuncRecordType);
630      if (Version < CovMapVersion::Version4)
631        FuncRecBufEnd = CovBuf;
632  
633      // Get the filenames.
634      if (CovBuf + FilenamesSize > CovBufEnd)
635        return make_error<CoverageMapError>(coveragemap_error::malformed);
636      size_t FilenamesBegin = Filenames.size();
637      StringRef FilenameRegion(CovBuf, FilenamesSize);
638      RawCoverageFilenamesReader Reader(FilenameRegion, Filenames,
639                                        CompilationDir);
640      if (auto Err = Reader.read(Version))
641        return std::move(Err);
642      CovBuf += FilenamesSize;
643      FilenameRange FileRange(FilenamesBegin, Filenames.size() - FilenamesBegin);
644  
645      if (Version >= CovMapVersion::Version4) {
646        // Map a hash of the filenames region to the filename range associated
647        // with this coverage header.
648        int64_t FilenamesRef =
649            llvm::IndexedInstrProf::ComputeHash(FilenameRegion);
650        auto Insert =
651            FileRangeMap.insert(std::make_pair(FilenamesRef, FileRange));
652        if (!Insert.second) {
653          // The same filenames ref was encountered twice. It's possible that
654          // the associated filenames are the same.
655          auto It = Filenames.begin();
656          FilenameRange &OrigRange = Insert.first->getSecond();
657          if (std::equal(It + OrigRange.StartingIndex,
658                         It + OrigRange.StartingIndex + OrigRange.Length,
659                         It + FileRange.StartingIndex,
660                         It + FileRange.StartingIndex + FileRange.Length))
661            // Map the new range to the original one.
662            FileRange = OrigRange;
663          else
664            // This is a hash collision. Mark the filenames ref invalid.
665            OrigRange.markInvalid();
666        }
667      }
668  
669      // We'll read the coverage mapping records in the loop below.
670      // This is a no-op in Version4 (coverage mappings are not affixed to the
671      // coverage header).
672      const char *MappingBuf = CovBuf;
673      if (Version >= CovMapVersion::Version4 && CoverageSize != 0)
674        return make_error<CoverageMapError>(coveragemap_error::malformed);
675      CovBuf += CoverageSize;
676      const char *MappingEnd = CovBuf;
677  
678      if (CovBuf > CovBufEnd)
679        return make_error<CoverageMapError>(coveragemap_error::malformed);
680  
681      if (Version < CovMapVersion::Version4) {
682        // Read each function record.
683        if (Error E = readFunctionRecords(FuncRecBuf, FuncRecBufEnd, FileRange,
684                                          MappingBuf, MappingEnd))
685          return std::move(E);
686      }
687  
688      // Each coverage map has an alignment of 8, so we need to adjust alignment
689      // before reading the next map.
690      CovBuf += offsetToAlignedAddr(CovBuf, Align(8));
691  
692      return CovBuf;
693    }
694  
695    Error readFunctionRecords(const char *FuncRecBuf, const char *FuncRecBufEnd,
696                              Optional<FilenameRange> OutOfLineFileRange,
697                              const char *OutOfLineMappingBuf,
698                              const char *OutOfLineMappingBufEnd) override {
699      auto CFR = reinterpret_cast<const FuncRecordType *>(FuncRecBuf);
700      while ((const char *)CFR < FuncRecBufEnd) {
701        // Validate the length of the coverage mapping for this function.
702        const char *NextMappingBuf;
703        const FuncRecordType *NextCFR;
704        std::tie(NextMappingBuf, NextCFR) =
705            CFR->template advanceByOne<Endian>(OutOfLineMappingBuf);
706        if (Version < CovMapVersion::Version4)
707          if (NextMappingBuf > OutOfLineMappingBufEnd)
708            return make_error<CoverageMapError>(coveragemap_error::malformed);
709  
710        // Look up the set of filenames associated with this function record.
711        Optional<FilenameRange> FileRange;
712        if (Version < CovMapVersion::Version4) {
713          FileRange = OutOfLineFileRange;
714        } else {
715          uint64_t FilenamesRef = CFR->template getFilenamesRef<Endian>();
716          auto It = FileRangeMap.find(FilenamesRef);
717          if (It == FileRangeMap.end())
718            return make_error<CoverageMapError>(coveragemap_error::malformed);
719          else
720            FileRange = It->getSecond();
721        }
722  
723        // Now, read the coverage data.
724        if (FileRange && !FileRange->isInvalid()) {
725          StringRef Mapping =
726              CFR->template getCoverageMapping<Endian>(OutOfLineMappingBuf);
727          if (Version >= CovMapVersion::Version4 &&
728              Mapping.data() + Mapping.size() > FuncRecBufEnd)
729            return make_error<CoverageMapError>(coveragemap_error::malformed);
730          if (Error Err = insertFunctionRecordIfNeeded(CFR, Mapping, *FileRange))
731            return Err;
732        }
733  
734        std::tie(OutOfLineMappingBuf, CFR) = std::tie(NextMappingBuf, NextCFR);
735      }
736      return Error::success();
737    }
738  };
739  
740  } // end anonymous namespace
741  
742  template <class IntPtrT, support::endianness Endian>
743  Expected<std::unique_ptr<CovMapFuncRecordReader>> CovMapFuncRecordReader::get(
744      CovMapVersion Version, InstrProfSymtab &P,
745      std::vector<BinaryCoverageReader::ProfileMappingRecord> &R, StringRef D,
746      std::vector<std::string> &F) {
747    using namespace coverage;
748  
749    switch (Version) {
750    case CovMapVersion::Version1:
751      return std::make_unique<VersionedCovMapFuncRecordReader<
752          CovMapVersion::Version1, IntPtrT, Endian>>(P, R, D, F);
753    case CovMapVersion::Version2:
754    case CovMapVersion::Version3:
755    case CovMapVersion::Version4:
756    case CovMapVersion::Version5:
757    case CovMapVersion::Version6:
758      // Decompress the name data.
759      if (Error E = P.create(P.getNameData()))
760        return std::move(E);
761      if (Version == CovMapVersion::Version2)
762        return std::make_unique<VersionedCovMapFuncRecordReader<
763            CovMapVersion::Version2, IntPtrT, Endian>>(P, R, D, F);
764      else if (Version == CovMapVersion::Version3)
765        return std::make_unique<VersionedCovMapFuncRecordReader<
766            CovMapVersion::Version3, IntPtrT, Endian>>(P, R, D, F);
767      else if (Version == CovMapVersion::Version4)
768        return std::make_unique<VersionedCovMapFuncRecordReader<
769            CovMapVersion::Version4, IntPtrT, Endian>>(P, R, D, F);
770      else if (Version == CovMapVersion::Version5)
771        return std::make_unique<VersionedCovMapFuncRecordReader<
772            CovMapVersion::Version5, IntPtrT, Endian>>(P, R, D, F);
773      else if (Version == CovMapVersion::Version6)
774        return std::make_unique<VersionedCovMapFuncRecordReader<
775            CovMapVersion::Version6, IntPtrT, Endian>>(P, R, D, F);
776    }
777    llvm_unreachable("Unsupported version");
778  }
779  
780  template <typename T, support::endianness Endian>
781  static Error readCoverageMappingData(
782      InstrProfSymtab &ProfileNames, StringRef CovMap, StringRef FuncRecords,
783      std::vector<BinaryCoverageReader::ProfileMappingRecord> &Records,
784      StringRef CompilationDir, std::vector<std::string> &Filenames) {
785    using namespace coverage;
786  
787    // Read the records in the coverage data section.
788    auto CovHeader =
789        reinterpret_cast<const CovMapHeader *>(CovMap.data());
790    CovMapVersion Version = (CovMapVersion)CovHeader->getVersion<Endian>();
791    if (Version > CovMapVersion::CurrentVersion)
792      return make_error<CoverageMapError>(coveragemap_error::unsupported_version);
793    Expected<std::unique_ptr<CovMapFuncRecordReader>> ReaderExpected =
794        CovMapFuncRecordReader::get<T, Endian>(Version, ProfileNames, Records,
795                                               CompilationDir, Filenames);
796    if (Error E = ReaderExpected.takeError())
797      return E;
798    auto Reader = std::move(ReaderExpected.get());
799    const char *CovBuf = CovMap.data();
800    const char *CovBufEnd = CovBuf + CovMap.size();
801    const char *FuncRecBuf = FuncRecords.data();
802    const char *FuncRecBufEnd = FuncRecords.data() + FuncRecords.size();
803    while (CovBuf < CovBufEnd) {
804      // Read the current coverage header & filename data.
805      //
806      // Prior to Version4, this also reads all function records affixed to the
807      // header.
808      //
809      // Return a pointer to the next coverage header.
810      auto NextOrErr = Reader->readCoverageHeader(CovBuf, CovBufEnd);
811      if (auto E = NextOrErr.takeError())
812        return E;
813      CovBuf = NextOrErr.get();
814    }
815    // In Version4, function records are not affixed to coverage headers. Read
816    // the records from their dedicated section.
817    if (Version >= CovMapVersion::Version4)
818      return Reader->readFunctionRecords(FuncRecBuf, FuncRecBufEnd, None, nullptr,
819                                         nullptr);
820    return Error::success();
821  }
822  
823  static const char *TestingFormatMagic = "llvmcovmtestdata";
824  
825  Expected<std::unique_ptr<BinaryCoverageReader>>
826  BinaryCoverageReader::createCoverageReaderFromBuffer(
827      StringRef Coverage, FuncRecordsStorage &&FuncRecords,
828      InstrProfSymtab &&ProfileNames, uint8_t BytesInAddress,
829      support::endianness Endian, StringRef CompilationDir) {
830    std::unique_ptr<BinaryCoverageReader> Reader(
831        new BinaryCoverageReader(std::move(FuncRecords)));
832    Reader->ProfileNames = std::move(ProfileNames);
833    StringRef FuncRecordsRef = Reader->FuncRecords->getBuffer();
834    if (BytesInAddress == 4 && Endian == support::endianness::little) {
835      if (Error E =
836              readCoverageMappingData<uint32_t, support::endianness::little>(
837                  Reader->ProfileNames, Coverage, FuncRecordsRef,
838                  Reader->MappingRecords, CompilationDir, Reader->Filenames))
839        return std::move(E);
840    } else if (BytesInAddress == 4 && Endian == support::endianness::big) {
841      if (Error E = readCoverageMappingData<uint32_t, support::endianness::big>(
842              Reader->ProfileNames, Coverage, FuncRecordsRef,
843              Reader->MappingRecords, CompilationDir, Reader->Filenames))
844        return std::move(E);
845    } else if (BytesInAddress == 8 && Endian == support::endianness::little) {
846      if (Error E =
847              readCoverageMappingData<uint64_t, support::endianness::little>(
848                  Reader->ProfileNames, Coverage, FuncRecordsRef,
849                  Reader->MappingRecords, CompilationDir, Reader->Filenames))
850        return std::move(E);
851    } else if (BytesInAddress == 8 && Endian == support::endianness::big) {
852      if (Error E = readCoverageMappingData<uint64_t, support::endianness::big>(
853              Reader->ProfileNames, Coverage, FuncRecordsRef,
854              Reader->MappingRecords, CompilationDir, Reader->Filenames))
855        return std::move(E);
856    } else
857      return make_error<CoverageMapError>(coveragemap_error::malformed);
858    return std::move(Reader);
859  }
860  
861  static Expected<std::unique_ptr<BinaryCoverageReader>>
862  loadTestingFormat(StringRef Data, StringRef CompilationDir) {
863    uint8_t BytesInAddress = 8;
864    support::endianness Endian = support::endianness::little;
865  
866    Data = Data.substr(StringRef(TestingFormatMagic).size());
867    if (Data.empty())
868      return make_error<CoverageMapError>(coveragemap_error::truncated);
869    unsigned N = 0;
870    uint64_t ProfileNamesSize = decodeULEB128(Data.bytes_begin(), &N);
871    if (N > Data.size())
872      return make_error<CoverageMapError>(coveragemap_error::malformed);
873    Data = Data.substr(N);
874    if (Data.empty())
875      return make_error<CoverageMapError>(coveragemap_error::truncated);
876    N = 0;
877    uint64_t Address = decodeULEB128(Data.bytes_begin(), &N);
878    if (N > Data.size())
879      return make_error<CoverageMapError>(coveragemap_error::malformed);
880    Data = Data.substr(N);
881    if (Data.size() < ProfileNamesSize)
882      return make_error<CoverageMapError>(coveragemap_error::malformed);
883    InstrProfSymtab ProfileNames;
884    if (Error E = ProfileNames.create(Data.substr(0, ProfileNamesSize), Address))
885      return std::move(E);
886    Data = Data.substr(ProfileNamesSize);
887    // Skip the padding bytes because coverage map data has an alignment of 8.
888    size_t Pad = offsetToAlignedAddr(Data.data(), Align(8));
889    if (Data.size() < Pad)
890      return make_error<CoverageMapError>(coveragemap_error::malformed);
891    Data = Data.substr(Pad);
892    if (Data.size() < sizeof(CovMapHeader))
893      return make_error<CoverageMapError>(coveragemap_error::malformed);
894    auto const *CovHeader = reinterpret_cast<const CovMapHeader *>(
895        Data.substr(0, sizeof(CovMapHeader)).data());
896    CovMapVersion Version =
897        (CovMapVersion)CovHeader->getVersion<support::endianness::little>();
898    StringRef CoverageMapping;
899    BinaryCoverageReader::FuncRecordsStorage CoverageRecords;
900    if (Version < CovMapVersion::Version4) {
901      CoverageMapping = Data;
902      if (CoverageMapping.empty())
903        return make_error<CoverageMapError>(coveragemap_error::truncated);
904      CoverageRecords = MemoryBuffer::getMemBuffer("");
905    } else {
906      uint32_t FilenamesSize =
907          CovHeader->getFilenamesSize<support::endianness::little>();
908      uint32_t CoverageMappingSize = sizeof(CovMapHeader) + FilenamesSize;
909      CoverageMapping = Data.substr(0, CoverageMappingSize);
910      if (CoverageMapping.empty())
911        return make_error<CoverageMapError>(coveragemap_error::truncated);
912      Data = Data.substr(CoverageMappingSize);
913      // Skip the padding bytes because coverage records data has an alignment
914      // of 8.
915      Pad = offsetToAlignedAddr(Data.data(), Align(8));
916      if (Data.size() < Pad)
917        return make_error<CoverageMapError>(coveragemap_error::malformed);
918      CoverageRecords = MemoryBuffer::getMemBuffer(Data.substr(Pad));
919      if (CoverageRecords->getBufferSize() == 0)
920        return make_error<CoverageMapError>(coveragemap_error::truncated);
921    }
922    return BinaryCoverageReader::createCoverageReaderFromBuffer(
923        CoverageMapping, std::move(CoverageRecords), std::move(ProfileNames),
924        BytesInAddress, Endian, CompilationDir);
925  }
926  
927  /// Find all sections that match \p Name. There may be more than one if comdats
928  /// are in use, e.g. for the __llvm_covfun section on ELF.
929  static Expected<std::vector<SectionRef>> lookupSections(ObjectFile &OF,
930                                                          StringRef Name) {
931    // On COFF, the object file section name may end in "$M". This tells the
932    // linker to sort these sections between "$A" and "$Z". The linker removes the
933    // dollar and everything after it in the final binary. Do the same to match.
934    bool IsCOFF = isa<COFFObjectFile>(OF);
935    auto stripSuffix = [IsCOFF](StringRef N) {
936      return IsCOFF ? N.split('$').first : N;
937    };
938    Name = stripSuffix(Name);
939  
940    std::vector<SectionRef> Sections;
941    for (const auto &Section : OF.sections()) {
942      Expected<StringRef> NameOrErr = Section.getName();
943      if (!NameOrErr)
944        return NameOrErr.takeError();
945      if (stripSuffix(*NameOrErr) == Name)
946        Sections.push_back(Section);
947    }
948    if (Sections.empty())
949      return make_error<CoverageMapError>(coveragemap_error::no_data_found);
950    return Sections;
951  }
952  
953  static Expected<std::unique_ptr<BinaryCoverageReader>>
954  loadBinaryFormat(std::unique_ptr<Binary> Bin, StringRef Arch,
955                   StringRef CompilationDir = "") {
956    std::unique_ptr<ObjectFile> OF;
957    if (auto *Universal = dyn_cast<MachOUniversalBinary>(Bin.get())) {
958      // If we have a universal binary, try to look up the object for the
959      // appropriate architecture.
960      auto ObjectFileOrErr = Universal->getMachOObjectForArch(Arch);
961      if (!ObjectFileOrErr)
962        return ObjectFileOrErr.takeError();
963      OF = std::move(ObjectFileOrErr.get());
964    } else if (isa<ObjectFile>(Bin.get())) {
965      // For any other object file, upcast and take ownership.
966      OF.reset(cast<ObjectFile>(Bin.release()));
967      // If we've asked for a particular arch, make sure they match.
968      if (!Arch.empty() && OF->getArch() != Triple(Arch).getArch())
969        return errorCodeToError(object_error::arch_not_found);
970    } else
971      // We can only handle object files.
972      return make_error<CoverageMapError>(coveragemap_error::malformed);
973  
974    // The coverage uses native pointer sizes for the object it's written in.
975    uint8_t BytesInAddress = OF->getBytesInAddress();
976    support::endianness Endian = OF->isLittleEndian()
977                                     ? support::endianness::little
978                                     : support::endianness::big;
979  
980    // Look for the sections that we are interested in.
981    auto ObjFormat = OF->getTripleObjectFormat();
982    auto NamesSection =
983        lookupSections(*OF, getInstrProfSectionName(IPSK_name, ObjFormat,
984                                                   /*AddSegmentInfo=*/false));
985    if (auto E = NamesSection.takeError())
986      return std::move(E);
987    auto CoverageSection =
988        lookupSections(*OF, getInstrProfSectionName(IPSK_covmap, ObjFormat,
989                                                    /*AddSegmentInfo=*/false));
990    if (auto E = CoverageSection.takeError())
991      return std::move(E);
992    std::vector<SectionRef> CoverageSectionRefs = *CoverageSection;
993    if (CoverageSectionRefs.size() != 1)
994      return make_error<CoverageMapError>(coveragemap_error::malformed);
995    auto CoverageMappingOrErr = CoverageSectionRefs.back().getContents();
996    if (!CoverageMappingOrErr)
997      return CoverageMappingOrErr.takeError();
998    StringRef CoverageMapping = CoverageMappingOrErr.get();
999  
1000    InstrProfSymtab ProfileNames;
1001    std::vector<SectionRef> NamesSectionRefs = *NamesSection;
1002    if (NamesSectionRefs.size() != 1)
1003      return make_error<CoverageMapError>(coveragemap_error::malformed);
1004    if (Error E = ProfileNames.create(NamesSectionRefs.back()))
1005      return std::move(E);
1006  
1007    // Look for the coverage records section (Version4 only).
1008    auto CoverageRecordsSections =
1009        lookupSections(*OF, getInstrProfSectionName(IPSK_covfun, ObjFormat,
1010                                                    /*AddSegmentInfo=*/false));
1011  
1012    BinaryCoverageReader::FuncRecordsStorage FuncRecords;
1013    if (auto E = CoverageRecordsSections.takeError()) {
1014      consumeError(std::move(E));
1015      FuncRecords = MemoryBuffer::getMemBuffer("");
1016    } else {
1017      // Compute the FuncRecordsBuffer of the buffer, taking into account the
1018      // padding between each record, and making sure the first block is aligned
1019      // in memory to maintain consistency between buffer address and size
1020      // alignment.
1021      const Align RecordAlignment(8);
1022      uint64_t FuncRecordsSize = 0;
1023      for (SectionRef Section : *CoverageRecordsSections) {
1024        auto CoverageRecordsOrErr = Section.getContents();
1025        if (!CoverageRecordsOrErr)
1026          return CoverageRecordsOrErr.takeError();
1027        FuncRecordsSize += alignTo(CoverageRecordsOrErr->size(), RecordAlignment);
1028      }
1029      auto WritableBuffer =
1030          WritableMemoryBuffer::getNewUninitMemBuffer(FuncRecordsSize);
1031      char *FuncRecordsBuffer = WritableBuffer->getBufferStart();
1032      assert(isAddrAligned(RecordAlignment, FuncRecordsBuffer) &&
1033             "Allocated memory is correctly aligned");
1034  
1035      for (SectionRef Section : *CoverageRecordsSections) {
1036        auto CoverageRecordsOrErr = Section.getContents();
1037        if (!CoverageRecordsOrErr)
1038          return CoverageRecordsOrErr.takeError();
1039        const auto &CoverageRecords = CoverageRecordsOrErr.get();
1040        FuncRecordsBuffer = std::copy(CoverageRecords.begin(),
1041                                      CoverageRecords.end(), FuncRecordsBuffer);
1042        FuncRecordsBuffer =
1043            std::fill_n(FuncRecordsBuffer,
1044                        alignAddr(FuncRecordsBuffer, RecordAlignment) -
1045                            (uintptr_t)FuncRecordsBuffer,
1046                        '\0');
1047      }
1048      assert(FuncRecordsBuffer == WritableBuffer->getBufferEnd() &&
1049             "consistent init");
1050      FuncRecords = std::move(WritableBuffer);
1051    }
1052  
1053    return BinaryCoverageReader::createCoverageReaderFromBuffer(
1054        CoverageMapping, std::move(FuncRecords), std::move(ProfileNames),
1055        BytesInAddress, Endian, CompilationDir);
1056  }
1057  
1058  /// Determine whether \p Arch is invalid or empty, given \p Bin.
1059  static bool isArchSpecifierInvalidOrMissing(Binary *Bin, StringRef Arch) {
1060    // If we have a universal binary and Arch doesn't identify any of its slices,
1061    // it's user error.
1062    if (auto *Universal = dyn_cast<MachOUniversalBinary>(Bin)) {
1063      for (auto &ObjForArch : Universal->objects())
1064        if (Arch == ObjForArch.getArchFlagName())
1065          return false;
1066      return true;
1067    }
1068    return false;
1069  }
1070  
1071  Expected<std::vector<std::unique_ptr<BinaryCoverageReader>>>
1072  BinaryCoverageReader::create(
1073      MemoryBufferRef ObjectBuffer, StringRef Arch,
1074      SmallVectorImpl<std::unique_ptr<MemoryBuffer>> &ObjectFileBuffers,
1075      StringRef CompilationDir) {
1076    std::vector<std::unique_ptr<BinaryCoverageReader>> Readers;
1077  
1078    if (ObjectBuffer.getBuffer().startswith(TestingFormatMagic)) {
1079      // This is a special format used for testing.
1080      auto ReaderOrErr =
1081          loadTestingFormat(ObjectBuffer.getBuffer(), CompilationDir);
1082      if (!ReaderOrErr)
1083        return ReaderOrErr.takeError();
1084      Readers.push_back(std::move(ReaderOrErr.get()));
1085      return std::move(Readers);
1086    }
1087  
1088    auto BinOrErr = createBinary(ObjectBuffer);
1089    if (!BinOrErr)
1090      return BinOrErr.takeError();
1091    std::unique_ptr<Binary> Bin = std::move(BinOrErr.get());
1092  
1093    if (isArchSpecifierInvalidOrMissing(Bin.get(), Arch))
1094      return make_error<CoverageMapError>(
1095          coveragemap_error::invalid_or_missing_arch_specifier);
1096  
1097    // MachO universal binaries which contain archives need to be treated as
1098    // archives, not as regular binaries.
1099    if (auto *Universal = dyn_cast<MachOUniversalBinary>(Bin.get())) {
1100      for (auto &ObjForArch : Universal->objects()) {
1101        // Skip slices within the universal binary which target the wrong arch.
1102        std::string ObjArch = ObjForArch.getArchFlagName();
1103        if (Arch != ObjArch)
1104          continue;
1105  
1106        auto ArchiveOrErr = ObjForArch.getAsArchive();
1107        if (!ArchiveOrErr) {
1108          // If this is not an archive, try treating it as a regular object.
1109          consumeError(ArchiveOrErr.takeError());
1110          break;
1111        }
1112  
1113        return BinaryCoverageReader::create(
1114            ArchiveOrErr.get()->getMemoryBufferRef(), Arch, ObjectFileBuffers,
1115            CompilationDir);
1116      }
1117    }
1118  
1119    // Load coverage out of archive members.
1120    if (auto *Ar = dyn_cast<Archive>(Bin.get())) {
1121      Error Err = Error::success();
1122      for (auto &Child : Ar->children(Err)) {
1123        Expected<MemoryBufferRef> ChildBufOrErr = Child.getMemoryBufferRef();
1124        if (!ChildBufOrErr)
1125          return ChildBufOrErr.takeError();
1126  
1127        auto ChildReadersOrErr = BinaryCoverageReader::create(
1128            ChildBufOrErr.get(), Arch, ObjectFileBuffers, CompilationDir);
1129        if (!ChildReadersOrErr)
1130          return ChildReadersOrErr.takeError();
1131        for (auto &Reader : ChildReadersOrErr.get())
1132          Readers.push_back(std::move(Reader));
1133      }
1134      if (Err)
1135        return std::move(Err);
1136  
1137      // Thin archives reference object files outside of the archive file, i.e.
1138      // files which reside in memory not owned by the caller. Transfer ownership
1139      // to the caller.
1140      if (Ar->isThin())
1141        for (auto &Buffer : Ar->takeThinBuffers())
1142          ObjectFileBuffers.push_back(std::move(Buffer));
1143  
1144      return std::move(Readers);
1145    }
1146  
1147    auto ReaderOrErr = loadBinaryFormat(std::move(Bin), Arch, CompilationDir);
1148    if (!ReaderOrErr)
1149      return ReaderOrErr.takeError();
1150    Readers.push_back(std::move(ReaderOrErr.get()));
1151    return std::move(Readers);
1152  }
1153  
1154  Error BinaryCoverageReader::readNextRecord(CoverageMappingRecord &Record) {
1155    if (CurrentRecord >= MappingRecords.size())
1156      return make_error<CoverageMapError>(coveragemap_error::eof);
1157  
1158    FunctionsFilenames.clear();
1159    Expressions.clear();
1160    MappingRegions.clear();
1161    auto &R = MappingRecords[CurrentRecord];
1162    auto F = makeArrayRef(Filenames).slice(R.FilenamesBegin, R.FilenamesSize);
1163    RawCoverageMappingReader Reader(R.CoverageMapping, F, FunctionsFilenames,
1164                                    Expressions, MappingRegions);
1165    if (auto Err = Reader.read())
1166      return Err;
1167  
1168    Record.FunctionName = R.FunctionName;
1169    Record.FunctionHash = R.FunctionHash;
1170    Record.Filenames = FunctionsFilenames;
1171    Record.Expressions = Expressions;
1172    Record.MappingRegions = MappingRegions;
1173  
1174    ++CurrentRecord;
1175    return Error::success();
1176  }
1177