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