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 };
30 
31 /// Public interface to the address sanitizer module pass for instrumenting code
32 /// to check for various memory errors.
33 ///
34 /// This adds 'asan.module_ctor' to 'llvm.global_ctors'. This pass may also
35 /// run intependently of the function address sanitizer.
36 class AddressSanitizerPass : public PassInfoMixin<AddressSanitizerPass> {
37 public:
38   AddressSanitizerPass(const AddressSanitizerOptions &Options,
39                        bool UseGlobalGC = true, bool UseOdrIndicator = true,
40                        AsanDtorKind DestructorKind = AsanDtorKind::Global,
41                        AsanCtorKind ConstructorKind = AsanCtorKind::Global);
42   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
43   void printPipeline(raw_ostream &OS,
44                      function_ref<StringRef(StringRef)> MapClassName2PassName);
45   static bool isRequired() { return true; }
46 
47 private:
48   AddressSanitizerOptions Options;
49   bool UseGlobalGC;
50   bool UseOdrIndicator;
51   AsanDtorKind DestructorKind;
52   AsanCtorKind ConstructorKind;
53 };
54 
55 struct ASanAccessInfo {
56   const int32_t Packed;
57   const uint8_t AccessSizeIndex;
58   const bool IsWrite;
59   const bool CompileKernel;
60 
61   explicit ASanAccessInfo(int32_t Packed);
62   ASanAccessInfo(bool IsWrite, bool CompileKernel, uint8_t AccessSizeIndex);
63 };
64 
65 } // namespace llvm
66 
67 #endif
68