Skip to content

Commit 51bfeff

Browse files
authored
[tsan][go]: add atomic or/and functions (#65695)
These atomic primitives are required in order to implement the race variants of the new And and Or operators in Go's sync/atomic package. See Github issue golang/go#61395.
1 parent 8b02ceb commit 51bfeff

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

compiler-rt/lib/tsan/rtl/tsan_interface.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,14 @@ void __tsan_go_atomic32_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
419419
SANITIZER_INTERFACE_ATTRIBUTE
420420
void __tsan_go_atomic64_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
421421
SANITIZER_INTERFACE_ATTRIBUTE
422+
void __tsan_go_atomic32_fetch_and(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
423+
SANITIZER_INTERFACE_ATTRIBUTE
424+
void __tsan_go_atomic64_fetch_and(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
425+
SANITIZER_INTERFACE_ATTRIBUTE
426+
void __tsan_go_atomic32_fetch_or(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
427+
SANITIZER_INTERFACE_ATTRIBUTE
428+
void __tsan_go_atomic64_fetch_or(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
429+
SANITIZER_INTERFACE_ATTRIBUTE
422430
void __tsan_go_atomic32_exchange(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
423431
SANITIZER_INTERFACE_ATTRIBUTE
424432
void __tsan_go_atomic64_exchange(ThreadState *thr, uptr cpc, uptr pc, u8 *a);

compiler-rt/lib/tsan/rtl/tsan_interface_atomic.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,30 @@ void __tsan_go_atomic64_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
894894
ATOMIC_RET(FetchAdd, *(a64*)(a+16), *(a64**)a, *(a64*)(a+8), mo_acq_rel);
895895
}
896896

897+
SANITIZER_INTERFACE_ATTRIBUTE
898+
void __tsan_go_atomic32_fetch_and(ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
899+
ATOMIC_RET(FetchAnd, *(a32 *)(a + 16), *(a32 **)a, *(a32 *)(a + 8),
900+
mo_acq_rel);
901+
}
902+
903+
SANITIZER_INTERFACE_ATTRIBUTE
904+
void __tsan_go_atomic64_fetch_and(ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
905+
ATOMIC_RET(FetchAnd, *(a64 *)(a + 16), *(a64 **)a, *(a64 *)(a + 8),
906+
mo_acq_rel);
907+
}
908+
909+
SANITIZER_INTERFACE_ATTRIBUTE
910+
void __tsan_go_atomic32_fetch_or(ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
911+
ATOMIC_RET(FetchOr, *(a32 *)(a + 16), *(a32 **)a, *(a32 *)(a + 8),
912+
mo_acq_rel);
913+
}
914+
915+
SANITIZER_INTERFACE_ATTRIBUTE
916+
void __tsan_go_atomic64_fetch_or(ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
917+
ATOMIC_RET(FetchOr, *(a64 *)(a + 16), *(a64 **)a, *(a64 *)(a + 8),
918+
mo_acq_rel);
919+
}
920+
897921
SANITIZER_INTERFACE_ATTRIBUTE
898922
void __tsan_go_atomic32_exchange(ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
899923
ATOMIC_RET(Exchange, *(a32*)(a+16), *(a32**)a, *(a32*)(a+8), mo_acq_rel);

0 commit comments

Comments
 (0)