[compiler-rt] r355039 - [NFC][Sanitizer] Pull up GetStackTrace into sanitizer_common

Vlad Tsyrklevich via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 28 09:16:01 PST 2019


Julian, the sanitizer-windows bot (an MSVC build) is broken after this
change, please a take a look:
http://lab.llvm.org:8011/builders/sanitizer-windows/builds/42653/steps/stage%201%20build/logs/stdio

On Thu, Feb 28, 2019 at 1:40 AM Julian Lettner via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: yln
> Date: Wed Feb 27 14:16:02 2019
> New Revision: 355039
>
> URL: http://llvm.org/viewvc/llvm-project?rev=355039&view=rev
> Log:
> [NFC][Sanitizer] Pull up GetStackTrace into sanitizer_common
>
> We already independently declare GetStackTrace in all (except TSan)
> sanitizer runtime headers. Lets move it to sanitizer_stacktrace.h to
> have one canonical way to fill in a BufferedStackFrame. Also enables us
> to use it in sanitizer_common itself.
>
> This patch defines GetStackTrace for TSan and moves the function from
> ubsan_diag.cc to ubsan_diag_standalone.cc to avoid duplicate symbols
> for the UBSan-ASan runtime.
>
> Other than that this patch just moves the code out of headers and into
> the correct namespace.
>
> Reviewers: vitalybuka
>
> Differential Revision: https://reviews.llvm.org/D58651
>
> Modified:
>     compiler-rt/trunk/lib/asan/asan_stack.cc
>     compiler-rt/trunk/lib/asan/asan_stack.h
>     compiler-rt/trunk/lib/hwasan/hwasan.cpp
>     compiler-rt/trunk/lib/hwasan/hwasan.h
>     compiler-rt/trunk/lib/lsan/lsan.cc
>     compiler-rt/trunk/lib/lsan/lsan.h
>     compiler-rt/trunk/lib/msan/msan.cc
>     compiler-rt/trunk/lib/msan/msan.h
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.h
>     compiler-rt/trunk/lib/tsan/rtl/tsan_stack_trace.cc
>     compiler-rt/trunk/lib/ubsan/ubsan_diag.cc
>     compiler-rt/trunk/lib/ubsan/ubsan_diag.h
>     compiler-rt/trunk/lib/ubsan/ubsan_diag_standalone.cc
>
> Modified: compiler-rt/trunk/lib/asan/asan_stack.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_stack.cc?rev=355039&r1=355038&r2=355039&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_stack.cc (original)
> +++ compiler-rt/trunk/lib/asan/asan_stack.cc Wed Feb 27 14:16:02 2019
> @@ -28,6 +28,34 @@ u32 GetMallocContextSize() {
>
>  }  // namespace __asan
>
> +void __sanitizer::GetStackTrace(BufferedStackTrace *stack, uptr max_depth,
> +                                uptr pc, uptr bp, void *context, bool
> fast) {
> +  using namespace __asan;
> +#if SANITIZER_WINDOWS
> +  stack->Unwind(max_depth, pc, 0, context, 0, 0, false);
> +#else
> +  AsanThread *t;
> +  stack->size = 0;
> +  if (LIKELY(asan_inited)) {
> +    if ((t = GetCurrentThread()) && !t->isUnwinding()) {
> +      uptr stack_top = t->stack_top();
> +      uptr stack_bottom = t->stack_bottom();
> +      ScopedUnwinding unwind_scope(t);
> +      if (!SANITIZER_MIPS || IsValidFrame(bp, stack_top, stack_bottom)) {
> +        if (StackTrace::WillUseFastUnwind(fast))
> +          stack->Unwind(max_depth, pc, bp, nullptr, stack_top,
> stack_bottom,
> +                      true);
> +        else
> +          stack->Unwind(max_depth, pc, 0, context, 0, 0, false);
> +      }
> +    } else if (!t && !fast) {
> +      /* If GetCurrentThread() has failed, try to do slow unwind anyways.
> */
> +      stack->Unwind(max_depth, pc, bp, context, 0, 0, false);
> +    }
> +  }
> +#endif // SANITIZER_WINDOWS
> +}
> +
>  // ------------------ Interface -------------- {{{1
>
>  extern "C" {
>
> Modified: compiler-rt/trunk/lib/asan/asan_stack.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_stack.h?rev=355039&r1=355038&r2=355039&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_stack.h (original)
> +++ compiler-rt/trunk/lib/asan/asan_stack.h Wed Feb 27 14:16:02 2019
> @@ -26,37 +26,6 @@ static const u32 kDefaultMallocContextSi
>  void SetMallocContextSize(u32 size);
>  u32 GetMallocContextSize();
>
> -// Get the stack trace with the given pc and bp.
> -// The pc will be in the position 0 of the resulting stack trace.
> -// The bp may refer to the current frame or to the caller's frame.
> -ALWAYS_INLINE
> -void GetStackTrace(BufferedStackTrace *stack, uptr max_depth, uptr pc,
> uptr bp,
> -                   void *context, bool fast) {
> -#if SANITIZER_WINDOWS
> -  stack->Unwind(max_depth, pc, 0, context, 0, 0, false);
> -#else
> -  AsanThread *t;
> -  stack->size = 0;
> -  if (LIKELY(asan_inited)) {
> -    if ((t = GetCurrentThread()) && !t->isUnwinding()) {
> -      uptr stack_top = t->stack_top();
> -      uptr stack_bottom = t->stack_bottom();
> -      ScopedUnwinding unwind_scope(t);
> -      if (!SANITIZER_MIPS || IsValidFrame(bp, stack_top, stack_bottom)) {
> -        if (StackTrace::WillUseFastUnwind(fast))
> -          stack->Unwind(max_depth, pc, bp, nullptr, stack_top,
> stack_bottom,
> -                      true);
> -        else
> -          stack->Unwind(max_depth, pc, 0, context, 0, 0, false);
> -      }
> -    } else if (!t && !fast) {
> -      /* If GetCurrentThread() has failed, try to do slow unwind anyways.
> */
> -      stack->Unwind(max_depth, pc, bp, context, 0, 0, false);
> -    }
> -  }
> -#endif // SANITIZER_WINDOWS
> -}
> -
>  } // namespace __asan
>
>  // NOTE: A Rule of thumb is to retrieve stack trace in the interceptors
>
> Modified: compiler-rt/trunk/lib/hwasan/hwasan.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan.cpp?rev=355039&r1=355038&r2=355039&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/hwasan/hwasan.cpp (original)
> +++ compiler-rt/trunk/lib/hwasan/hwasan.cpp Wed Feb 27 14:16:02 2019
> @@ -144,26 +144,6 @@ static void InitializeFlags() {
>    if (common_flags()->help) parser.PrintFlagDescriptions();
>  }
>
> -void GetStackTrace(BufferedStackTrace *stack, uptr max_s, uptr pc, uptr
> bp,
> -                   void *context, bool request_fast_unwind) {
> -  Thread *t = GetCurrentThread();
> -  if (!t) {
> -    // the thread is still being created.
> -    stack->size = 0;
> -    return;
> -  }
> -  if (!StackTrace::WillUseFastUnwind(request_fast_unwind)) {
> -    // Block reports from our interceptors during _Unwind_Backtrace.
> -    SymbolizerScope sym_scope;
> -    return stack->Unwind(max_s, pc, bp, context, 0, 0,
> request_fast_unwind);
> -  }
> -  if (StackTrace::WillUseFastUnwind(request_fast_unwind))
> -    stack->Unwind(max_s, pc, bp, nullptr, t->stack_top(),
> t->stack_bottom(),
> -                  true);
> -  else
> -    stack->Unwind(max_s, pc, 0, context, 0, 0, false);
> -}
> -
>  static void HWAsanCheckFailed(const char *file, int line, const char
> *cond,
>                                u64 v1, u64 v2) {
>    Report("HWAddressSanitizer CHECK failed: %s:%d \"%s\" (0x%zx,
> 0x%zx)\n", file,
> @@ -264,6 +244,28 @@ void InitInstrumentation() {
>
>  } // namespace __hwasan
>
> +void __sanitizer::GetStackTrace(BufferedStackTrace *stack, uptr max_s,
> uptr pc,
> +                                uptr bp, void *context,
> +                                bool request_fast_unwind) {
> +  using namespace __hwasan;
> +  Thread *t = GetCurrentThread();
> +  if (!t) {
> +    // the thread is still being created.
> +    stack->size = 0;
> +    return;
> +  }
> +  if (!StackTrace::WillUseFastUnwind(request_fast_unwind)) {
> +    // Block reports from our interceptors during _Unwind_Backtrace.
> +    SymbolizerScope sym_scope;
> +    return stack->Unwind(max_s, pc, bp, context, 0, 0,
> request_fast_unwind);
> +  }
> +  if (StackTrace::WillUseFastUnwind(request_fast_unwind))
> +    stack->Unwind(max_s, pc, bp, nullptr, t->stack_top(),
> t->stack_bottom(),
> +                  true);
> +  else
> +    stack->Unwind(max_s, pc, 0, context, 0, 0, false);
> +}
> +
>  // Interface.
>
>  using namespace __hwasan;
>
> Modified: compiler-rt/trunk/lib/hwasan/hwasan.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan.h?rev=355039&r1=355038&r2=355039&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/hwasan/hwasan.h (original)
> +++ compiler-rt/trunk/lib/hwasan/hwasan.h Wed Feb 27 14:16:02 2019
> @@ -104,9 +104,6 @@ struct SymbolizerScope {
>    ~SymbolizerScope() { ExitSymbolizer(); }
>  };
>
> -void GetStackTrace(BufferedStackTrace *stack, uptr max_s, uptr pc, uptr
> bp,
> -                   void *context, bool request_fast_unwind);
> -
>  // Returns a "chained" origin id, pointing to the given stack trace
> followed by
>  // the previous origin id.
>  u32 ChainOrigin(u32 id, StackTrace *stack);
>
> Modified: compiler-rt/trunk/lib/lsan/lsan.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan.cc?rev=355039&r1=355038&r2=355039&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/lsan/lsan.cc (original)
> +++ compiler-rt/trunk/lib/lsan/lsan.cc Wed Feb 27 14:16:02 2019
> @@ -32,6 +32,24 @@ bool WordIsPoisoned(uptr addr) {
>
>  }  // namespace __lsan
>
> +void __sanitizer::GetStackTrace(BufferedStackTrace *stack, uptr max_depth,
> +                                uptr pc, uptr bp, void *context, bool
> fast) {
> +  using namespace __lsan;
> +  uptr stack_top = 0, stack_bottom = 0;
> +  ThreadContext *t;
> +  if (StackTrace::WillUseFastUnwind(fast) &&
> +      (t = CurrentThreadContext())) {
> +    stack_top = t->stack_end();
> +    stack_bottom = t->stack_begin();
> +  }
> +  if (!SANITIZER_MIPS || IsValidFrame(bp, stack_top, stack_bottom)) {
> +    if (StackTrace::WillUseFastUnwind(fast))
> +      stack->Unwind(max_depth, pc, bp, nullptr, stack_top, stack_bottom,
> true);
> +    else
> +      stack->Unwind(max_depth, pc, 0, context, 0, 0, false);
> +  }
> +}
> +
>  using namespace __lsan;  // NOLINT
>
>  static void InitializeFlags() {
>
> Modified: compiler-rt/trunk/lib/lsan/lsan.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan.h?rev=355039&r1=355038&r2=355039&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/lsan/lsan.h (original)
> +++ compiler-rt/trunk/lib/lsan/lsan.h Wed Feb 27 14:16:02 2019
> @@ -40,28 +40,6 @@ void ReplaceSystemMalloc();
>      __lsan_init();                \
>  } while (0)
>
> -// Get the stack trace with the given pc and bp.
> -// The pc will be in the position 0 of the resulting stack trace.
> -// The bp may refer to the current frame or to the caller's frame.
> -ALWAYS_INLINE
> -void GetStackTrace(__sanitizer::BufferedStackTrace *stack,
> -                   __sanitizer::uptr max_depth, __sanitizer::uptr pc,
> -                   __sanitizer::uptr bp, void *context, bool fast) {
> -  uptr stack_top = 0, stack_bottom = 0;
> -  ThreadContext *t;
> -  if (__sanitizer::StackTrace::WillUseFastUnwind(fast) &&
> -      (t = CurrentThreadContext())) {
> -    stack_top = t->stack_end();
> -    stack_bottom = t->stack_begin();
> -  }
> -  if (!SANITIZER_MIPS || IsValidFrame(bp, stack_top, stack_bottom)) {
> -    if (StackTrace::WillUseFastUnwind(fast))
> -      stack->Unwind(max_depth, pc, bp, nullptr, stack_top, stack_bottom,
> true);
> -    else
> -      stack->Unwind(max_depth, pc, 0, context, 0, 0, false);
> -  }
> -}
> -
>  }  // namespace __lsan
>
>  extern bool lsan_inited;
>
> Modified: compiler-rt/trunk/lib/msan/msan.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan.cc?rev=355039&r1=355038&r2=355039&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/msan/msan.cc (original)
> +++ compiler-rt/trunk/lib/msan/msan.cc Wed Feb 27 14:16:02 2019
> @@ -221,21 +221,6 @@ static void InitializeFlags() {
>    if (f->store_context_size < 1) f->store_context_size = 1;
>  }
>
> -void GetStackTrace(BufferedStackTrace *stack, uptr max_s, uptr pc, uptr
> bp,
> -                   void *context, bool request_fast_unwind) {
> -  MsanThread *t = GetCurrentThread();
> -  if (!t || !StackTrace::WillUseFastUnwind(request_fast_unwind)) {
> -    // Block reports from our interceptors during _Unwind_Backtrace.
> -    SymbolizerScope sym_scope;
> -    return stack->Unwind(max_s, pc, bp, context, 0, 0, false);
> -  }
> -  if (StackTrace::WillUseFastUnwind(request_fast_unwind))
> -    stack->Unwind(max_s, pc, bp, nullptr, t->stack_top(),
> t->stack_bottom(),
> -                  true);
> -  else
> -    stack->Unwind(max_s, pc, 0, context, 0, 0, false);
> -}
> -
>  void PrintWarning(uptr pc, uptr bp) {
>    PrintWarningWithOrigin(pc, bp, __msan_origin_tls);
>  }
> @@ -316,6 +301,23 @@ u32 ChainOrigin(u32 id, StackTrace *stac
>
>  } // namespace __msan
>
> +void __sanitizer::GetStackTrace(BufferedStackTrace *stack, uptr max_s,
> uptr pc,
> +                                uptr bp, void *context,
> +                                bool request_fast_unwind) {
> +  using namespace __msan;
> +  MsanThread *t = GetCurrentThread();
> +  if (!t || !StackTrace::WillUseFastUnwind(request_fast_unwind)) {
> +    // Block reports from our interceptors during _Unwind_Backtrace.
> +    SymbolizerScope sym_scope;
> +    return stack->Unwind(max_s, pc, bp, context, 0, 0, false);
> +  }
> +  if (StackTrace::WillUseFastUnwind(request_fast_unwind))
> +    stack->Unwind(max_s, pc, bp, nullptr, t->stack_top(),
> t->stack_bottom(),
> +                  true);
> +  else
> +    stack->Unwind(max_s, pc, 0, context, 0, 0, false);
> +}
> +
>  // Interface.
>
>  using namespace __msan;
>
> Modified: compiler-rt/trunk/lib/msan/msan.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan.h?rev=355039&r1=355038&r2=355039&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/msan/msan.h (original)
> +++ compiler-rt/trunk/lib/msan/msan.h Wed Feb 27 14:16:02 2019
> @@ -312,9 +312,6 @@ struct SymbolizerScope {
>  void PrintWarning(uptr pc, uptr bp);
>  void PrintWarningWithOrigin(uptr pc, uptr bp, u32 origin);
>
> -void GetStackTrace(BufferedStackTrace *stack, uptr max_s, uptr pc, uptr
> bp,
> -                   void *context, bool request_fast_unwind);
> -
>  // Unpoison first n function arguments.
>  void UnpoisonParam(uptr n);
>  void UnpoisonThreadLocalState();
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.h?rev=355039&r1=355038&r2=355039&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.h
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.h Wed Feb
> 27 14:16:02 2019
> @@ -121,6 +121,12 @@ static inline bool IsValidFrame(uptr fra
>    return frame > stack_bottom && frame < stack_top - 2 * sizeof (uhwptr);
>  }
>
> +// Get the stack trace with the given pc and bp.
> +// The pc will be in the position 0 of the resulting stack trace.
> +// The bp may refer to the current frame or to the caller's frame.
> +void GetStackTrace(BufferedStackTrace *stack, uptr max_depth, uptr pc,
> uptr bp,
> +                   void *context, bool request_fast_unwind);
> +
>  }  // namespace __sanitizer
>
>  // Use this macro if you want to print stack trace with the caller
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_stack_trace.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_stack_trace.cc?rev=355039&r1=355038&r2=355039&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_stack_trace.cc (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_stack_trace.cc Wed Feb 27 14:16:02
> 2019
> @@ -48,3 +48,15 @@ void VarSizeStackTrace::ReverseOrder() {
>  }
>
>  }  // namespace __tsan
> +
> +void __sanitizer::GetStackTrace(BufferedStackTrace *stack, uptr max_depth,
> +                                uptr pc, uptr bp, void *context,
> +                                bool request_fast_unwind) {
> +  uptr top = 0;
> +  uptr bottom = 0;
> +  if (StackTrace::WillUseFastUnwind(request_fast_unwind)) {
> +    GetThreadStackTopAndBottom(false, &top, &bottom);
> +    stack->Unwind(kStackTraceMax, pc, bp, nullptr, top, bottom, true);
> +  } else
> +    stack->Unwind(kStackTraceMax, pc, 0, context, 0, 0, false);
> +}
>
> Modified: compiler-rt/trunk/lib/ubsan/ubsan_diag.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan/ubsan_diag.cc?rev=355039&r1=355038&r2=355039&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/ubsan/ubsan_diag.cc (original)
> +++ compiler-rt/trunk/lib/ubsan/ubsan_diag.cc Wed Feb 27 14:16:02 2019
> @@ -26,17 +26,6 @@
>
>  using namespace __ubsan;
>
> -void __ubsan::GetStackTrace(BufferedStackTrace *stack, uptr max_depth,
> uptr pc,
> -                            uptr bp, void *context, bool fast) {
> -  uptr top = 0;
> -  uptr bottom = 0;
> -  if (StackTrace::WillUseFastUnwind(fast)) {
> -    GetThreadStackTopAndBottom(false, &top, &bottom);
> -    stack->Unwind(max_depth, pc, bp, nullptr, top, bottom, true);
> -  } else
> -    stack->Unwind(max_depth, pc, bp, context, 0, 0, false);
> -}
> -
>  static void MaybePrintStackTrace(uptr pc, uptr bp) {
>    // We assume that flags are already parsed, as UBSan runtime
>    // will definitely be called when we print the first diagnostics
> message.
>
> Modified: compiler-rt/trunk/lib/ubsan/ubsan_diag.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan/ubsan_diag.h?rev=355039&r1=355038&r2=355039&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/ubsan/ubsan_diag.h (original)
> +++ compiler-rt/trunk/lib/ubsan/ubsan_diag.h Wed Feb 27 14:16:02 2019
> @@ -234,9 +234,6 @@ bool ignoreReport(SourceLocation SLoc, R
>      GET_CALLER_PC_BP; \
>      ReportOptions Opts = {unrecoverable_handler, pc, bp}
>
> -void GetStackTrace(BufferedStackTrace *stack, uptr max_depth, uptr pc,
> uptr bp,
> -                   void *context, bool fast);
> -
>  /// \brief Instantiate this class before printing diagnostics in the error
>  /// report. This class ensures that reports from different threads and
> from
>  /// different sanitizers won't be mixed.
>
> Modified: compiler-rt/trunk/lib/ubsan/ubsan_diag_standalone.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan/ubsan_diag_standalone.cc?rev=355039&r1=355038&r2=355039&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/ubsan/ubsan_diag_standalone.cc (original)
> +++ compiler-rt/trunk/lib/ubsan/ubsan_diag_standalone.cc Wed Feb 27
> 14:16:02 2019
> @@ -14,6 +14,17 @@
>  #if CAN_SANITIZE_UB
>  #include "ubsan_diag.h"
>
> +void __sanitizer::GetStackTrace(BufferedStackTrace *stack, uptr max_depth,
> +                                uptr pc, uptr bp, void *context, bool
> fast) {
> +  uptr top = 0;
> +  uptr bottom = 0;
> +  if (StackTrace::WillUseFastUnwind(fast)) {
> +    GetThreadStackTopAndBottom(false, &top, &bottom);
> +    stack->Unwind(max_depth, pc, bp, nullptr, top, bottom, true);
> +  } else
> +    stack->Unwind(max_depth, pc, bp, context, 0, 0, false);
> +}
> +
>  using namespace __ubsan;
>
>  extern "C" {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190228/b2357bbe/attachment.html>


More information about the llvm-commits mailing list