diff options
author | Ben Gamari <ben@smart-cactus.org> | 2022-11-04 20:37:31 -0400 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-12-15 03:54:02 -0500 |
commit | 28c6781a3215a36d61126818c3e64c99c2344350 (patch) | |
tree | 9c1122799e470b93667d2e8f8202b89d33edcb6d /rts | |
parent | 748490d2ff51d6c6fa44aad587908b271c801fa9 (diff) | |
download | haskell-28c6781a3215a36d61126818c3e64c99c2344350.tar.gz |
codeGen: Introduce ThreadSanitizer instrumentation
This introduces a new Cmm pass which instruments the program with
ThreadSanitizer annotations, allowing full tracking of mutator memory
accesses via TSAN.
Diffstat (limited to 'rts')
-rw-r--r-- | rts/TSANUtils.c | 37 | ||||
-rw-r--r-- | rts/include/rts/TSANUtils.h | 7 | ||||
-rw-r--r-- | rts/rts.cabal.in | 1 |
3 files changed, 45 insertions, 0 deletions
diff --git a/rts/TSANUtils.c b/rts/TSANUtils.c new file mode 100644 index 0000000000..790381acdb --- /dev/null +++ b/rts/TSANUtils.c @@ -0,0 +1,37 @@ +#include <Rts.h> + +#if defined(TSAN_ENABLED) + +uint64_t ghc_tsan_atomic64_compare_exchange(uint64_t *ptr, uint64_t expected, uint64_t new_value, int success_memorder, int failure_memorder) +{ + __tsan_atomic64_compare_exchange_strong( + ptr, &expected, new_value, + success_memorder, failure_memorder); + return expected; +} + +uint32_t ghc_tsan_atomic32_compare_exchange(uint32_t *ptr, uint32_t expected, uint32_t new_value, int success_memorder, int failure_memorder) +{ + __tsan_atomic32_compare_exchange_strong( + ptr, &expected, new_value, + success_memorder, failure_memorder); + return expected; +} + +uint16_t ghc_tsan_atomic16_compare_exchange(uint16_t *ptr, uint16_t expected, uint16_t new_value, int success_memorder, int failure_memorder) +{ + __tsan_atomic16_compare_exchange_strong( + ptr, &expected, new_value, + success_memorder, failure_memorder); + return expected; +} + +uint8_t ghc_tsan_atomic8_compare_exchange(uint8_t *ptr, uint8_t expected, uint8_t new_value, int success_memorder, int failure_memorder) +{ + __tsan_atomic8_compare_exchange_strong( + ptr, &expected, new_value, + success_memorder, failure_memorder); + return expected; +} + +#endif diff --git a/rts/include/rts/TSANUtils.h b/rts/include/rts/TSANUtils.h index ddcf108041..da2240085e 100644 --- a/rts/include/rts/TSANUtils.h +++ b/rts/include/rts/TSANUtils.h @@ -65,3 +65,10 @@ void AnnotateBenignRaceSized(const char *file, #define TSAN_ANNOTATE_BENIGN_RACE(addr,desc) \ TSAN_ANNOTATE_BENIGN_RACE_SIZED((void*)(addr), sizeof(*addr), desc) + + +uint64_t ghc_tsan_atomic64_compare_exchange(uint64_t *ptr, uint64_t expected, uint64_t new_value, int success_memorder, int failure_memorder); +uint32_t ghc_tsan_atomic32_compare_exchange(uint32_t *ptr, uint32_t expected, uint32_t new_value, int success_memorder, int failure_memorder); +uint16_t ghc_tsan_atomic16_compare_exchange(uint16_t *ptr, uint16_t expected, uint16_t new_value, int success_memorder, int failure_memorder); +uint8_t ghc_tsan_atomic8_compare_exchange(uint8_t *ptr, uint8_t expected, uint8_t new_value, int success_memorder, int failure_memorder); + diff --git a/rts/rts.cabal.in b/rts/rts.cabal.in index e4a78a64cf..d10ee390e4 100644 --- a/rts/rts.cabal.in +++ b/rts/rts.cabal.in @@ -588,6 +588,7 @@ library Trace.c TraverseHeap.c TraverseHeapTest.c + TSANUtils.c WSDeque.c Weak.c eventlog/EventLog.c |