annotate compiler-rt/test/tsan/Darwin/external-lib.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // This file is used from other tests.
anatofuz
parents:
diff changeset
2 // RUN: true
anatofuz
parents:
diff changeset
3
anatofuz
parents:
diff changeset
4 #include <dlfcn.h>
anatofuz
parents:
diff changeset
5 #include <stdio.h>
anatofuz
parents:
diff changeset
6 #include <stdlib.h>
anatofuz
parents:
diff changeset
7
anatofuz
parents:
diff changeset
8 struct MyObject;
anatofuz
parents:
diff changeset
9 typedef MyObject *MyObjectRef;
anatofuz
parents:
diff changeset
10 extern "C" {
anatofuz
parents:
diff changeset
11 void InitializeLibrary();
anatofuz
parents:
diff changeset
12 MyObject *ObjectCreate();
anatofuz
parents:
diff changeset
13 long ObjectRead(MyObject *);
anatofuz
parents:
diff changeset
14 void ObjectWrite(MyObject *, long);
anatofuz
parents:
diff changeset
15 void ObjectWriteAnother(MyObject *, long);
anatofuz
parents:
diff changeset
16 }
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 struct MyObject {
anatofuz
parents:
diff changeset
19 long _val;
anatofuz
parents:
diff changeset
20 long _another;
anatofuz
parents:
diff changeset
21 };
anatofuz
parents:
diff changeset
22
anatofuz
parents:
diff changeset
23 #if defined(USE_TSAN_CALLBACKS)
anatofuz
parents:
diff changeset
24 static void *tag;
anatofuz
parents:
diff changeset
25 void *(*callback_register_tag)(const char *object_type);
anatofuz
parents:
diff changeset
26 void *(*callback_assign_tag)(void *addr, void *tag);
anatofuz
parents:
diff changeset
27 void (*callback_read)(void *addr, void *caller_pc, void *tag);
anatofuz
parents:
diff changeset
28 void (*callback_write)(void *addr, void *caller_pc, void *tag);
anatofuz
parents:
diff changeset
29 #endif
anatofuz
parents:
diff changeset
30
anatofuz
parents:
diff changeset
31 void InitializeLibrary() {
anatofuz
parents:
diff changeset
32 #if defined(USE_TSAN_CALLBACKS)
anatofuz
parents:
diff changeset
33 callback_register_tag = (decltype(callback_register_tag))dlsym(RTLD_DEFAULT, "__tsan_external_register_tag");
anatofuz
parents:
diff changeset
34 callback_assign_tag = (decltype(callback_assign_tag))dlsym(RTLD_DEFAULT, "__tsan_external_assign_tag");
anatofuz
parents:
diff changeset
35 callback_read = (decltype(callback_read))dlsym(RTLD_DEFAULT, "__tsan_external_read");
anatofuz
parents:
diff changeset
36 callback_write = (decltype(callback_write))dlsym(RTLD_DEFAULT, "__tsan_external_write");
anatofuz
parents:
diff changeset
37 tag = callback_register_tag("MyLibrary::MyObject");
anatofuz
parents:
diff changeset
38 #endif
anatofuz
parents:
diff changeset
39 }
anatofuz
parents:
diff changeset
40
anatofuz
parents:
diff changeset
41 MyObject *ObjectCreate() {
anatofuz
parents:
diff changeset
42 MyObject *ref = (MyObject *)malloc(sizeof(MyObject));
anatofuz
parents:
diff changeset
43 #if defined(USE_TSAN_CALLBACKS)
anatofuz
parents:
diff changeset
44 callback_assign_tag(ref, tag);
anatofuz
parents:
diff changeset
45 #endif
anatofuz
parents:
diff changeset
46 return ref;
anatofuz
parents:
diff changeset
47 }
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 long ObjectRead(MyObject *ref) {
anatofuz
parents:
diff changeset
50 #if defined(USE_TSAN_CALLBACKS)
anatofuz
parents:
diff changeset
51 callback_read(ref, __builtin_return_address(0), tag);
anatofuz
parents:
diff changeset
52 #endif
anatofuz
parents:
diff changeset
53 return ref->_val;
anatofuz
parents:
diff changeset
54 }
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 void ObjectWrite(MyObject *ref, long val) {
anatofuz
parents:
diff changeset
57 #if defined(USE_TSAN_CALLBACKS)
anatofuz
parents:
diff changeset
58 callback_write(ref, __builtin_return_address(0), tag);
anatofuz
parents:
diff changeset
59 #endif
anatofuz
parents:
diff changeset
60 ref->_val = val;
anatofuz
parents:
diff changeset
61 }
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 void ObjectWriteAnother(MyObject *ref, long val) {
anatofuz
parents:
diff changeset
64 #if defined(USE_TSAN_CALLBACKS)
anatofuz
parents:
diff changeset
65 callback_write(ref, __builtin_return_address(0), tag);
anatofuz
parents:
diff changeset
66 #endif
anatofuz
parents:
diff changeset
67 ref->_another = val;
anatofuz
parents:
diff changeset
68 }