xref: /aosp_15_r20/external/llvm/include/llvm/ProfileData/Coverage/CoverageMappingReader.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //=-- CoverageMappingReader.h - Code coverage mapping reader ------*- C++ -*-=//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file contains support for reading coverage mapping data for
11*9880d681SAndroid Build Coastguard Worker // instrumentation based coverage.
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_PROFILEDATA_COVERAGEMAPPINGREADER_H
16*9880d681SAndroid Build Coastguard Worker #define LLVM_PROFILEDATA_COVERAGEMAPPINGREADER_H
17*9880d681SAndroid Build Coastguard Worker 
18*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/ArrayRef.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringRef.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Triple.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/ObjectFile.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/ProfileData/Coverage/CoverageMapping.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/ProfileData/InstrProf.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/FileSystem.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MemoryBuffer.h"
26*9880d681SAndroid Build Coastguard Worker #include <iterator>
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker namespace llvm {
29*9880d681SAndroid Build Coastguard Worker namespace coverage {
30*9880d681SAndroid Build Coastguard Worker 
31*9880d681SAndroid Build Coastguard Worker class CoverageMappingReader;
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker /// \brief Coverage mapping information for a single function.
34*9880d681SAndroid Build Coastguard Worker struct CoverageMappingRecord {
35*9880d681SAndroid Build Coastguard Worker   StringRef FunctionName;
36*9880d681SAndroid Build Coastguard Worker   uint64_t FunctionHash;
37*9880d681SAndroid Build Coastguard Worker   ArrayRef<StringRef> Filenames;
38*9880d681SAndroid Build Coastguard Worker   ArrayRef<CounterExpression> Expressions;
39*9880d681SAndroid Build Coastguard Worker   ArrayRef<CounterMappingRegion> MappingRegions;
40*9880d681SAndroid Build Coastguard Worker };
41*9880d681SAndroid Build Coastguard Worker 
42*9880d681SAndroid Build Coastguard Worker /// \brief A file format agnostic iterator over coverage mapping data.
43*9880d681SAndroid Build Coastguard Worker class CoverageMappingIterator
44*9880d681SAndroid Build Coastguard Worker     : public std::iterator<std::input_iterator_tag, CoverageMappingRecord> {
45*9880d681SAndroid Build Coastguard Worker   CoverageMappingReader *Reader;
46*9880d681SAndroid Build Coastguard Worker   CoverageMappingRecord Record;
47*9880d681SAndroid Build Coastguard Worker 
48*9880d681SAndroid Build Coastguard Worker   void increment();
49*9880d681SAndroid Build Coastguard Worker 
50*9880d681SAndroid Build Coastguard Worker public:
CoverageMappingIterator()51*9880d681SAndroid Build Coastguard Worker   CoverageMappingIterator() : Reader(nullptr) {}
CoverageMappingIterator(CoverageMappingReader * Reader)52*9880d681SAndroid Build Coastguard Worker   CoverageMappingIterator(CoverageMappingReader *Reader) : Reader(Reader) {
53*9880d681SAndroid Build Coastguard Worker     increment();
54*9880d681SAndroid Build Coastguard Worker   }
55*9880d681SAndroid Build Coastguard Worker 
56*9880d681SAndroid Build Coastguard Worker   CoverageMappingIterator &operator++() {
57*9880d681SAndroid Build Coastguard Worker     increment();
58*9880d681SAndroid Build Coastguard Worker     return *this;
59*9880d681SAndroid Build Coastguard Worker   }
60*9880d681SAndroid Build Coastguard Worker   bool operator==(const CoverageMappingIterator &RHS) {
61*9880d681SAndroid Build Coastguard Worker     return Reader == RHS.Reader;
62*9880d681SAndroid Build Coastguard Worker   }
63*9880d681SAndroid Build Coastguard Worker   bool operator!=(const CoverageMappingIterator &RHS) {
64*9880d681SAndroid Build Coastguard Worker     return Reader != RHS.Reader;
65*9880d681SAndroid Build Coastguard Worker   }
66*9880d681SAndroid Build Coastguard Worker   CoverageMappingRecord &operator*() { return Record; }
67*9880d681SAndroid Build Coastguard Worker   CoverageMappingRecord *operator->() { return &Record; }
68*9880d681SAndroid Build Coastguard Worker };
69*9880d681SAndroid Build Coastguard Worker 
70*9880d681SAndroid Build Coastguard Worker class CoverageMappingReader {
71*9880d681SAndroid Build Coastguard Worker public:
72*9880d681SAndroid Build Coastguard Worker   virtual Error readNextRecord(CoverageMappingRecord &Record) = 0;
begin()73*9880d681SAndroid Build Coastguard Worker   CoverageMappingIterator begin() { return CoverageMappingIterator(this); }
end()74*9880d681SAndroid Build Coastguard Worker   CoverageMappingIterator end() { return CoverageMappingIterator(); }
~CoverageMappingReader()75*9880d681SAndroid Build Coastguard Worker   virtual ~CoverageMappingReader() {}
76*9880d681SAndroid Build Coastguard Worker };
77*9880d681SAndroid Build Coastguard Worker 
78*9880d681SAndroid Build Coastguard Worker /// \brief Base class for the raw coverage mapping and filenames data readers.
79*9880d681SAndroid Build Coastguard Worker class RawCoverageReader {
80*9880d681SAndroid Build Coastguard Worker protected:
81*9880d681SAndroid Build Coastguard Worker   StringRef Data;
82*9880d681SAndroid Build Coastguard Worker 
RawCoverageReader(StringRef Data)83*9880d681SAndroid Build Coastguard Worker   RawCoverageReader(StringRef Data) : Data(Data) {}
84*9880d681SAndroid Build Coastguard Worker 
85*9880d681SAndroid Build Coastguard Worker   Error readULEB128(uint64_t &Result);
86*9880d681SAndroid Build Coastguard Worker   Error readIntMax(uint64_t &Result, uint64_t MaxPlus1);
87*9880d681SAndroid Build Coastguard Worker   Error readSize(uint64_t &Result);
88*9880d681SAndroid Build Coastguard Worker   Error readString(StringRef &Result);
89*9880d681SAndroid Build Coastguard Worker };
90*9880d681SAndroid Build Coastguard Worker 
91*9880d681SAndroid Build Coastguard Worker /// \brief Reader for the raw coverage filenames.
92*9880d681SAndroid Build Coastguard Worker class RawCoverageFilenamesReader : public RawCoverageReader {
93*9880d681SAndroid Build Coastguard Worker   std::vector<StringRef> &Filenames;
94*9880d681SAndroid Build Coastguard Worker 
95*9880d681SAndroid Build Coastguard Worker   RawCoverageFilenamesReader(const RawCoverageFilenamesReader &) = delete;
96*9880d681SAndroid Build Coastguard Worker   RawCoverageFilenamesReader &
97*9880d681SAndroid Build Coastguard Worker   operator=(const RawCoverageFilenamesReader &) = delete;
98*9880d681SAndroid Build Coastguard Worker 
99*9880d681SAndroid Build Coastguard Worker public:
RawCoverageFilenamesReader(StringRef Data,std::vector<StringRef> & Filenames)100*9880d681SAndroid Build Coastguard Worker   RawCoverageFilenamesReader(StringRef Data, std::vector<StringRef> &Filenames)
101*9880d681SAndroid Build Coastguard Worker       : RawCoverageReader(Data), Filenames(Filenames) {}
102*9880d681SAndroid Build Coastguard Worker 
103*9880d681SAndroid Build Coastguard Worker   Error read();
104*9880d681SAndroid Build Coastguard Worker };
105*9880d681SAndroid Build Coastguard Worker 
106*9880d681SAndroid Build Coastguard Worker /// \brief Checks if the given coverage mapping data is exported for
107*9880d681SAndroid Build Coastguard Worker /// an unused function.
108*9880d681SAndroid Build Coastguard Worker class RawCoverageMappingDummyChecker : public RawCoverageReader {
109*9880d681SAndroid Build Coastguard Worker public:
RawCoverageMappingDummyChecker(StringRef MappingData)110*9880d681SAndroid Build Coastguard Worker   RawCoverageMappingDummyChecker(StringRef MappingData)
111*9880d681SAndroid Build Coastguard Worker       : RawCoverageReader(MappingData) {}
112*9880d681SAndroid Build Coastguard Worker 
113*9880d681SAndroid Build Coastguard Worker   Expected<bool> isDummy();
114*9880d681SAndroid Build Coastguard Worker };
115*9880d681SAndroid Build Coastguard Worker 
116*9880d681SAndroid Build Coastguard Worker /// \brief Reader for the raw coverage mapping data.
117*9880d681SAndroid Build Coastguard Worker class RawCoverageMappingReader : public RawCoverageReader {
118*9880d681SAndroid Build Coastguard Worker   ArrayRef<StringRef> TranslationUnitFilenames;
119*9880d681SAndroid Build Coastguard Worker   std::vector<StringRef> &Filenames;
120*9880d681SAndroid Build Coastguard Worker   std::vector<CounterExpression> &Expressions;
121*9880d681SAndroid Build Coastguard Worker   std::vector<CounterMappingRegion> &MappingRegions;
122*9880d681SAndroid Build Coastguard Worker 
123*9880d681SAndroid Build Coastguard Worker   RawCoverageMappingReader(const RawCoverageMappingReader &) = delete;
124*9880d681SAndroid Build Coastguard Worker   RawCoverageMappingReader &
125*9880d681SAndroid Build Coastguard Worker   operator=(const RawCoverageMappingReader &) = delete;
126*9880d681SAndroid Build Coastguard Worker 
127*9880d681SAndroid Build Coastguard Worker public:
RawCoverageMappingReader(StringRef MappingData,ArrayRef<StringRef> TranslationUnitFilenames,std::vector<StringRef> & Filenames,std::vector<CounterExpression> & Expressions,std::vector<CounterMappingRegion> & MappingRegions)128*9880d681SAndroid Build Coastguard Worker   RawCoverageMappingReader(StringRef MappingData,
129*9880d681SAndroid Build Coastguard Worker                            ArrayRef<StringRef> TranslationUnitFilenames,
130*9880d681SAndroid Build Coastguard Worker                            std::vector<StringRef> &Filenames,
131*9880d681SAndroid Build Coastguard Worker                            std::vector<CounterExpression> &Expressions,
132*9880d681SAndroid Build Coastguard Worker                            std::vector<CounterMappingRegion> &MappingRegions)
133*9880d681SAndroid Build Coastguard Worker       : RawCoverageReader(MappingData),
134*9880d681SAndroid Build Coastguard Worker         TranslationUnitFilenames(TranslationUnitFilenames),
135*9880d681SAndroid Build Coastguard Worker         Filenames(Filenames), Expressions(Expressions),
136*9880d681SAndroid Build Coastguard Worker         MappingRegions(MappingRegions) {}
137*9880d681SAndroid Build Coastguard Worker 
138*9880d681SAndroid Build Coastguard Worker   Error read();
139*9880d681SAndroid Build Coastguard Worker 
140*9880d681SAndroid Build Coastguard Worker private:
141*9880d681SAndroid Build Coastguard Worker   Error decodeCounter(unsigned Value, Counter &C);
142*9880d681SAndroid Build Coastguard Worker   Error readCounter(Counter &C);
143*9880d681SAndroid Build Coastguard Worker   Error
144*9880d681SAndroid Build Coastguard Worker   readMappingRegionsSubArray(std::vector<CounterMappingRegion> &MappingRegions,
145*9880d681SAndroid Build Coastguard Worker                              unsigned InferredFileID, size_t NumFileIDs);
146*9880d681SAndroid Build Coastguard Worker };
147*9880d681SAndroid Build Coastguard Worker 
148*9880d681SAndroid Build Coastguard Worker /// \brief Reader for the coverage mapping data that is emitted by the
149*9880d681SAndroid Build Coastguard Worker /// frontend and stored in an object file.
150*9880d681SAndroid Build Coastguard Worker class BinaryCoverageReader : public CoverageMappingReader {
151*9880d681SAndroid Build Coastguard Worker public:
152*9880d681SAndroid Build Coastguard Worker   struct ProfileMappingRecord {
153*9880d681SAndroid Build Coastguard Worker     CovMapVersion Version;
154*9880d681SAndroid Build Coastguard Worker     StringRef FunctionName;
155*9880d681SAndroid Build Coastguard Worker     uint64_t FunctionHash;
156*9880d681SAndroid Build Coastguard Worker     StringRef CoverageMapping;
157*9880d681SAndroid Build Coastguard Worker     size_t FilenamesBegin;
158*9880d681SAndroid Build Coastguard Worker     size_t FilenamesSize;
159*9880d681SAndroid Build Coastguard Worker 
ProfileMappingRecordProfileMappingRecord160*9880d681SAndroid Build Coastguard Worker     ProfileMappingRecord(CovMapVersion Version, StringRef FunctionName,
161*9880d681SAndroid Build Coastguard Worker                          uint64_t FunctionHash, StringRef CoverageMapping,
162*9880d681SAndroid Build Coastguard Worker                          size_t FilenamesBegin, size_t FilenamesSize)
163*9880d681SAndroid Build Coastguard Worker         : Version(Version), FunctionName(FunctionName),
164*9880d681SAndroid Build Coastguard Worker           FunctionHash(FunctionHash), CoverageMapping(CoverageMapping),
165*9880d681SAndroid Build Coastguard Worker           FilenamesBegin(FilenamesBegin), FilenamesSize(FilenamesSize) {}
166*9880d681SAndroid Build Coastguard Worker   };
167*9880d681SAndroid Build Coastguard Worker 
168*9880d681SAndroid Build Coastguard Worker private:
169*9880d681SAndroid Build Coastguard Worker   std::vector<StringRef> Filenames;
170*9880d681SAndroid Build Coastguard Worker   std::vector<ProfileMappingRecord> MappingRecords;
171*9880d681SAndroid Build Coastguard Worker   InstrProfSymtab ProfileNames;
172*9880d681SAndroid Build Coastguard Worker   size_t CurrentRecord;
173*9880d681SAndroid Build Coastguard Worker   std::vector<StringRef> FunctionsFilenames;
174*9880d681SAndroid Build Coastguard Worker   std::vector<CounterExpression> Expressions;
175*9880d681SAndroid Build Coastguard Worker   std::vector<CounterMappingRegion> MappingRegions;
176*9880d681SAndroid Build Coastguard Worker 
177*9880d681SAndroid Build Coastguard Worker   BinaryCoverageReader(const BinaryCoverageReader &) = delete;
178*9880d681SAndroid Build Coastguard Worker   BinaryCoverageReader &operator=(const BinaryCoverageReader &) = delete;
179*9880d681SAndroid Build Coastguard Worker 
BinaryCoverageReader()180*9880d681SAndroid Build Coastguard Worker   BinaryCoverageReader() : CurrentRecord(0) {}
181*9880d681SAndroid Build Coastguard Worker 
182*9880d681SAndroid Build Coastguard Worker public:
183*9880d681SAndroid Build Coastguard Worker   static Expected<std::unique_ptr<BinaryCoverageReader>>
184*9880d681SAndroid Build Coastguard Worker   create(std::unique_ptr<MemoryBuffer> &ObjectBuffer,
185*9880d681SAndroid Build Coastguard Worker          StringRef Arch);
186*9880d681SAndroid Build Coastguard Worker 
187*9880d681SAndroid Build Coastguard Worker   Error readNextRecord(CoverageMappingRecord &Record) override;
188*9880d681SAndroid Build Coastguard Worker };
189*9880d681SAndroid Build Coastguard Worker 
190*9880d681SAndroid Build Coastguard Worker } // end namespace coverage
191*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
192*9880d681SAndroid Build Coastguard Worker 
193*9880d681SAndroid Build Coastguard Worker #endif
194