summaryrefslogtreecommitdiff
path: root/lib/tsan/rtl/tsan_rtl_report.cc
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2012-12-18 06:57:34 +0000
committerDmitry Vyukov <dvyukov@google.com>2012-12-18 06:57:34 +0000
commitc2234cd922bbd94e276e0bebb08004d63cbc5cf2 (patch)
treedad2979768adf4b8d4d161b13b87683527731014 /lib/tsan/rtl/tsan_rtl_report.cc
parent25ee97fe8ada76755c8bd1087fac9cc3cd03b28c (diff)
downloadcompiler-rt-c2234cd922bbd94e276e0bebb08004d63cbc5cf2.tar.gz
compiler-rt-c2234cd922bbd94e276e0bebb08004d63cbc5cf2.tar.bz2
compiler-rt-c2234cd922bbd94e276e0bebb08004d63cbc5cf2.tar.xz
tsan: describe "file descriptor" location
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@170417 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/tsan/rtl/tsan_rtl_report.cc')
-rw-r--r--lib/tsan/rtl/tsan_rtl_report.cc24
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/tsan/rtl/tsan_rtl_report.cc b/lib/tsan/rtl/tsan_rtl_report.cc
index b1556d89..23e4ae5b 100644
--- a/lib/tsan/rtl/tsan_rtl_report.cc
+++ b/lib/tsan/rtl/tsan_rtl_report.cc
@@ -23,6 +23,7 @@
#include "tsan_sync.h"
#include "tsan_mman.h"
#include "tsan_flags.h"
+#include "tsan_fd.h"
namespace __tsan {
@@ -227,6 +228,29 @@ void ScopedReport::AddLocation(uptr addr, uptr size) {
if (addr == 0)
return;
#ifndef TSAN_GO
+ int fd = -1;
+ int creat_tid = -1;
+ u32 creat_stack = 0;
+ if (FdLocation(addr, &fd, &creat_tid, &creat_stack)
+ || FdLocation(AlternativeAddress(addr), &fd, &creat_tid, &creat_stack)) {
+ void *mem = internal_alloc(MBlockReportLoc, sizeof(ReportLocation));
+ ReportLocation *loc = new(mem) ReportLocation();
+ rep_->locs.PushBack(loc);
+ loc->type = ReportLocationFD;
+ loc->fd = fd;
+ loc->tid = creat_tid;
+ uptr ssz = 0;
+ const uptr *stack = StackDepotGet(creat_stack, &ssz);
+ if (stack) {
+ StackTrace trace;
+ trace.Init(stack, ssz);
+ loc->stack = SymbolizeStack(trace);
+ }
+ ThreadContext *tctx = FindThread(creat_tid);
+ if (tctx)
+ AddThread(tctx);
+ return;
+ }
if (allocator()->PointerIsMine((void*)addr)) {
MBlock *b = user_mblock(0, (void*)addr);
ThreadContext *tctx = FindThread(b->alloc_tid);