1*7c3d14c8STreehugger Robot //===-- esan_interface.cpp ------------------------------------------------===//
2*7c3d14c8STreehugger Robot //
3*7c3d14c8STreehugger Robot // The LLVM Compiler Infrastructure
4*7c3d14c8STreehugger Robot //
5*7c3d14c8STreehugger Robot // This file is distributed under the University of Illinois Open Source
6*7c3d14c8STreehugger Robot // License. See LICENSE.TXT for details.
7*7c3d14c8STreehugger Robot //
8*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===//
9*7c3d14c8STreehugger Robot //
10*7c3d14c8STreehugger Robot // This file is a part of EfficiencySanitizer, a family of performance tuners.
11*7c3d14c8STreehugger Robot //
12*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===//
13*7c3d14c8STreehugger Robot
14*7c3d14c8STreehugger Robot #include "esan_interface_internal.h"
15*7c3d14c8STreehugger Robot #include "esan.h"
16*7c3d14c8STreehugger Robot #include "sanitizer_common/sanitizer_internal_defs.h"
17*7c3d14c8STreehugger Robot
18*7c3d14c8STreehugger Robot using namespace __esan; // NOLINT
19*7c3d14c8STreehugger Robot
__esan_init(ToolType Tool,void * Ptr)20*7c3d14c8STreehugger Robot void __esan_init(ToolType Tool, void *Ptr) {
21*7c3d14c8STreehugger Robot if (Tool != __esan_which_tool) {
22*7c3d14c8STreehugger Robot Printf("ERROR: tool mismatch: %d vs %d\n", Tool, __esan_which_tool);
23*7c3d14c8STreehugger Robot Die();
24*7c3d14c8STreehugger Robot }
25*7c3d14c8STreehugger Robot initializeLibrary(Tool);
26*7c3d14c8STreehugger Robot processCompilationUnitInit(Ptr);
27*7c3d14c8STreehugger Robot }
28*7c3d14c8STreehugger Robot
__esan_exit(void * Ptr)29*7c3d14c8STreehugger Robot void __esan_exit(void *Ptr) {
30*7c3d14c8STreehugger Robot processCompilationUnitExit(Ptr);
31*7c3d14c8STreehugger Robot }
32*7c3d14c8STreehugger Robot
__esan_aligned_load1(void * Addr)33*7c3d14c8STreehugger Robot void __esan_aligned_load1(void *Addr) {
34*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 1, false);
35*7c3d14c8STreehugger Robot }
36*7c3d14c8STreehugger Robot
__esan_aligned_load2(void * Addr)37*7c3d14c8STreehugger Robot void __esan_aligned_load2(void *Addr) {
38*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 2, false);
39*7c3d14c8STreehugger Robot }
40*7c3d14c8STreehugger Robot
__esan_aligned_load4(void * Addr)41*7c3d14c8STreehugger Robot void __esan_aligned_load4(void *Addr) {
42*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 4, false);
43*7c3d14c8STreehugger Robot }
44*7c3d14c8STreehugger Robot
__esan_aligned_load8(void * Addr)45*7c3d14c8STreehugger Robot void __esan_aligned_load8(void *Addr) {
46*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 8, false);
47*7c3d14c8STreehugger Robot }
48*7c3d14c8STreehugger Robot
__esan_aligned_load16(void * Addr)49*7c3d14c8STreehugger Robot void __esan_aligned_load16(void *Addr) {
50*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 16, false);
51*7c3d14c8STreehugger Robot }
52*7c3d14c8STreehugger Robot
__esan_aligned_store1(void * Addr)53*7c3d14c8STreehugger Robot void __esan_aligned_store1(void *Addr) {
54*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 1, true);
55*7c3d14c8STreehugger Robot }
56*7c3d14c8STreehugger Robot
__esan_aligned_store2(void * Addr)57*7c3d14c8STreehugger Robot void __esan_aligned_store2(void *Addr) {
58*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 2, true);
59*7c3d14c8STreehugger Robot }
60*7c3d14c8STreehugger Robot
__esan_aligned_store4(void * Addr)61*7c3d14c8STreehugger Robot void __esan_aligned_store4(void *Addr) {
62*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 4, true);
63*7c3d14c8STreehugger Robot }
64*7c3d14c8STreehugger Robot
__esan_aligned_store8(void * Addr)65*7c3d14c8STreehugger Robot void __esan_aligned_store8(void *Addr) {
66*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 8, true);
67*7c3d14c8STreehugger Robot }
68*7c3d14c8STreehugger Robot
__esan_aligned_store16(void * Addr)69*7c3d14c8STreehugger Robot void __esan_aligned_store16(void *Addr) {
70*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 16, true);
71*7c3d14c8STreehugger Robot }
72*7c3d14c8STreehugger Robot
__esan_unaligned_load2(void * Addr)73*7c3d14c8STreehugger Robot void __esan_unaligned_load2(void *Addr) {
74*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 2, false);
75*7c3d14c8STreehugger Robot }
76*7c3d14c8STreehugger Robot
__esan_unaligned_load4(void * Addr)77*7c3d14c8STreehugger Robot void __esan_unaligned_load4(void *Addr) {
78*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 4, false);
79*7c3d14c8STreehugger Robot }
80*7c3d14c8STreehugger Robot
__esan_unaligned_load8(void * Addr)81*7c3d14c8STreehugger Robot void __esan_unaligned_load8(void *Addr) {
82*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 8, false);
83*7c3d14c8STreehugger Robot }
84*7c3d14c8STreehugger Robot
__esan_unaligned_load16(void * Addr)85*7c3d14c8STreehugger Robot void __esan_unaligned_load16(void *Addr) {
86*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 16, false);
87*7c3d14c8STreehugger Robot }
88*7c3d14c8STreehugger Robot
__esan_unaligned_store2(void * Addr)89*7c3d14c8STreehugger Robot void __esan_unaligned_store2(void *Addr) {
90*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 2, true);
91*7c3d14c8STreehugger Robot }
92*7c3d14c8STreehugger Robot
__esan_unaligned_store4(void * Addr)93*7c3d14c8STreehugger Robot void __esan_unaligned_store4(void *Addr) {
94*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 4, true);
95*7c3d14c8STreehugger Robot }
96*7c3d14c8STreehugger Robot
__esan_unaligned_store8(void * Addr)97*7c3d14c8STreehugger Robot void __esan_unaligned_store8(void *Addr) {
98*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 8, true);
99*7c3d14c8STreehugger Robot }
100*7c3d14c8STreehugger Robot
__esan_unaligned_store16(void * Addr)101*7c3d14c8STreehugger Robot void __esan_unaligned_store16(void *Addr) {
102*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, 16, true);
103*7c3d14c8STreehugger Robot }
104*7c3d14c8STreehugger Robot
__esan_unaligned_loadN(void * Addr,uptr Size)105*7c3d14c8STreehugger Robot void __esan_unaligned_loadN(void *Addr, uptr Size) {
106*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, Size, false);
107*7c3d14c8STreehugger Robot }
108*7c3d14c8STreehugger Robot
__esan_unaligned_storeN(void * Addr,uptr Size)109*7c3d14c8STreehugger Robot void __esan_unaligned_storeN(void *Addr, uptr Size) {
110*7c3d14c8STreehugger Robot processRangeAccess(GET_CALLER_PC(), (uptr)Addr, Size, true);
111*7c3d14c8STreehugger Robot }
112*7c3d14c8STreehugger Robot
113*7c3d14c8STreehugger Robot // Public interface:
114*7c3d14c8STreehugger Robot extern "C" {
__esan_report()115*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __esan_report() {
116*7c3d14c8STreehugger Robot reportResults();
117*7c3d14c8STreehugger Robot }
118*7c3d14c8STreehugger Robot } // extern "C"
119