LLVM 20.0.0git
GCOV.h
Go to the documentation of this file.
1//===- GCOV.h - LLVM coverage tool ------------------------------*- C++ -*-===//
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 header provides the interface to read and write coverage files that
10// use 'gcov' format.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_PROFILEDATA_GCOV_H
15#define LLVM_PROFILEDATA_GCOV_H
16
17#include "llvm/ADT/DenseSet.h"
20#include "llvm/ADT/StringMap.h"
21#include "llvm/ADT/StringRef.h"
22#include "llvm/ADT/iterator.h"
27#include <algorithm>
28#include <cstddef>
29#include <cstdint>
30#include <map>
31#include <memory>
32#include <string>
33#include <utility>
34
35namespace llvm {
36
37class GCOVFunction;
38class GCOVBlock;
39
40namespace GCOV {
41
43
44/// A struct for passing gcov options between functions.
45struct Options {
46 Options(bool A, bool B, bool C, bool F, bool P, bool U, bool I, bool L,
47 bool M, bool N, bool R, bool T, bool X, std::string SourcePrefix)
52
66 std::string SourcePrefix;
67};
68
69} // end namespace GCOV
70
71/// GCOVBuffer - A wrapper around MemoryBuffer to provide GCOV specific
72/// read operations.
74public:
75 GCOVBuffer(MemoryBuffer *B) : Buffer(B) {}
77
78 /// readGCNOFormat - Check GCNO signature is valid at the beginning of buffer.
80 StringRef buf = Buffer->getBuffer();
81 StringRef magic = buf.substr(0, 4);
82 if (magic == "gcno") {
83 de = DataExtractor(buf.substr(4), false, 0);
84 } else if (magic == "oncg") {
85 de = DataExtractor(buf.substr(4), true, 0);
86 } else {
87 errs() << "unexpected magic: " << magic << "\n";
88 return false;
89 }
90 return true;
91 }
92
93 /// readGCDAFormat - Check GCDA signature is valid at the beginning of buffer.
95 StringRef buf = Buffer->getBuffer();
96 StringRef magic = buf.substr(0, 4);
97 if (magic == "gcda") {
98 de = DataExtractor(buf.substr(4), false, 0);
99 } else if (magic == "adcg") {
100 de = DataExtractor(buf.substr(4), true, 0);
101 } else {
102 return false;
103 }
104 return true;
105 }
106
107 /// readGCOVVersion - Read GCOV version.
109 std::string str(de.getBytes(cursor, 4));
110 if (str.size() != 4)
111 return false;
112 if (de.isLittleEndian())
113 std::reverse(str.begin(), str.end());
114 int ver = str[0] >= 'A'
115 ? (str[0] - 'A') * 100 + (str[1] - '0') * 10 + str[2] - '0'
116 : (str[0] - '0') * 10 + str[2] - '0';
117 if (ver >= 120) {
118 this->version = version = GCOV::V1200;
119 return true;
120 } else if (ver >= 90) {
121 // PR gcov-profile/84846, r269678
122 this->version = version = GCOV::V900;
123 return true;
124 } else if (ver >= 80) {
125 // PR gcov-profile/48463
126 this->version = version = GCOV::V800;
127 return true;
128 } else if (ver >= 48) {
129 // r189778: the exit block moved from the last to the second.
130 this->version = version = GCOV::V408;
131 return true;
132 } else if (ver >= 47) {
133 // r173147: split checksum into cfg checksum and line checksum.
134 this->version = version = GCOV::V407;
135 return true;
136 } else if (ver >= 34) {
137 this->version = version = GCOV::V304;
138 return true;
139 }
140 errs() << "unexpected version: " << str << "\n";
141 return false;
142 }
143
146 uint32_t len;
147 if (!readInt(len) || len == 0)
148 return {};
149 return de.getBytes(cursor, len * 4).split('\0').first;
150 }
151
152 bool readInt(uint32_t &Val) {
153 if (cursor.tell() + 4 > de.size()) {
154 Val = 0;
155 errs() << "unexpected end of memory buffer: " << cursor.tell() << "\n";
156 return false;
157 }
158 Val = de.getU32(cursor);
159 return true;
160 }
161
162 bool readInt64(uint64_t &Val) {
163 uint32_t Lo, Hi;
164 if (!readInt(Lo) || !readInt(Hi))
165 return false;
166 Val = ((uint64_t)Hi << 32) | Lo;
167 return true;
168 }
169
171 uint32_t len;
172 if (!readInt(len) || len == 0)
173 return false;
174 if (version >= GCOV::V1200)
175 str = de.getBytes(cursor, len).drop_back();
176 else
177 str = de.getBytes(cursor, len * 4).split('\0').first;
178 return bool(cursor);
179 }
180
183
184private:
185 MemoryBuffer *Buffer;
186 GCOV::GCOVVersion version{};
187};
188
189/// GCOVFile - Collects coverage information for one pair of coverage file
190/// (.gcno and .gcda).
191class GCOVFile {
192public:
193 GCOVFile() = default;
194
195 bool readGCNO(GCOVBuffer &Buffer);
196 bool readGCDA(GCOVBuffer &Buffer);
198 void print(raw_ostream &OS) const;
199 void dump() const;
200
201 std::vector<std::string> filenames;
203
204public:
205 bool GCNOInitialized = false;
210 std::map<uint32_t, GCOVFunction *> identToFunction;
213
216 iterator begin() const { return iterator(functions.begin()); }
217 iterator end() const { return iterator(functions.end()); }
218
219private:
220 unsigned addNormalizedPathToMap(StringRef filename);
221};
222
223struct GCOVArc {
225 : src(src), dst(dst), flags(flags) {}
226 bool onTree() const;
227
233};
234
235/// GCOVFunction - Collects function information.
237public:
240
242
243 StringRef getName(bool demangle) const;
244 StringRef getFilename() const;
245 uint64_t getEntryCount() const;
246 GCOVBlock &getExitBlock() const;
247
249 return make_range(blocks.begin(), blocks.end());
250 }
251
252 void propagateCounts(const GCOVBlock &v, GCOVArc *pred);
253 void print(raw_ostream &OS) const;
254 void dump() const;
255
267 unsigned srcIdx;
271};
272
273/// GCOVBlock - Collects block information.
275public:
280
282
284 uint32_t getLastLine() const { return lines.back(); }
285 uint64_t getCount() const { return count; }
286
287 void addSrcEdge(GCOVArc *Edge) { pred.push_back(Edge); }
288
289 void addDstEdge(GCOVArc *Edge) { succ.push_back(Edge); }
290
292 return make_range(pred.begin(), pred.end());
293 }
294
296 return make_range(succ.begin(), succ.end());
297 }
298
299 void print(raw_ostream &OS) const;
300 void dump() const;
301
302 static uint64_t
304 std::vector<std::pair<GCOVBlock *, size_t>> &stack);
307
308public:
314 bool traversable = false;
315 GCOVArc *incoming = nullptr;
316};
317
318void gcovOneInput(const GCOV::Options &options, StringRef filename,
319 StringRef gcno, StringRef gcda, GCOVFile &file);
320
321} // end namespace llvm
322
323#endif // LLVM_PROFILEDATA_GCOV_H
This file defines the StringMap class.
bbsections Prepares for basic block by splitting functions into clusters of basic blocks
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file defines the DenseSet and SmallDenseSet classes.
DenseMap< Block *, BlockRelaxAux > Blocks
Definition: ELF_riscv.cpp:507
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
hexagon gen pred
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
#define P(N)
dot regions Print regions of function to dot file(with no function bodies)"
raw_pwrite_stream & OS
This file defines the SmallString class.
This file defines the SmallVector class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
A class representing a position in a DataExtractor, as well as any error encountered during extractio...
Definition: DataExtractor.h:54
uint64_t tell() const
Return the current position of this Cursor.
Definition: DataExtractor.h:71
Error takeError()
Return error contained inside this Cursor, if any.
Definition: DataExtractor.h:78
uint32_t getU32(uint64_t *offset_ptr, Error *Err=nullptr) const
Extract a uint32_t value from *offset_ptr.
size_t size() const
Return the number of bytes in the underlying buffer.
bool isLittleEndian() const
Get the endianness for this extractor.
Definition: DataExtractor.h:97
StringRef getBytes(uint64_t *OffsetPtr, uint64_t Length, Error *Err=nullptr) const
Extract a fixed number of bytes from the specified offset.
Implements a dense probed hash-table based set.
Definition: DenseSet.h:278
GCOVBlock - Collects block information.
Definition: GCOV.h:274
void addLine(uint32_t N)
Definition: GCOV.h:283
iterator_range< EdgeIterator > dsts() const
Definition: GCOV.h:295
static uint64_t getCyclesCount(const BlockVector &blocks)
Definition: GCOV.cpp:524
iterator_range< EdgeIterator > srcs() const
Definition: GCOV.h:291
SmallVector< uint32_t, 4 > lines
Definition: GCOV.h:313
uint64_t getCount() const
Definition: GCOV.h:285
GCOVBlock(uint32_t N)
Definition: GCOV.h:281
static uint64_t getLineCount(const BlockVector &Blocks)
void addDstEdge(GCOVArc *Edge)
Definition: GCOV.h:289
uint32_t getLastLine() const
Definition: GCOV.h:284
uint32_t number
Definition: GCOV.h:309
void addSrcEdge(GCOVArc *Edge)
Definition: GCOV.h:287
SmallVectorImpl< GCOVArc * >::const_iterator EdgeIterator
Definition: GCOV.h:276
bool traversable
Definition: GCOV.h:314
void print(raw_ostream &OS) const
collectLineCounts - Collect line counts.
Definition: GCOV.cpp:442
SmallVector< const GCOVBlock *, 1 > BlockVector
Definition: GCOV.h:277
GCOVArc * incoming
Definition: GCOV.h:315
static uint64_t augmentOneCycle(GCOVBlock *src, std::vector< std::pair< GCOVBlock *, size_t > > &stack)
Definition: GCOV.cpp:473
SmallVector< GCOVArc *, 2 > pred
Definition: GCOV.h:311
void dump() const
dump - Dump GCOVBlock content to dbgs() for debugging purposes.
Definition: GCOV.cpp:469
uint64_t count
Definition: GCOV.h:310
SmallVector< GCOVArc *, 2 > succ
Definition: GCOV.h:312
GCOVBuffer - A wrapper around MemoryBuffer to provide GCOV specific read operations.
Definition: GCOV.h:73
bool readInt(uint32_t &Val)
Definition: GCOV.h:152
DataExtractor::Cursor cursor
Definition: GCOV.h:182
bool readInt64(uint64_t &Val)
Definition: GCOV.h:162
GCOVBuffer(MemoryBuffer *B)
Definition: GCOV.h:75
bool readGCOVVersion(GCOV::GCOVVersion &version)
readGCOVVersion - Read GCOV version.
Definition: GCOV.h:108
bool readString(StringRef &str)
Definition: GCOV.h:170
DataExtractor de
Definition: GCOV.h:181
uint32_t getWord()
Definition: GCOV.h:144
bool readGCNOFormat()
readGCNOFormat - Check GCNO signature is valid at the beginning of buffer.
Definition: GCOV.h:79
StringRef getString()
Definition: GCOV.h:145
bool readGCDAFormat()
readGCDAFormat - Check GCDA signature is valid at the beginning of buffer.
Definition: GCOV.h:94
GCOVFile - Collects coverage information for one pair of coverage file (.gcno and ....
Definition: GCOV.h:191
SmallVector< std::unique_ptr< GCOVFunction >, 16 > functions
Definition: GCOV.h:209
uint32_t checksum
Definition: GCOV.h:207
iterator end() const
Definition: GCOV.h:217
void print(raw_ostream &OS) const
Definition: GCOV.cpp:307
iterator begin() const
Definition: GCOV.h:216
uint32_t programCount
Definition: GCOV.h:212
uint32_t runCount
Definition: GCOV.h:211
GCOV::GCOVVersion version
Definition: GCOV.h:206
pointee_iterator< SmallVectorImpl< std::unique_ptr< GCOVFunction > >::const_iterator > iterator
Definition: GCOV.h:215
std::vector< std::string > filenames
Definition: GCOV.h:201
GCOV::GCOVVersion getVersion() const
Definition: GCOV.h:197
GCOVFile()=default
void dump() const
dump - Dump GCOVFile content to dbgs() for debugging purposes.
Definition: GCOV.cpp:314
std::map< uint32_t, GCOVFunction * > identToFunction
Definition: GCOV.h:210
StringRef cwd
Definition: GCOV.h:208
bool GCNOInitialized
Definition: GCOV.h:205
StringMap< unsigned > filenameToIdx
Definition: GCOV.h:202
bool readGCNO(GCOVBuffer &Buffer)
readGCNO - Read GCNO buffer.
Definition: GCOV.cpp:102
bool readGCDA(GCOVBuffer &Buffer)
readGCDA - Read GCDA buffer.
Definition: GCOV.cpp:210
GCOVFunction - Collects function information.
Definition: GCOV.h:236
uint64_t getEntryCount() const
getEntryCount - Get the number of times the function was called by retrieving the entry block's count...
Definition: GCOV.cpp:357
uint32_t endColumn
Definition: GCOV.h:263
SmallVector< std::unique_ptr< GCOVArc >, 0 > treeArcs
Definition: GCOV.h:269
StringRef getName(bool demangle) const
Definition: GCOV.cpp:335
uint32_t cfgChecksum
Definition: GCOV.h:259
GCOVFunction(GCOVFile &file)
Definition: GCOV.h:241
void dump() const
dump - Dump GCOVFunction content to dbgs() for debugging purposes.
Definition: GCOV.cpp:433
StringRef Name
Definition: GCOV.h:265
uint8_t artificial
Definition: GCOV.h:264
void propagateCounts(const GCOVBlock &v, GCOVArc *pred)
Definition: GCOV.cpp:372
uint32_t endLine
Definition: GCOV.h:262
SmallVector< std::unique_ptr< GCOVBlock >, 0 > blocks
Definition: GCOV.h:268
GCOVBlock & getExitBlock() const
Definition: GCOV.cpp:361
StringRef getFilename() const
Definition: GCOV.cpp:353
DenseSet< const GCOVBlock * > visited
Definition: GCOV.h:270
uint32_t startLine
Definition: GCOV.h:260
SmallString< 0 > demangled
Definition: GCOV.h:266
void print(raw_ostream &OS) const
Definition: GCOV.cpp:424
uint32_t startColumn
Definition: GCOV.h:261
uint32_t linenoChecksum
Definition: GCOV.h:258
iterator_range< BlockIterator > blocksRange() const
Definition: GCOV.h:248
SmallVector< std::unique_ptr< GCOVArc >, 0 > arcs
Definition: GCOV.h:269
uint32_t ident
Definition: GCOV.h:257
unsigned srcIdx
Definition: GCOV.h:267
GCOVFile & file
Definition: GCOV.h:256
This interface provides simple read-only access to a block of memory, and provides simple methods for...
Definition: MemoryBuffer.h:51
StringRef getBuffer() const
Definition: MemoryBuffer.h:70
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:573
typename SuperClass::const_iterator const_iterator
Definition: SmallVector.h:578
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition: StringMap.h:128
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition: StringRef.h:700
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition: StringRef.h:571
StringRef drop_back(size_t N=1) const
Return a StringRef equal to 'this' but with the last N elements dropped.
Definition: StringRef.h:616
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
GCOVVersion
Definition: GCOV.h:42
@ V407
Definition: GCOV.h:42
@ V800
Definition: GCOV.h:42
@ V408
Definition: GCOV.h:42
@ V900
Definition: GCOV.h:42
@ V1200
Definition: GCOV.h:42
@ V304
Definition: GCOV.h:42
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1873
void gcovOneInput(const GCOV::Options &options, StringRef filename, StringRef gcno, StringRef gcda, GCOVFile &file)
Definition: GCOV.cpp:992
void consumeError(Error Err)
Consume a Error without doing anything.
Definition: Error.h:1069
std::string demangle(std::string_view MangledName)
Attempt to demangle a string using different demangling schemes.
Definition: Demangle.cpp:20
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
#define N
uint64_t count
Definition: GCOV.h:231
bool onTree() const
Definition: GCOV.cpp:330
GCOVBlock & src
Definition: GCOV.h:228
GCOVBlock & dst
Definition: GCOV.h:229
GCOVArc(GCOVBlock &src, GCOVBlock &dst, uint32_t flags)
Definition: GCOV.h:224
uint64_t cycleCount
Definition: GCOV.h:232
uint32_t flags
Definition: GCOV.h:230
A struct for passing gcov options between functions.
Definition: GCOV.h:45
bool HashFilenames
Definition: GCOV.h:65
bool PreservePaths
Definition: GCOV.h:57
std::string SourcePrefix
Definition: GCOV.h:66
bool BranchInfo
Definition: GCOV.h:54
bool RelativeOnly
Definition: GCOV.h:63
bool FuncCoverage
Definition: GCOV.h:56
Options(bool A, bool B, bool C, bool F, bool P, bool U, bool I, bool L, bool M, bool N, bool R, bool T, bool X, std::string SourcePrefix)
Definition: GCOV.h:46
bool UncondBranch
Definition: GCOV.h:58
bool BranchCount
Definition: GCOV.h:55
bool LongFileNames
Definition: GCOV.h:60
bool UseStdout
Definition: GCOV.h:64
bool AllBlocks
Definition: GCOV.h:53
bool Intermediate
Definition: GCOV.h:59
An iterator type that allows iterating over the pointees via some other iterator.
Definition: iterator.h:324