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