summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2022-11-04 20:37:31 -0400
committerMarge Bot <ben+marge-bot@smart-cactus.org>2022-12-15 03:54:02 -0500
commit28c6781a3215a36d61126818c3e64c99c2344350 (patch)
tree9c1122799e470b93667d2e8f8202b89d33edcb6d /rts
parent748490d2ff51d6c6fa44aad587908b271c801fa9 (diff)
downloadhaskell-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.c37
-rw-r--r--rts/include/rts/TSANUtils.h7
-rw-r--r--rts/rts.cabal.in1
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