clang 20.0.0git
CoverageMappingGen.h
Go to the documentation of this file.
1//===---- CoverageMappingGen.h - Coverage mapping generation ----*- 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// Instrumentation-based code coverage mapping generator
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_LIB_CODEGEN_COVERAGEMAPPINGGEN_H
14#define LLVM_CLANG_LIB_CODEGEN_COVERAGEMAPPINGGEN_H
15
16#include "clang/Basic/LLVM.h"
20#include "llvm/ADT/DenseMap.h"
21#include "llvm/IR/GlobalValue.h"
22#include "llvm/Support/CommandLine.h"
23#include "llvm/Support/raw_ostream.h"
24
25namespace llvm::coverage {
26extern cl::opt<bool> SystemHeadersCoverage;
27}
28
29namespace clang {
30
31class LangOptions;
32class SourceManager;
33class FileEntry;
34class Preprocessor;
35class Decl;
36class Stmt;
37
39 enum Kind {
40 PPIfElse, // Preprocessor #if/#else ...
43 };
44
46 // The location of token before the skipped source range.
48 // The location of token after the skipped source range.
50 // The nature of this skipped range
52
53 bool isComment() { return RangeKind == Comment; }
54 bool isEmptyLine() { return RangeKind == EmptyLine; }
55 bool isPPIfElse() { return RangeKind == PPIfElse; }
56
61 RangeKind(K) {}
62};
63
64/// Stores additional source code information like skipped ranges which
65/// is required by the coverage mapping generator and is obtained from
66/// the preprocessor.
68 public CommentHandler,
69 public EmptylineHandler {
70 // A vector of skipped source ranges and PrevTokLoc with NextTokLoc.
71 std::vector<SkippedRange> SkippedRanges;
72
73 SourceManager &SourceMgr;
74
75public:
76 // Location of the token parsed before HandleComment is called. This is
77 // updated every time Preprocessor::Lex lexes a new token.
79
80 CoverageSourceInfo(SourceManager &SourceMgr) : SourceMgr(SourceMgr) {}
81
82 std::vector<SkippedRange> &getSkippedRanges() { return SkippedRanges; }
83
85
86 void SourceRangeSkipped(SourceRange Range, SourceLocation EndifLoc) override;
87
88 void HandleEmptyline(SourceRange Range) override;
89
90 bool HandleComment(Preprocessor &PP, SourceRange Range) override;
91
93};
94
95namespace CodeGen {
96
97class CodeGenModule;
98class CounterPair;
99
100namespace MCDC {
101struct State;
102}
103
104/// Organizes the cross-function state that is used while generating
105/// code coverage mapping data.
107 /// Information needed to emit a coverage record for a function.
108 struct FunctionInfo {
109 uint64_t NameHash;
110 uint64_t FuncHash;
111 std::string CoverageMapping;
112 bool IsUsed;
113 };
114
115 CodeGenModule &CGM;
116 CoverageSourceInfo &SourceInfo;
117 llvm::SmallDenseMap<FileEntryRef, unsigned, 8> FileEntries;
118 std::vector<llvm::Constant *> FunctionNames;
119 std::vector<FunctionInfo> FunctionRecords;
120
121 std::string getCurrentDirname();
122 std::string normalizeFilename(StringRef Filename);
123
124 /// Emit a function record.
125 void emitFunctionMappingRecord(const FunctionInfo &Info,
126 uint64_t FilenamesRef);
127
128public:
130
132
134 return SourceInfo;
135 }
136
137 /// Add a function's coverage mapping record to the collection of the
138 /// function mapping records.
139 void addFunctionMappingRecord(llvm::GlobalVariable *FunctionName,
140 StringRef FunctionNameValue,
141 uint64_t FunctionHash,
142 const std::string &CoverageMapping,
143 bool IsUsed = true);
144
145 /// Emit the coverage mapping data for a translation unit.
146 void emit();
147
148 /// Return the coverage mapping translation unit file id
149 /// for the given file.
150 unsigned getFileID(FileEntryRef File);
151
152 /// Return an interface into CodeGenModule.
154};
155
156/// Organizes the per-function state that is used while generating
157/// code coverage mapping data.
160 SourceManager &SM;
161 const LangOptions &LangOpts;
162 llvm::DenseMap<const Stmt *, CounterPair> *CounterMap;
163 MCDC::State *MCDCState;
164
165public:
167 const LangOptions &LangOpts)
168 : CVM(CVM), SM(SM), LangOpts(LangOpts), CounterMap(nullptr),
169 MCDCState(nullptr) {}
170
172 const LangOptions &LangOpts,
173 llvm::DenseMap<const Stmt *, CounterPair> *CounterMap,
174 MCDC::State *MCDCState)
175 : CVM(CVM), SM(SM), LangOpts(LangOpts), CounterMap(CounterMap),
176 MCDCState(MCDCState) {}
177
178 /// Emit the coverage mapping data which maps the regions of
179 /// code to counters that will be used to find the execution
180 /// counts for those regions.
181 void emitCounterMapping(const Decl *D, llvm::raw_ostream &OS);
182
183 /// Emit the coverage mapping data for an unused function.
184 /// It creates mapping regions with the counter of zero.
185 void emitEmptyMapping(const Decl *D, llvm::raw_ostream &OS);
186};
187
188} // end namespace CodeGen
189} // end namespace clang
190
191#endif
#define SM(sm)
Definition: Cuda.cpp:84
const Decl * D
StringRef Filename
Definition: Format.cpp:3051
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the PPCallbacks interface.
Defines the clang::Preprocessor interface.
SourceRange Range
Definition: SemaObjC.cpp:758
SourceLocation Loc
Definition: SemaObjC.cpp:759
Defines the clang::SourceLocation class and associated facilities.
This class organizes the cross-function state that is used while generating LLVM code.
Organizes the per-function state that is used while generating code coverage mapping data.
void emitEmptyMapping(const Decl *D, llvm::raw_ostream &OS)
Emit the coverage mapping data for an unused function.
CoverageMappingGen(CoverageMappingModuleGen &CVM, SourceManager &SM, const LangOptions &LangOpts)
void emitCounterMapping(const Decl *D, llvm::raw_ostream &OS)
Emit the coverage mapping data which maps the regions of code to counters that will be used to find t...
CoverageMappingGen(CoverageMappingModuleGen &CVM, SourceManager &SM, const LangOptions &LangOpts, llvm::DenseMap< const Stmt *, CounterPair > *CounterMap, MCDC::State *MCDCState)
Organizes the cross-function state that is used while generating code coverage mapping data.
void addFunctionMappingRecord(llvm::GlobalVariable *FunctionName, StringRef FunctionNameValue, uint64_t FunctionHash, const std::string &CoverageMapping, bool IsUsed=true)
Add a function's coverage mapping record to the collection of the function mapping records.
CoverageSourceInfo & getSourceInfo() const
static CoverageSourceInfo * setUpCoverageCallbacks(Preprocessor &PP)
void emit()
Emit the coverage mapping data for a translation unit.
CodeGenModule & getCodeGenModule()
Return an interface into CodeGenModule.
unsigned getFileID(FileEntryRef File)
Return the coverage mapping translation unit file id for the given file.
Abstract base class that describes a handler that will receive source ranges for each of the comments...
Stores additional source code information like skipped ranges which is required by the coverage mappi...
void SourceRangeSkipped(SourceRange Range, SourceLocation EndifLoc) override
Hook called when a source range is skipped.
void updateNextTokLoc(SourceLocation Loc)
void AddSkippedRange(SourceRange Range, SkippedRange::Kind RangeKind)
std::vector< SkippedRange > & getSkippedRanges()
bool HandleComment(Preprocessor &PP, SourceRange Range) override
CoverageSourceInfo(SourceManager &SourceMgr)
void HandleEmptyline(SourceRange Range) override
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
Abstract base class that describes a handler that will receive source ranges for empty lines encounte...
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
Definition: FileEntry.h:57
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:499
This interface provides a way to observe the actions of the preprocessor as it does its thing.
Definition: PPCallbacks.h:36
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Definition: Preprocessor.h:138
Encodes a location in the source.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
The JSON file list parser is used to communicate input to InstallAPI.
cl::opt< bool > SystemHeadersCoverage
Per-Function MC/DC state.
Definition: MCDCState.h:29
SourceLocation NextTokLoc
SkippedRange(SourceRange Range, Kind K, SourceLocation PrevTokLoc=SourceLocation(), SourceLocation NextTokLoc=SourceLocation())
SourceLocation PrevTokLoc