//===--------- Definition of the HWAddressSanitizer class -------*- C++ -*-===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===----------------------------------------------------------------------===//
 
//
 
// This file declares the Hardware AddressSanitizer class which is a port of the
 
// legacy HWAddressSanitizer pass to use the new PassManager infrastructure.
 
//
 
//===----------------------------------------------------------------------===//
 
#ifndef LLVM_TRANSFORMS_INSTRUMENTATION_HWADDRESSSANITIZER_H
 
#define LLVM_TRANSFORMS_INSTRUMENTATION_HWADDRESSSANITIZER_H
 
 
 
#include "llvm/ADT/STLFunctionalExtras.h"
 
#include "llvm/IR/PassManager.h"
 
 
 
namespace llvm {
 
class Module;
 
class StringRef;
 
class raw_ostream;
 
 
 
struct HWAddressSanitizerOptions {
 
  HWAddressSanitizerOptions()
 
      : HWAddressSanitizerOptions(false, false, false){};
 
  HWAddressSanitizerOptions(bool CompileKernel, bool Recover,
 
                            bool DisableOptimization)
 
      : CompileKernel(CompileKernel), Recover(Recover),
 
        DisableOptimization(DisableOptimization){};
 
  bool CompileKernel;
 
  bool Recover;
 
  bool DisableOptimization;
 
};
 
 
 
/// This is a public interface to the hardware address sanitizer pass for
 
/// instrumenting code to check for various memory errors at runtime, similar to
 
/// AddressSanitizer but based on partial hardware assistance.
 
class HWAddressSanitizerPass : public PassInfoMixin<HWAddressSanitizerPass> {
 
public:
 
  explicit HWAddressSanitizerPass(HWAddressSanitizerOptions Options)
 
      : Options(Options){};
 
  PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
 
  static bool isRequired() { return true; }
 
  void printPipeline(raw_ostream &OS,
 
                     function_ref<StringRef(StringRef)> MapClassName2PassName);
 
 
 
private:
 
  HWAddressSanitizerOptions Options;
 
};
 
 
 
namespace HWASanAccessInfo {
 
 
 
// Bit field positions for the accessinfo parameter to
 
// llvm.hwasan.check.memaccess. Shared between the pass and the backend. Bits
 
// 0-15 are also used by the runtime.
 
enum {
 
  AccessSizeShift = 0, // 4 bits
 
  IsWriteShift = 4,
 
  RecoverShift = 5,
 
  MatchAllShift = 16, // 8 bits
 
  HasMatchAllShift = 24,
 
  CompileKernelShift = 25,
 
};
 
 
 
enum { RuntimeMask = 0xffff };
 
 
 
} // namespace HWASanAccessInfo
 
 
 
} // namespace llvm
 
 
 
#endif