xref: /netbsd-src/external/apache2/llvm/dist/llvm/include/llvm/Transforms/Instrumentation/SanitizerCoverage.h (revision 82d56013d7b633d116a93943de88e08335357a7c)
1 //===--------- Definition of the SanitizerCoverage class --------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
6 // See https://llvm.org/LICENSE.txt for license information.
7 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //
9 //===----------------------------------------------------------------------===//
10 //
11 // This file declares the SanitizerCoverage class which is a port of the legacy
12 // SanitizerCoverage pass to use the new PassManager infrastructure.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #ifndef LLVM_TRANSFORMS_INSTRUMENTATION_SANITIZERCOVERAGE_H
17 #define LLVM_TRANSFORMS_INSTRUMENTATION_SANITIZERCOVERAGE_H
18 
19 #include "llvm/IR/Module.h"
20 #include "llvm/IR/PassManager.h"
21 #include "llvm/Support/SpecialCaseList.h"
22 #include "llvm/Support/VirtualFileSystem.h"
23 #include "llvm/Transforms/Instrumentation.h"
24 
25 namespace llvm {
26 
27 /// This is the ModuleSanitizerCoverage pass used in the new pass manager. The
28 /// pass instruments functions for coverage, adds initialization calls to the
29 /// module for trace PC guards and 8bit counters if they are requested, and
30 /// appends globals to llvm.compiler.used.
31 class ModuleSanitizerCoveragePass
32     : public PassInfoMixin<ModuleSanitizerCoveragePass> {
33 public:
34   explicit ModuleSanitizerCoveragePass(
35       SanitizerCoverageOptions Options = SanitizerCoverageOptions(),
36       const std::vector<std::string> &AllowlistFiles =
37           std::vector<std::string>(),
38       const std::vector<std::string> &BlocklistFiles =
39           std::vector<std::string>())
Options(Options)40       : Options(Options) {
41     if (AllowlistFiles.size() > 0)
42       Allowlist = SpecialCaseList::createOrDie(AllowlistFiles,
43                                                *vfs::getRealFileSystem());
44     if (BlocklistFiles.size() > 0)
45       Blocklist = SpecialCaseList::createOrDie(BlocklistFiles,
46                                                *vfs::getRealFileSystem());
47   }
48   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
isRequired()49   static bool isRequired() { return true; }
50 
51 private:
52   SanitizerCoverageOptions Options;
53 
54   std::unique_ptr<SpecialCaseList> Allowlist;
55   std::unique_ptr<SpecialCaseList> Blocklist;
56 };
57 
58 // Insert SanitizerCoverage instrumentation.
59 ModulePass *createModuleSanitizerCoverageLegacyPassPass(
60     const SanitizerCoverageOptions &Options = SanitizerCoverageOptions(),
61     const std::vector<std::string> &AllowlistFiles = std::vector<std::string>(),
62     const std::vector<std::string> &BlocklistFiles =
63         std::vector<std::string>());
64 
65 } // namespace llvm
66 
67 #endif
68