summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2013-01-29 13:03:07 +0000
committerDmitry Vyukov <dvyukov@google.com>2013-01-29 13:03:07 +0000
commitb46930befad264c7bbbeb4bde95dd902dcc2d11b (patch)
tree464c79447622405e2eb7e40fa38e4682547bad30
parent322d7fbd9d33f39978f5c80995ffc6bd26a3002b (diff)
downloadbcm5719-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.h1
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_symbolize.cc17
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;
OpenPOWER on IntegriCloud