annotate libsanitizer/tsan/tsan_interface.cpp @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 //===-- tsan_interface.cpp ------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 // This file is a part of ThreadSanitizer (TSan), a race detector.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 #include "tsan_interface.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 #include "tsan_interface_ann.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 #include "tsan_rtl.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 #include "sanitizer_common/sanitizer_internal_defs.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 #define CALLERPC ((uptr)__builtin_return_address(0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 using namespace __tsan;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 typedef u16 uint16_t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 typedef u32 uint32_t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 typedef u64 uint64_t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 void __tsan_init() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 cur_thread_init();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 Initialize(cur_thread());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 void __tsan_flush_memory() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 FlushShadowMemory();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 void __tsan_read16(void *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 MemoryRead(cur_thread(), CALLERPC, (uptr)addr, kSizeLog8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 MemoryRead(cur_thread(), CALLERPC, (uptr)addr + 8, kSizeLog8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 void __tsan_write16(void *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 MemoryWrite(cur_thread(), CALLERPC, (uptr)addr, kSizeLog8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 MemoryWrite(cur_thread(), CALLERPC, (uptr)addr + 8, kSizeLog8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 void __tsan_read16_pc(void *addr, void *pc) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 MemoryRead(cur_thread(), (uptr)pc, (uptr)addr, kSizeLog8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 MemoryRead(cur_thread(), (uptr)pc, (uptr)addr + 8, kSizeLog8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 void __tsan_write16_pc(void *addr, void *pc) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 MemoryWrite(cur_thread(), (uptr)pc, (uptr)addr, kSizeLog8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 MemoryWrite(cur_thread(), (uptr)pc, (uptr)addr + 8, kSizeLog8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 // __tsan_unaligned_read/write calls are emitted by compiler.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 void __tsan_unaligned_read2(const void *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 2, false, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 void __tsan_unaligned_read4(const void *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 4, false, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 void __tsan_unaligned_read8(const void *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 8, false, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 void __tsan_unaligned_read16(const void *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 16, false, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 void __tsan_unaligned_write2(void *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 2, true, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 void __tsan_unaligned_write4(void *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 4, true, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 void __tsan_unaligned_write8(void *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 8, true, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 void __tsan_unaligned_write16(void *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 16, true, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 // __sanitizer_unaligned_load/store are for user instrumentation.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 extern "C" {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 SANITIZER_INTERFACE_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 u16 __sanitizer_unaligned_load16(const uu16 *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 __tsan_unaligned_read2(addr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 return *addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 SANITIZER_INTERFACE_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 u32 __sanitizer_unaligned_load32(const uu32 *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 __tsan_unaligned_read4(addr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 return *addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 SANITIZER_INTERFACE_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 u64 __sanitizer_unaligned_load64(const uu64 *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 __tsan_unaligned_read8(addr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 return *addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 SANITIZER_INTERFACE_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 void __sanitizer_unaligned_store16(uu16 *addr, u16 v) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 __tsan_unaligned_write2(addr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 *addr = v;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 SANITIZER_INTERFACE_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 void __sanitizer_unaligned_store32(uu32 *addr, u32 v) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 __tsan_unaligned_write4(addr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 *addr = v;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 SANITIZER_INTERFACE_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 void __sanitizer_unaligned_store64(uu64 *addr, u64 v) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 __tsan_unaligned_write8(addr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 *addr = v;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 SANITIZER_INTERFACE_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 void *__tsan_get_current_fiber() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 return cur_thread();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 SANITIZER_INTERFACE_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 void *__tsan_create_fiber(unsigned flags) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 return FiberCreate(cur_thread(), CALLERPC, flags);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 SANITIZER_INTERFACE_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 void __tsan_destroy_fiber(void *fiber) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 FiberDestroy(cur_thread(), CALLERPC, static_cast<ThreadState *>(fiber));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 SANITIZER_INTERFACE_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 void __tsan_switch_to_fiber(void *fiber, unsigned flags) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 FiberSwitch(cur_thread(), CALLERPC, static_cast<ThreadState *>(fiber), flags);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 SANITIZER_INTERFACE_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 void __tsan_set_fiber_name(void *fiber, const char *name) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 ThreadSetName(static_cast<ThreadState *>(fiber), name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 } // extern "C"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 void __tsan_acquire(void *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 Acquire(cur_thread(), CALLERPC, (uptr)addr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 void __tsan_release(void *addr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 Release(cur_thread(), CALLERPC, (uptr)addr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 }