[msan] Block reports from interceptors during _Unwind_Backtrace

Summary:
I'm hitting a big recursive report from:
  uninit on strlen ->
  __msan::PrintWarningWithOrigin() ->
  __msan::GetStackTrace() ->
  __sanitizer::StackTrace::SlowUnwindStack() ->
  _Unwind_Backtrace() ->
  ... libgcc calls ->
  uninit on strlen() ->
  ... repeats

Reviewers: eugenis

Differential Revision: http://llvm-reviews.chandlerc.com/D497

git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@176555 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/msan/msan.cc b/lib/msan/msan.cc
index ba27234..cfa0741 100644
--- a/lib/msan/msan.cc
+++ b/lib/msan/msan.cc
@@ -153,8 +153,11 @@
 
 void GetStackTrace(StackTrace *stack, uptr max_s, uptr pc, uptr bp,
                    bool fast) {
-  if (!fast)
+  if (!fast) {
+    // Block reports from our interceptors during _Unwind_Backtrace.
+    SymbolizerScope sym_scope;
     return stack->SlowUnwindStack(pc, max_s);
+  }
 
   uptr stack_top, stack_bottom;
   GetCurrentStackBounds(&stack_top, &stack_bottom);
diff --git a/lib/msan/msan.h b/lib/msan/msan.h
index 2150c83..fae1ad5 100644
--- a/lib/msan/msan.h
+++ b/lib/msan/msan.h
@@ -50,6 +50,11 @@
 void ExitSymbolizer();
 bool IsInSymbolizer();
 
+struct SymbolizerScope {
+  SymbolizerScope() { EnterSymbolizer(); }
+  ~SymbolizerScope() { ExitSymbolizer(); }
+};
+
 void MsanDie();
 void PrintWarning(uptr pc, uptr bp);
 void PrintWarningWithOrigin(uptr pc, uptr bp, u32 origin);
diff --git a/lib/msan/msan_report.cc b/lib/msan/msan_report.cc
index 16b13f6..df6990f 100644
--- a/lib/msan/msan_report.cc
+++ b/lib/msan/msan_report.cc
@@ -44,11 +44,6 @@
   const char *End()    { return Default(); }
 };
 
-struct SymbolizerScope {
-  SymbolizerScope() { EnterSymbolizer(); }
-  ~SymbolizerScope() { ExitSymbolizer(); }
-};
-
 static void PrintStack(const uptr *trace, uptr size) {
   SymbolizerScope sym_scope;
   StackTrace::PrintStack(trace, size, true, flags()->strip_path_prefix, 0);