123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- //===---- CoverageMappingGen.h - Coverage mapping generation ----*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // Instrumentation-based code coverage mapping generator
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_CLANG_LIB_CODEGEN_COVERAGEMAPPINGGEN_H
- #define LLVM_CLANG_LIB_CODEGEN_COVERAGEMAPPINGGEN_H
- #include "clang/Basic/LLVM.h"
- #include "clang/Basic/SourceLocation.h"
- #include "clang/Lex/PPCallbacks.h"
- #include "llvm/ADT/DenseMap.h"
- #include "llvm/IR/GlobalValue.h"
- #include "llvm/Support/raw_ostream.h"
- namespace clang {
- class LangOptions;
- class SourceManager;
- class FileEntry;
- class Preprocessor;
- class Decl;
- class Stmt;
- /// Stores additional source code information like skipped ranges which
- /// is required by the coverage mapping generator and is obtained from
- /// the preprocessor.
- class CoverageSourceInfo : public PPCallbacks {
- std::vector<SourceRange> SkippedRanges;
- public:
- ArrayRef<SourceRange> getSkippedRanges() const { return SkippedRanges; }
- void SourceRangeSkipped(SourceRange Range, SourceLocation EndifLoc) override;
- };
- namespace CodeGen {
- class CodeGenModule;
- /// Organizes the cross-function state that is used while generating
- /// code coverage mapping data.
- class CoverageMappingModuleGen {
- CodeGenModule &CGM;
- CoverageSourceInfo &SourceInfo;
- llvm::SmallDenseMap<const FileEntry *, unsigned, 8> FileEntries;
- std::vector<llvm::Constant *> FunctionRecords;
- std::vector<llvm::Constant *> FunctionNames;
- llvm::StructType *FunctionRecordTy;
- std::vector<std::string> CoverageMappings;
- SmallString<256> CWD;
- /// Make the filename absolute, remove dots, and normalize slashes to local
- /// path style.
- std::string normalizeFilename(StringRef Filename);
- public:
- CoverageMappingModuleGen(CodeGenModule &CGM, CoverageSourceInfo &SourceInfo);
- CoverageSourceInfo &getSourceInfo() const {
- return SourceInfo;
- }
- /// Add a function's coverage mapping record to the collection of the
- /// function mapping records.
- void addFunctionMappingRecord(llvm::GlobalVariable *FunctionName,
- StringRef FunctionNameValue,
- uint64_t FunctionHash,
- const std::string &CoverageMapping,
- bool IsUsed = true);
- /// Emit the coverage mapping data for a translation unit.
- void emit();
- /// Return the coverage mapping translation unit file id
- /// for the given file.
- unsigned getFileID(const FileEntry *File);
- };
- /// Organizes the per-function state that is used while generating
- /// code coverage mapping data.
- class CoverageMappingGen {
- CoverageMappingModuleGen &CVM;
- SourceManager &SM;
- const LangOptions &LangOpts;
- llvm::DenseMap<const Stmt *, unsigned> *CounterMap;
- public:
- CoverageMappingGen(CoverageMappingModuleGen &CVM, SourceManager &SM,
- const LangOptions &LangOpts)
- : CVM(CVM), SM(SM), LangOpts(LangOpts), CounterMap(nullptr) {}
- CoverageMappingGen(CoverageMappingModuleGen &CVM, SourceManager &SM,
- const LangOptions &LangOpts,
- llvm::DenseMap<const Stmt *, unsigned> *CounterMap)
- : CVM(CVM), SM(SM), LangOpts(LangOpts), CounterMap(CounterMap) {}
- /// Emit the coverage mapping data which maps the regions of
- /// code to counters that will be used to find the execution
- /// counts for those regions.
- void emitCounterMapping(const Decl *D, llvm::raw_ostream &OS);
- /// Emit the coverage mapping data for an unused function.
- /// It creates mapping regions with the counter of zero.
- void emitEmptyMapping(const Decl *D, llvm::raw_ostream &OS);
- };
- } // end namespace CodeGen
- } // end namespace clang
- #endif
|