[compiler-rt] r332048 - [tsan] Add debugging API to retrieve the "external tag" from reports
Kuba Mracek via llvm-commits
llvm-commits at lists.llvm.org
Thu May 10 14:46:00 PDT 2018
Author: kuba.brecka
Date: Thu May 10 14:46:00 2018
New Revision: 332048
URL: http://llvm.org/viewvc/llvm-project?rev=332048&view=rev
Log:
[tsan] Add debugging API to retrieve the "external tag" from reports
Differential Revision: https://reviews.llvm.org/D46661
Added:
compiler-rt/trunk/test/tsan/Darwin/external-swift-debugging.cc
Modified:
compiler-rt/trunk/lib/tsan/rtl/tsan_debugging.cc
compiler-rt/trunk/lib/tsan/rtl/tsan_interface.h
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_debugging.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_debugging.cc?rev=332048&r1=332047&r2=332048&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_debugging.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_debugging.cc Thu May 10 14:46:00 2018
@@ -83,6 +83,13 @@ int __tsan_get_report_data(void *report,
}
SANITIZER_INTERFACE_ATTRIBUTE
+int __tsan_get_report_tag(void *report, uptr *tag) {
+ const ReportDesc *rep = (ReportDesc *)report;
+ *tag = rep->tag;
+ return 1;
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
int __tsan_get_report_stack(void *report, uptr idx, void **trace,
uptr trace_size) {
const ReportDesc *rep = (ReportDesc *)report;
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interface.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interface.h?rev=332048&r1=332047&r2=332048&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_interface.h (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_interface.h Thu May 10 14:46:00 2018
@@ -117,6 +117,19 @@ int __tsan_get_report_data(void *report,
int *unique_tid_count, void **sleep_trace,
uptr trace_size);
+/// Retrieves the "tag" from a report (for external-race report types). External
+/// races can be associated with a tag which give them more meaning. For example
+/// tag value '1' means "Swift access race". Tag value '0' indicated a plain
+/// external race.
+///
+/// \param report opaque pointer to the current report (obtained as argument in
+/// __tsan_on_report, or from __tsan_get_current_report)
+/// \param [out] tag points to storage that will be filled with the tag value
+///
+/// \returns non-zero value on success, zero on failure
+SANITIZER_INTERFACE_ATTRIBUTE
+int __tsan_get_report_tag(void *report, uptr *tag);
+
// Returns information about stack traces included in the report.
SANITIZER_INTERFACE_ATTRIBUTE
int __tsan_get_report_stack(void *report, uptr idx, void **trace,
Added: compiler-rt/trunk/test/tsan/Darwin/external-swift-debugging.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/Darwin/external-swift-debugging.cc?rev=332048&view=auto
==============================================================================
--- compiler-rt/trunk/test/tsan/Darwin/external-swift-debugging.cc (added)
+++ compiler-rt/trunk/test/tsan/Darwin/external-swift-debugging.cc Thu May 10 14:46:00 2018
@@ -0,0 +1,68 @@
+// RUN: %clangxx_tsan %s -o %t
+// RUN: %deflake %run %t 2>&1 | FileCheck %s
+
+#include <thread>
+
+#import "../test.h"
+
+
+extern "C" {
+int __tsan_get_report_data(void *report, const char **description, int *count,
+ int *stack_count, int *mop_count, int *loc_count,
+ int *mutex_count, int *thread_count,
+ int *unique_tid_count, void **sleep_trace,
+ unsigned long trace_size);
+int __tsan_get_report_tag(void *report, unsigned long *tag);
+}
+
+__attribute__((no_sanitize("thread"), noinline))
+void ExternalWrite(void *addr) {
+ void *kSwiftAccessRaceTag = (void *)0x1;
+ __tsan_external_write(addr, nullptr, kSwiftAccessRaceTag);
+}
+
+int main(int argc, char *argv[]) {
+ barrier_init(&barrier, 2);
+ fprintf(stderr, "Start.\n");
+ // CHECK: Start.
+
+ void *opaque_object = malloc(16);
+ std::thread t1([opaque_object] {
+ ExternalWrite(opaque_object);
+ barrier_wait(&barrier);
+ });
+ std::thread t2([opaque_object] {
+ barrier_wait(&barrier);
+ ExternalWrite(opaque_object);
+ });
+ // CHECK: WARNING: ThreadSanitizer: Swift access race
+ // CHECK: Modifying access of Swift variable at {{.*}} by thread {{.*}}
+ // CHECK: Previous modifying access of Swift variable at {{.*}} by thread {{.*}}
+ // CHECK: SUMMARY: ThreadSanitizer: Swift access race
+ t1.join();
+ t2.join();
+
+ fprintf(stderr, "Done.\n");
+}
+
+extern "C"
+void __tsan_on_report(void *report) {
+ const char *description;
+ int count;
+ int stack_count, mop_count, loc_count, mutex_count, thread_count,
+ unique_tid_count;
+ void *sleep_trace[16] = {0};
+ __tsan_get_report_data(report, &description, &count, &stack_count, &mop_count,
+ &loc_count, &mutex_count, &thread_count,
+ &unique_tid_count, sleep_trace, 16);
+ fprintf(stderr, "report type = '%s', count = %d\n", description, count);
+ // CHECK: report type = 'external-race', count = 0
+
+ unsigned long tag;
+ __tsan_get_report_tag(report, &tag);
+ fprintf(stderr, "tag = %ld\n", tag);
+ // CHECK: tag = 1
+}
+
+// CHECK: Done.
+// CHECK: ThreadSanitizer: reported 1 warnings
More information about the llvm-commits
mailing list