Clang Project

clang_source_code/lib/CodeGen/CoverageMappingGen.h
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"
17#include "clang/Basic/SourceLocation.h"
18#include "clang/Lex/PPCallbacks.h"
19#include "llvm/ADT/DenseMap.h"
20#include "llvm/IR/GlobalValue.h"
21#include "llvm/Support/raw_ostream.h"
22
23namespace clang {
24
25class LangOptions;
26class SourceManager;
27class FileEntry;
28class Preprocessor;
29class Decl;
30class Stmt;
31
32/// Stores additional source code information like skipped ranges which
33/// is required by the coverage mapping generator and is obtained from
34/// the preprocessor.
35class CoverageSourceInfo : public PPCallbacks {
36  std::vector<SourceRangeSkippedRanges;
37public:
38  ArrayRef<SourceRangegetSkippedRanges() const { return SkippedRanges; }
39
40  void SourceRangeSkipped(SourceRange RangeSourceLocation EndifLoc) override;
41};
42
43namespace CodeGen {
44
45class CodeGenModule;
46
47/// Organizes the cross-function state that is used while generating
48/// code coverage mapping data.
49class CoverageMappingModuleGen {
50  CodeGenModule &CGM;
51  CoverageSourceInfo &SourceInfo;
52  llvm::SmallDenseMap<const FileEntry *, unsigned8FileEntries;
53  std::vector<llvm::Constant *> FunctionRecords;
54  std::vector<llvm::Constant *> FunctionNames;
55  llvm::StructType *FunctionRecordTy;
56  std::vector<std::stringCoverageMappings;
57
58public:
59  CoverageMappingModuleGen(CodeGenModule &CGMCoverageSourceInfo &SourceInfo)
60      : CGM(CGM), SourceInfo(SourceInfo), FunctionRecordTy(nullptr) {}
61
62  CoverageSourceInfo &getSourceInfo() const {
63    return SourceInfo;
64  }
65
66  /// Add a function's coverage mapping record to the collection of the
67  /// function mapping records.
68  void addFunctionMappingRecord(llvm::GlobalVariable *FunctionName,
69                                StringRef FunctionNameValue,
70                                uint64_t FunctionHash,
71                                const std::string &CoverageMapping,
72                                bool IsUsed = true);
73
74  /// Emit the coverage mapping data for a translation unit.
75  void emit();
76
77  /// Return the coverage mapping translation unit file id
78  /// for the given file.
79  unsigned getFileID(const FileEntry *File);
80};
81
82/// Organizes the per-function state that is used while generating
83/// code coverage mapping data.
84class CoverageMappingGen {
85  CoverageMappingModuleGen &CVM;
86  SourceManager &SM;
87  const LangOptions &LangOpts;
88  llvm::DenseMap<const Stmt *, unsigned> *CounterMap;
89
90public:
91  CoverageMappingGen(CoverageMappingModuleGen &CVMSourceManager &SM,
92                     const LangOptions &LangOpts)
93      : CVM(CVM), SM(SM), LangOpts(LangOpts), CounterMap(nullptr) {}
94
95  CoverageMappingGen(CoverageMappingModuleGen &CVMSourceManager &SM,
96                     const LangOptions &LangOpts,
97                     llvm::DenseMap<const Stmt *, unsigned> *CounterMap)
98      : CVM(CVM), SM(SM), LangOpts(LangOpts), CounterMap(CounterMap) {}
99
100  /// Emit the coverage mapping data which maps the regions of
101  /// code to counters that will be used to find the execution
102  /// counts for those regions.
103  void emitCounterMapping(const Decl *Dllvm::raw_ostream &OS);
104
105  /// Emit the coverage mapping data for an unused function.
106  /// It creates mapping regions with the counter of zero.
107  void emitEmptyMapping(const Decl *Dllvm::raw_ostream &OS);
108};
109
110// end namespace CodeGen
111// end namespace clang
112
113#endif
114
clang::CoverageSourceInfo::SkippedRanges
clang::CoverageSourceInfo::getSkippedRanges
clang::CoverageSourceInfo::SourceRangeSkipped
clang::CodeGen::CoverageMappingModuleGen::CGM
clang::CodeGen::CoverageMappingModuleGen::SourceInfo
clang::CodeGen::CoverageMappingModuleGen::FileEntries
clang::CodeGen::CoverageMappingModuleGen::FunctionRecords
clang::CodeGen::CoverageMappingModuleGen::FunctionNames
clang::CodeGen::CoverageMappingModuleGen::FunctionRecordTy
clang::CodeGen::CoverageMappingModuleGen::CoverageMappings
clang::CodeGen::CoverageMappingModuleGen::getSourceInfo
clang::CodeGen::CoverageMappingModuleGen::addFunctionMappingRecord
clang::CodeGen::CoverageMappingModuleGen::emit
clang::CodeGen::CoverageMappingModuleGen::getFileID
clang::CodeGen::CoverageMappingGen::CVM
clang::CodeGen::CoverageMappingGen::SM
clang::CodeGen::CoverageMappingGen::LangOpts
clang::CodeGen::CoverageMappingGen::CounterMap
clang::CodeGen::CoverageMappingGen::emitCounterMapping
clang::CodeGen::CoverageMappingGen::emitEmptyMapping
clang::CodeGen::CoverageMappingModuleGen::addFunctionMappingRecord