1 //===------- Definition of the SanitizerBinaryMetadata class ----*- 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 // This file declares the SanitizerBinaryMetadata pass. 10 // 11 //===----------------------------------------------------------------------===// 12 #ifndef LLVM_TRANSFORMS_INSTRUMENTATION_SANITIZERBINARYMETADATA_H 13 #define LLVM_TRANSFORMS_INSTRUMENTATION_SANITIZERBINARYMETADATA_H 14 15 #include "llvm/ADT/ArrayRef.h" 16 #include "llvm/IR/Function.h" 17 #include "llvm/IR/Module.h" 18 #include "llvm/IR/PassManager.h" 19 #include "llvm/Transforms/Instrumentation.h" 20 21 namespace llvm { 22 23 struct SanitizerBinaryMetadataOptions { 24 bool Covered = false; 25 bool Atomics = false; 26 bool UAR = false; 27 SanitizerBinaryMetadataOptions() = default; 28 }; 29 30 inline constexpr int kSanitizerBinaryMetadataAtomicsBit = 0; 31 inline constexpr int kSanitizerBinaryMetadataUARBit = 1; 32 inline constexpr int kSanitizerBinaryMetadataUARHasSizeBit = 2; 33 34 inline constexpr uint64_t kSanitizerBinaryMetadataAtomics = 35 1 << kSanitizerBinaryMetadataAtomicsBit; 36 inline constexpr uint64_t kSanitizerBinaryMetadataUAR = 37 1 << kSanitizerBinaryMetadataUARBit; 38 inline constexpr uint64_t kSanitizerBinaryMetadataUARHasSize = 39 1 << kSanitizerBinaryMetadataUARHasSizeBit; 40 41 inline constexpr char kSanitizerBinaryMetadataCoveredSection[] = 42 "sanmd_covered"; 43 inline constexpr char kSanitizerBinaryMetadataAtomicsSection[] = 44 "sanmd_atomics"; 45 46 /// Public interface to the SanitizerBinaryMetadata module pass for emitting 47 /// metadata for binary analysis sanitizers. 48 // 49 /// The pass should be inserted after optimizations. 50 class SanitizerBinaryMetadataPass 51 : public PassInfoMixin<SanitizerBinaryMetadataPass> { 52 public: 53 explicit SanitizerBinaryMetadataPass( 54 SanitizerBinaryMetadataOptions Opts = {}, 55 ArrayRef<std::string> IgnorelistFiles = {}); 56 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); isRequired()57 static bool isRequired() { return true; } 58 59 private: 60 const SanitizerBinaryMetadataOptions Options; 61 const ArrayRef<std::string> IgnorelistFiles; 62 }; 63 64 } // namespace llvm 65 66 #endif 67