diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2012-12-18 06:57:34 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2012-12-18 06:57:34 +0000 |
commit | c2234cd922bbd94e276e0bebb08004d63cbc5cf2 (patch) | |
tree | dad2979768adf4b8d4d161b13b87683527731014 /lib/tsan/rtl/tsan_rtl_report.cc | |
parent | 25ee97fe8ada76755c8bd1087fac9cc3cd03b28c (diff) | |
download | compiler-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.cc | 24 |
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); |