Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.