aboutsummaryrefslogtreecommitdiff
path: root/lib/tsan/tsan_interface_ann.cpp
diff options
context:
space:
mode:
authorAlex Rønne Petersen <alex@alexrp.com>2024-09-24 13:47:29 +0200
committerAndrew Kelley <andrew@ziglang.org>2024-09-24 23:58:21 -0700
commita40cdad18c06fd377622c47aa34564df7ea959b5 (patch)
treedbcfabc2191cdbf2acc6c356c5ea25237b29d8f1 /lib/tsan/tsan_interface_ann.cpp
parent7f6b7c56089eaa5b147e71b3d98328498c9025c8 (diff)
downloadzig-a40cdad18c06fd377622c47aa34564df7ea959b5.tar.gz
zig-a40cdad18c06fd377622c47aa34564df7ea959b5.zip
tsan: Update to LLVM 19.1.0.
Diffstat (limited to 'lib/tsan/tsan_interface_ann.cpp')
-rw-r--r--lib/tsan/tsan_interface_ann.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/lib/tsan/tsan_interface_ann.cpp b/lib/tsan/tsan_interface_ann.cpp
index 6bd72e18d9..befd6a3690 100644
--- a/lib/tsan/tsan_interface_ann.cpp
+++ b/lib/tsan/tsan_interface_ann.cpp
@@ -76,7 +76,7 @@ struct DynamicAnnContext {
};
static DynamicAnnContext *dyn_ann_ctx;
-static char dyn_ann_ctx_placeholder[sizeof(DynamicAnnContext)] ALIGNED(64);
+alignas(64) static char dyn_ann_ctx_placeholder[sizeof(DynamicAnnContext)];
static void AddExpectRace(ExpectRace *list,
char *f, int l, uptr addr, uptr size, char *desc) {
@@ -435,4 +435,26 @@ void __tsan_mutex_post_divert(void *addr, unsigned flagz) {
ThreadIgnoreBegin(thr, 0);
ThreadIgnoreSyncBegin(thr, 0);
}
+
+static void ReportMutexHeldWrongContext(ThreadState *thr, uptr pc) {
+ ThreadRegistryLock l(&ctx->thread_registry);
+ ScopedReport rep(ReportTypeMutexHeldWrongContext);
+ for (uptr i = 0; i < thr->mset.Size(); ++i) {
+ MutexSet::Desc desc = thr->mset.Get(i);
+ rep.AddMutex(desc.addr, desc.stack_id);
+ }
+ VarSizeStackTrace trace;
+ ObtainCurrentStack(thr, pc, &trace);
+ rep.AddStack(trace, true);
+ OutputReport(thr, rep);
+}
+
+INTERFACE_ATTRIBUTE
+void __tsan_check_no_mutexes_held() {
+ SCOPED_ANNOTATION(__tsan_check_no_mutexes_held);
+ if (thr->mset.Size() == 0) {
+ return;
+ }
+ ReportMutexHeldWrongContext(thr, pc);
+}
} // extern "C"