//===-- esan_interface_internal.h -------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file is a part of EfficiencySanitizer, a family of performance tuners. // // Calls to the functions declared in this header will be inserted by // the instrumentation module. //===----------------------------------------------------------------------===// #ifndef ESAN_INTERFACE_INTERNAL_H #define ESAN_INTERFACE_INTERNAL_H #include // This header should NOT include any other headers. // All functions in this header are extern "C" and start with __esan_. using __sanitizer::uptr; using __sanitizer::u32; extern "C" { // This should be kept consistent with LLVM's EfficiencySanitizerOptions. // The value is passed as a 32-bit integer by the compiler. typedef enum Type : u32 { ESAN_None = 0, ESAN_CacheFrag, ESAN_WorkingSet, ESAN_Max, } ToolType; // To handle interceptors that invoke instrumented code prior to // __esan_init() being called, the instrumentation module creates this // global variable specifying the tool. extern ToolType __esan_which_tool; // This function should be called at the very beginning of the process, // before any instrumented code is executed and before any call to malloc. SANITIZER_INTERFACE_ATTRIBUTE void __esan_init(ToolType Tool, void *Ptr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_exit(void *Ptr); // The instrumentation module will insert a call to one of these routines prior // to each load and store instruction for which we do not have "fastpath" // inlined instrumentation. These calls constitute the "slowpath" for our // tools. We have separate routines for each type of memory access to enable // targeted optimization. SANITIZER_INTERFACE_ATTRIBUTE void __esan_aligned_load1(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_aligned_load2(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_aligned_load4(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_aligned_load8(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_aligned_load16(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_aligned_store1(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_aligned_store2(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_aligned_store4(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_aligned_store8(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_aligned_store16(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_unaligned_load2(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_unaligned_load4(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_unaligned_load8(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_unaligned_load16(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_unaligned_store2(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_unaligned_store4(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_unaligned_store8(void *Addr); SANITIZER_INTERFACE_ATTRIBUTE void __esan_unaligned_store16(void *Addr); // These cover unusually-sized accesses. SANITIZER_INTERFACE_ATTRIBUTE void __esan_unaligned_loadN(void *Addr, uptr Size); SANITIZER_INTERFACE_ATTRIBUTE void __esan_unaligned_storeN(void *Addr, uptr Size); } // extern "C" #endif // ESAN_INTERFACE_INTERNAL_H