xref: /freebsd/contrib/llvm-project/llvm/include/llvm/Transforms/Instrumentation/AddressSanitizer.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
1 //===--------- Definition of the AddressSanitizer 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 AddressSanitizer class which is a port of the legacy
10 // AddressSanitizer pass to use the new PassManager infrastructure.
11 //
12 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_TRANSFORMS_INSTRUMENTATION_ADDRESSSANITIZER_H
14 #define LLVM_TRANSFORMS_INSTRUMENTATION_ADDRESSSANITIZER_H
15 
16 #include "llvm/IR/PassManager.h"
17 #include "llvm/Transforms/Instrumentation/AddressSanitizerOptions.h"
18 
19 namespace llvm {
20 class Module;
21 class raw_ostream;
22 
23 struct AddressSanitizerOptions {
24   bool CompileKernel = false;
25   bool Recover = false;
26   bool UseAfterScope = false;
27   AsanDetectStackUseAfterReturnMode UseAfterReturn =
28       AsanDetectStackUseAfterReturnMode::Runtime;
29   int InstrumentationWithCallsThreshold = 7000;
30   uint32_t MaxInlinePoisoningSize = 64;
31   bool InsertVersionCheck = true;
32 };
33 
34 /// Public interface to the address sanitizer module pass for instrumenting code
35 /// to check for various memory errors.
36 ///
37 /// This adds 'asan.module_ctor' to 'llvm.global_ctors'. This pass may also
38 /// run intependently of the function address sanitizer.
39 class AddressSanitizerPass : public PassInfoMixin<AddressSanitizerPass> {
40 public:
41   AddressSanitizerPass(const AddressSanitizerOptions &Options,
42                        bool UseGlobalGC = true, bool UseOdrIndicator = true,
43                        AsanDtorKind DestructorKind = AsanDtorKind::Global,
44                        AsanCtorKind ConstructorKind = AsanCtorKind::Global);
45   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
46   void printPipeline(raw_ostream &OS,
47                      function_ref<StringRef(StringRef)> MapClassName2PassName);
48   static bool isRequired() { return true; }
49 
50 private:
51   AddressSanitizerOptions Options;
52   bool UseGlobalGC;
53   bool UseOdrIndicator;
54   AsanDtorKind DestructorKind;
55   AsanCtorKind ConstructorKind;
56 };
57 
58 struct ASanAccessInfo {
59   const int32_t Packed;
60   const uint8_t AccessSizeIndex;
61   const bool IsWrite;
62   const bool CompileKernel;
63 
64   explicit ASanAccessInfo(int32_t Packed);
65   ASanAccessInfo(bool IsWrite, bool CompileKernel, uint8_t AccessSizeIndex);
66 };
67 
68 } // namespace llvm
69 
70 #endif
71