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