diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2013-01-29 13:03:07 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2013-01-29 13:03:07 +0000 |
commit | b46930befad264c7bbbeb4bde95dd902dcc2d11b (patch) | |
tree | 464c79447622405e2eb7e40fa38e4682547bad30 | |
parent | 322d7fbd9d33f39978f5c80995ffc6bd26a3002b (diff) | |
download | bcm5719-llvm-b46930befad264c7bbbeb4bde95dd902dcc2d11b.tar.gz bcm5719-llvm-b46930befad264c7bbbeb4bde95dd902dcc2d11b.zip |
tsan: remember when we are inside of symbolizer code (required for inprocess symbolizer)
llvm-svn: 173796
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_rtl.h | 1 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_symbolize.cc | 17 |
2 files changed, 18 insertions, 0 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl.h b/compiler-rt/lib/tsan/rtl/tsan_rtl.h index 74cb8dfeec1..a0359a74b69 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl.h +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl.h @@ -326,6 +326,7 @@ struct ThreadState { const int tid; const int unique_id; int in_rtl; + bool in_symbolizer; bool is_alive; const uptr stk_addr; const uptr stk_size; diff --git a/compiler-rt/lib/tsan/rtl/tsan_symbolize.cc b/compiler-rt/lib/tsan/rtl/tsan_symbolize.cc index 2bea6ca7691..a58b9583d00 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_symbolize.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_symbolize.cc @@ -18,9 +18,24 @@ #include "sanitizer_common/sanitizer_symbolizer.h" #include "tsan_flags.h" #include "tsan_report.h" +#include "tsan_rtl.h" namespace __tsan { +struct ScopedInSymbolizer { + ScopedInSymbolizer() { + ThreadState *thr = cur_thread(); + CHECK(!thr->in_symbolizer); + thr->in_symbolizer = true; + } + + ~ScopedInSymbolizer() { + ThreadState *thr = cur_thread(); + CHECK(thr->in_symbolizer); + thr->in_symbolizer = false; + } +}; + ReportStack *NewReportStackEntry(uptr addr) { ReportStack *ent = (ReportStack*)internal_alloc(MBlockReportStack, sizeof(ReportStack)); @@ -57,6 +72,7 @@ static ReportStack *NewReportStackEntry(const AddressInfo &info) { ReportStack *SymbolizeCode(uptr addr) { if (!IsSymbolizerAvailable()) return SymbolizeCodeAddr2Line(addr); + ScopedInSymbolizer in_symbolizer; static const uptr kMaxAddrFrames = 16; InternalScopedBuffer<AddressInfo> addr_frames(kMaxAddrFrames); for (uptr i = 0; i < kMaxAddrFrames; i++) @@ -83,6 +99,7 @@ ReportStack *SymbolizeCode(uptr addr) { ReportLocation *SymbolizeData(uptr addr) { if (!IsSymbolizerAvailable()) return 0; + ScopedInSymbolizer in_symbolizer; DataInfo info; if (!__sanitizer::SymbolizeData(addr, &info)) return 0; |