v / vlib / sync / stdatomic / 1.declarations.c.v
126 lines · 112 sloc · 9.4 KB · 26eddd713bdac79382e315b5296d0281ec81a0ab
Raw
1module stdatomic
2
3// The @VEXEROOT/thirdparty/stdatomic contains compatibility headers
4// for stdatomic, that supports both nix, windows and c++.
5
6$if windows {
7 #flag -I @VEXEROOT/thirdparty/stdatomic/win
8 #insert "@VEXEROOT/thirdparty/stdatomic/win/atomic.h"
9} $else {
10 #flag -I @VEXEROOT/thirdparty/stdatomic/nix
11 #insert "@VEXEROOT/thirdparty/stdatomic/nix/atomic.h"
12}
13
14$if linux {
15 $if tinyc {
16 $if amd64 {
17 // Redhat/CentOS:
18 #flag $when_first_existing('/usr/lib/gcc/x86_64-redhat-linux/6/libatomic.a','/usr/lib/gcc/x86_64-redhat-linux/7/libatomic.a','/usr/lib/gcc/x86_64-redhat-linux/8/libatomic.a','/usr/lib/gcc/x86_64-redhat-linux/9/libatomic.a','/usr/lib/gcc/x86_64-redhat-linux/10/libatomic.a','/usr/lib/gcc/x86_64-redhat-linux/11/libatomic.a','/usr/lib/gcc/x86_64-redhat-linux/12/libatomic.a','/usr/lib/gcc/x86_64-redhat-linux/13/libatomic.a','/usr/lib/gcc/x86_64-redhat-linux/14/libatomic.a')
19 // Gentoo:
20 #flag $when_first_existing('/usr/lib/gcc/x86_64-pc-linux-gnu/6/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-gnu/7/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-gnu/8/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-gnu/9/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-gnu/10/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-gnu/11/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-gnu/12/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-gnu/13/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-gnu/14/libatomic.a')
21 // OpenSUSE:
22 #flag $when_first_existing('/usr/lib64/gcc/x86_64-suse-linux/6/libatomic.a','/usr/lib64/gcc/x86_64-suse-linux/7/libatomic.a','/usr/lib64/gcc/x86_64-suse-linux/8/libatomic.a','/usr/lib64/gcc/x86_64-suse-linux/9/libatomic.a','/usr/lib64/gcc/x86_64-suse-linux/10/libatomic.a','/usr/lib64/gcc/x86_64-suse-linux/11/libatomic.a','/usr/lib64/gcc/x86_64-suse-linux/12/libatomic.a','/usr/lib64/gcc/x86_64-suse-linux/13/libatomic.a','/usr/lib64/gcc/x86_64-suse-linux/14/libatomic.a')
23 // ALT Linux:
24 #flag $when_first_existing('/usr/lib64/gcc/x86_64-alt-linux/6/libatomic.a','/usr/lib64/gcc/x86_64-alt-linux/7/libatomic.a','/usr/lib64/gcc/x86_64-alt-linux/8/libatomic.a','/usr/lib64/gcc/x86_64-alt-linux/9/libatomic.a','/usr/lib64/gcc/x86_64-alt-linux/10/libatomic.a','/usr/lib64/gcc/x86_64-alt-linux/11/libatomic.a','/usr/lib64/gcc/x86_64-alt-linux/12/libatomic.a','/usr/lib64/gcc/x86_64-alt-linux/13/libatomic.a','/usr/lib64/gcc/x86_64-alt-linux/14/libatomic.a')
25 $if musl ? {
26 // Alpine:
27 #flag $when_first_existing('/usr/lib/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-musl/6/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-musl/7/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-musl/8/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-musl/9/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-musl/10/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-musl/11/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-musl/12/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-musl/13/libatomic.a','/usr/lib/gcc/x86_64-pc-linux-musl/14/libatomic.a')
28 #flag @VEXEROOT/thirdparty/stdatomic/nix/atomic.S
29 }
30 } $else $if arm64 {
31 // Note: Use `.so` instead of `.a`.
32 // This is because `libatomic.a` atomic symbols, such as `__atomic_fetch_add_4`, are indirect(IFUNC) symbols:
33 // This can not be handled correctly by `tcc` right now.
34
35 // Symbol table '.symtab' contains 14 entries:
36 // Num: Value Size Type Bind Vis Ndx Name
37 // 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
38 // 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1
39 // 2: 0000000000000000 0 NOTYPE LOCAL DEFAULT 1 $x
40 // 3: 0000000000000030 12 FUNC LOCAL DEFAULT 1 select_fetch_add_4
41 // 4: 0000000000000040 12 FUNC LOCAL DEFAULT 1 select_add_fetch_4
42 // 5: 0000000000000014 0 NOTYPE LOCAL DEFAULT 6 $d
43 // 6: 0000000000000000 0 SECTION LOCAL DEFAULT 3
44 // 7: 0000000000000000 0 SECTION LOCAL DEFAULT 4
45 // 8: 0000000000000000 0 SECTION LOCAL DEFAULT 5
46 // 9: 0000000000000000 0 SECTION LOCAL DEFAULT 6
47 // 10: 0000000000000000 24 FUNC GLOBAL HIDDEN 1 libat_fetch_add_4
48 // 11: 0000000000000018 24 FUNC GLOBAL HIDDEN 1 libat_add_fetch_4
49 // 12: 0000000000000030 12 IFUNC GLOBAL DEFAULT 1 __atomic_fetch_add_4
50 // 13: 0000000000000040 12 IFUNC GLOBAL DEFAULT 1 __atomic_add_fetch_4
51
52 // Debian/Ubuntu:
53 #flag $when_first_existing('/usr/lib/gcc/aarch64-linux-gnu/6/libatomic.so','/usr/lib/gcc/aarch64-linux-gnu/7/libatomic.so','/usr/lib/gcc/aarch64-linux-gnu/8/libatomic.so','/usr/lib/gcc/aarch64-linux-gnu/9/libatomic.so','/usr/lib/gcc/aarch64-linux-gnu/10/libatomic.so','/usr/lib/gcc/aarch64-linux-gnu/11/libatomic.so','/usr/lib/gcc/aarch64-linux-gnu/12/libatomic.so','/usr/lib/gcc/aarch64-linux-gnu/13/libatomic.so','/usr/lib/gcc/aarch64-linux-gnu/14/libatomic.so')
54 // Redhat/CentOS:
55 #flag $when_first_existing('/usr/lib/gcc/aarch64-redhat-linux/6/libatomic.so','/usr/lib/gcc/aarch64-redhat-linux/7/libatomic.so','/usr/lib/gcc/aarch64-redhat-linux/8/libatomic.so','/usr/lib/gcc/aarch64-redhat-linux/9/libatomic.so','/usr/lib/gcc/aarch64-redhat-linux/10/libatomic.so','/usr/lib/gcc/aarch64-redhat-linux/11/libatomic.so','/usr/lib/gcc/aarch64-redhat-linux/12/libatomic.so','/usr/lib/gcc/aarch64-redhat-linux/13/libatomic.so','/usr/lib/gcc/aarch64-redhat-linux/14/libatomic.so')
56 // Gentoo:
57 #flag $when_first_existing('/usr/lib/gcc/aarch64-pc-linux-gnu/6/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-gnu/7/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-gnu/8/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-gnu/9/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-gnu/10/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-gnu/11/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-gnu/12/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-gnu/13/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-gnu/14/libatomic.so')
58 // OpenSUSE:
59 #flag $when_first_existing('/usr/lib64/gcc/aarch64-suse-linux/6/libatomic.so','/usr/lib64/gcc/aarch64-suse-linux/7/libatomic.so','/usr/lib64/gcc/aarch64-suse-linux/8/libatomic.so','/usr/lib64/gcc/aarch64-suse-linux/9/libatomic.so','/usr/lib64/gcc/aarch64-suse-linux/10/libatomic.so','/usr/lib64/gcc/aarch64-suse-linux/11/libatomic.so','/usr/lib64/gcc/aarch64-suse-linux/12/libatomic.so','/usr/lib64/gcc/aarch64-suse-linux/13/libatomic.so','/usr/lib64/gcc/aarch64-suse-linux/14/libatomic.so')
60 // ALT Linux:
61 #flag $when_first_existing('/usr/lib64/gcc/aarch64-alt-linux/6/libatomic.so','/usr/lib64/gcc/aarch64-alt-linux/7/libatomic.so','/usr/lib64/gcc/aarch64-alt-linux/8/libatomic.so','/usr/lib64/gcc/aarch64-alt-linux/9/libatomic.so','/usr/lib64/gcc/aarch64-alt-linux/10/libatomic.so','/usr/lib64/gcc/aarch64-alt-linux/11/libatomic.so','/usr/lib64/gcc/aarch64-alt-linux/12/libatomic.so','/usr/lib64/gcc/aarch64-alt-linux/13/libatomic.so','/usr/lib64/gcc/aarch64-alt-linux/14/libatomic.so')
62 $if musl ? {
63 // Alpine:
64 #flag $when_first_existing('/usr/lib/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-musl/6/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-musl/7/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-musl/8/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-musl/9/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-musl/10/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-musl/11/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-musl/12/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-musl/13/libatomic.so','/usr/lib/gcc/aarch64-pc-linux-musl/14/libatomic.so')
65 }
66 }
67 }
68}
69
70// The following functions are actually generic in C
71fn C.atomic_load_ptr(voidptr) voidptr
72fn C.atomic_store_ptr(voidptr, voidptr)
73fn C.atomic_compare_exchange_weak_ptr(voidptr, voidptr, isize) bool
74fn C.atomic_compare_exchange_strong_ptr(voidptr, voidptr, isize) bool
75fn C.atomic_exchange_ptr(voidptr, voidptr) voidptr
76fn C.atomic_fetch_add_ptr(voidptr, voidptr) voidptr
77fn C.atomic_fetch_sub_ptr(voidptr, voidptr) voidptr
78
79fn C.atomic_load_byte(voidptr) u8
80fn C.atomic_store_byte(voidptr, u8)
81fn C.atomic_compare_exchange_weak_byte(voidptr, voidptr, u8) bool
82fn C.atomic_compare_exchange_strong_byte(voidptr, voidptr, u8) bool
83fn C.atomic_exchange_byte(voidptr, u8) u8
84fn C.atomic_fetch_add_byte(voidptr, u8) u8
85fn C.atomic_fetch_sub_byte(voidptr, u8) u8
86
87fn C.atomic_load_u16(voidptr) u16
88fn C.atomic_store_u16(voidptr, u16)
89fn C.atomic_compare_exchange_weak_u16(voidptr, voidptr, u16) bool
90fn C.atomic_compare_exchange_strong_u16(voidptr, voidptr, u16) bool
91fn C.atomic_exchange_u16(voidptr, u16) u16
92fn C.atomic_fetch_add_u16(voidptr, u16) u16
93fn C.atomic_fetch_sub_u16(voidptr, u16) u16
94
95fn C.atomic_load_u32(voidptr) u32
96fn C.atomic_store_u32(voidptr, u32)
97fn C.atomic_compare_exchange_weak_u32(voidptr, voidptr, u32) bool
98fn C.atomic_compare_exchange_strong_u32(voidptr, voidptr, u32) bool
99fn C.atomic_exchange_u32(voidptr, u32) u32
100fn C.atomic_fetch_add_u32(voidptr, u32) u32
101fn C.atomic_fetch_sub_u32(voidptr, u32) u32
102
103fn C.atomic_load_u64(voidptr) u64
104fn C.atomic_store_u64(voidptr, u64)
105fn C.atomic_compare_exchange_weak_u64(voidptr, voidptr, u64) bool
106fn C.atomic_compare_exchange_strong_u64(voidptr, voidptr, u64) bool
107fn C.atomic_exchange_u64(voidptr, u64) u64
108fn C.atomic_fetch_add_u64(voidptr, u64) u64
109fn C.atomic_fetch_sub_u64(voidptr, u64) u64
110
111fn C.atomic_thread_fence(i32)
112fn C.cpu_relax()
113
114pub const C.memory_order_relaxed i32
115pub const C.memory_order_acquire i32
116pub const C.memory_order_release i32
117
118fn C.ANNOTATE_RWLOCK_CREATE(voidptr)
119fn C.ANNOTATE_RWLOCK_ACQUIRED(voidptr, i32)
120fn C.ANNOTATE_RWLOCK_RELEASED(voidptr, i32)
121fn C.ANNOTATE_RWLOCK_DESTROY(voidptr)
122
123$if valgrind ? {
124 #flag -I/usr/include/valgrind
125 #include <valgrind/helgrind.h>
126}
127