annotate libsanitizer/tsan/tsan_interface_inl.h @ 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
111
kono
parents:
diff changeset
1 //===-- tsan_interface_inl.h ------------------------------------*- C++ -*-===//
kono
parents:
diff changeset
2 //
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
111
kono
parents:
diff changeset
6 //
kono
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
8 //
kono
parents:
diff changeset
9 // This file is a part of ThreadSanitizer (TSan), a race detector.
kono
parents:
diff changeset
10 //
kono
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 #include "tsan_interface.h"
kono
parents:
diff changeset
14 #include "tsan_rtl.h"
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 #define CALLERPC ((uptr)__builtin_return_address(0))
kono
parents:
diff changeset
17
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
18 using namespace __tsan;
111
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 void __tsan_read1(void *addr) {
kono
parents:
diff changeset
21 MemoryRead(cur_thread(), CALLERPC, (uptr)addr, kSizeLog1);
kono
parents:
diff changeset
22 }
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 void __tsan_read2(void *addr) {
kono
parents:
diff changeset
25 MemoryRead(cur_thread(), CALLERPC, (uptr)addr, kSizeLog2);
kono
parents:
diff changeset
26 }
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 void __tsan_read4(void *addr) {
kono
parents:
diff changeset
29 MemoryRead(cur_thread(), CALLERPC, (uptr)addr, kSizeLog4);
kono
parents:
diff changeset
30 }
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 void __tsan_read8(void *addr) {
kono
parents:
diff changeset
33 MemoryRead(cur_thread(), CALLERPC, (uptr)addr, kSizeLog8);
kono
parents:
diff changeset
34 }
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 void __tsan_write1(void *addr) {
kono
parents:
diff changeset
37 MemoryWrite(cur_thread(), CALLERPC, (uptr)addr, kSizeLog1);
kono
parents:
diff changeset
38 }
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 void __tsan_write2(void *addr) {
kono
parents:
diff changeset
41 MemoryWrite(cur_thread(), CALLERPC, (uptr)addr, kSizeLog2);
kono
parents:
diff changeset
42 }
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 void __tsan_write4(void *addr) {
kono
parents:
diff changeset
45 MemoryWrite(cur_thread(), CALLERPC, (uptr)addr, kSizeLog4);
kono
parents:
diff changeset
46 }
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 void __tsan_write8(void *addr) {
kono
parents:
diff changeset
49 MemoryWrite(cur_thread(), CALLERPC, (uptr)addr, kSizeLog8);
kono
parents:
diff changeset
50 }
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 void __tsan_read1_pc(void *addr, void *pc) {
kono
parents:
diff changeset
53 MemoryRead(cur_thread(), (uptr)pc, (uptr)addr, kSizeLog1);
kono
parents:
diff changeset
54 }
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 void __tsan_read2_pc(void *addr, void *pc) {
kono
parents:
diff changeset
57 MemoryRead(cur_thread(), (uptr)pc, (uptr)addr, kSizeLog2);
kono
parents:
diff changeset
58 }
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 void __tsan_read4_pc(void *addr, void *pc) {
kono
parents:
diff changeset
61 MemoryRead(cur_thread(), (uptr)pc, (uptr)addr, kSizeLog4);
kono
parents:
diff changeset
62 }
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 void __tsan_read8_pc(void *addr, void *pc) {
kono
parents:
diff changeset
65 MemoryRead(cur_thread(), (uptr)pc, (uptr)addr, kSizeLog8);
kono
parents:
diff changeset
66 }
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 void __tsan_write1_pc(void *addr, void *pc) {
kono
parents:
diff changeset
69 MemoryWrite(cur_thread(), (uptr)pc, (uptr)addr, kSizeLog1);
kono
parents:
diff changeset
70 }
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 void __tsan_write2_pc(void *addr, void *pc) {
kono
parents:
diff changeset
73 MemoryWrite(cur_thread(), (uptr)pc, (uptr)addr, kSizeLog2);
kono
parents:
diff changeset
74 }
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 void __tsan_write4_pc(void *addr, void *pc) {
kono
parents:
diff changeset
77 MemoryWrite(cur_thread(), (uptr)pc, (uptr)addr, kSizeLog4);
kono
parents:
diff changeset
78 }
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 void __tsan_write8_pc(void *addr, void *pc) {
kono
parents:
diff changeset
81 MemoryWrite(cur_thread(), (uptr)pc, (uptr)addr, kSizeLog8);
kono
parents:
diff changeset
82 }
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 void __tsan_vptr_update(void **vptr_p, void *new_val) {
kono
parents:
diff changeset
85 CHECK_EQ(sizeof(vptr_p), 8);
kono
parents:
diff changeset
86 if (*vptr_p != new_val) {
kono
parents:
diff changeset
87 ThreadState *thr = cur_thread();
kono
parents:
diff changeset
88 thr->is_vptr_access = true;
kono
parents:
diff changeset
89 MemoryWrite(thr, CALLERPC, (uptr)vptr_p, kSizeLog8);
kono
parents:
diff changeset
90 thr->is_vptr_access = false;
kono
parents:
diff changeset
91 }
kono
parents:
diff changeset
92 }
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 void __tsan_vptr_read(void **vptr_p) {
kono
parents:
diff changeset
95 CHECK_EQ(sizeof(vptr_p), 8);
kono
parents:
diff changeset
96 ThreadState *thr = cur_thread();
kono
parents:
diff changeset
97 thr->is_vptr_access = true;
kono
parents:
diff changeset
98 MemoryRead(thr, CALLERPC, (uptr)vptr_p, kSizeLog8);
kono
parents:
diff changeset
99 thr->is_vptr_access = false;
kono
parents:
diff changeset
100 }
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 void __tsan_func_entry(void *pc) {
kono
parents:
diff changeset
103 FuncEntry(cur_thread(), (uptr)pc);
kono
parents:
diff changeset
104 }
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 void __tsan_func_exit() {
kono
parents:
diff changeset
107 FuncExit(cur_thread());
kono
parents:
diff changeset
108 }
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 void __tsan_ignore_thread_begin() {
kono
parents:
diff changeset
111 ThreadIgnoreBegin(cur_thread(), CALLERPC);
kono
parents:
diff changeset
112 }
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 void __tsan_ignore_thread_end() {
kono
parents:
diff changeset
115 ThreadIgnoreEnd(cur_thread(), CALLERPC);
kono
parents:
diff changeset
116 }
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 void __tsan_read_range(void *addr, uptr size) {
kono
parents:
diff changeset
119 MemoryAccessRange(cur_thread(), CALLERPC, (uptr)addr, size, false);
kono
parents:
diff changeset
120 }
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 void __tsan_write_range(void *addr, uptr size) {
kono
parents:
diff changeset
123 MemoryAccessRange(cur_thread(), CALLERPC, (uptr)addr, size, true);
kono
parents:
diff changeset
124 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
125
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
126 void __tsan_read_range_pc(void *addr, uptr size, void *pc) {
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
127 MemoryAccessRange(cur_thread(), (uptr)pc, (uptr)addr, size, false);
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
128 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
129
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
130 void __tsan_write_range_pc(void *addr, uptr size, void *pc) {
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
131 MemoryAccessRange(cur_thread(), (uptr)pc, (uptr)addr, size, true);
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
132 }