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 21namespace llvm { 22 23struct SanitizerBinaryMetadataOptions { 24 bool Covered = false; 25 bool Atomics = false; 26 bool UAR = false; 27 SanitizerBinaryMetadataOptions() = default; 28}; 29 30inline constexpr int kSanitizerBinaryMetadataAtomicsBit = 0; 31inline constexpr int kSanitizerBinaryMetadataUARBit = 1; 32inline constexpr int kSanitizerBinaryMetadataUARHasSizeBit = 2; 33 34inline constexpr uint64_t kSanitizerBinaryMetadataAtomics = 35 1 << kSanitizerBinaryMetadataAtomicsBit; 36inline constexpr uint64_t kSanitizerBinaryMetadataUAR = 37 1 << kSanitizerBinaryMetadataUARBit; 38inline constexpr uint64_t kSanitizerBinaryMetadataUARHasSize = 39 1 << kSanitizerBinaryMetadataUARHasSizeBit; 40 41inline constexpr char kSanitizerBinaryMetadataCoveredSection[] = 42 "sanmd_covered"; 43inline 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. 50class SanitizerBinaryMetadataPass 51 : public PassInfoMixin<SanitizerBinaryMetadataPass> { 52public: 53 explicit SanitizerBinaryMetadataPass( 54 SanitizerBinaryMetadataOptions Opts = {}, 55 ArrayRef<std::string> IgnorelistFiles = {}); 56 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 57 static bool isRequired() { return true; } 58 59private: 60 const SanitizerBinaryMetadataOptions Options; 61 const ArrayRef<std::string> IgnorelistFiles; 62}; 63 64} // namespace llvm 65 66#endif 67