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 ModuleAddressSanitizerPass
37     : public PassInfoMixin<ModuleAddressSanitizerPass> {
38 public:
39   ModuleAddressSanitizerPass(
40       const AddressSanitizerOptions &Options, bool UseGlobalGC = true,
41       bool UseOdrIndicator = false,
42       AsanDtorKind DestructorKind = AsanDtorKind::Global);
43   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
44   void printPipeline(raw_ostream &OS,
45                      function_ref<StringRef(StringRef)> MapClassName2PassName);
46   static bool isRequired() { return true; }
47 
48 private:
49   AddressSanitizerOptions Options;
50   bool UseGlobalGC;
51   bool UseOdrIndicator;
52   AsanDtorKind DestructorKind;
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