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