[compiler-rt] r355355 - [NFC][Sanitizer] Cleanup ASan's GetStackTrace implementation

Julian Lettner via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 4 16:41:15 PST 2019


Author: yln
Date: Mon Mar  4 16:41:15 2019
New Revision: 355355

URL: http://llvm.org/viewvc/llvm-project?rev=355355&view=rev
Log:
[NFC][Sanitizer] Cleanup ASan's GetStackTrace implementation

Cleanup ASan's  __sanitizer::BufferedStackTrace::UnwindImpl (formerly
GetStackTrace) implementation. Start with ASan because it is the most
complex implementation.

GetStackTrace implementations seem to have started out as exact copies
of the original implementation in ASan, but have diverged in subtle
ways. My goal is to parameterize this algorithm (via templating or
callbacks) so we can share the implementation and get rid of the
inversed dependency (sanitizer_common depends on concrete
implementations in asan, ubsan, etc.). This should also help us to avoid
those pesky linker errors caused by undefined, duplicate, and weak
symbols on Windows.

Reviewed By: vitalybuka

Differential Revision: https://reviews.llvm.org/D58861

Modified:
    compiler-rt/trunk/lib/asan/asan_stack.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.h

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=355355&r1=355354&r2=355355&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_stack.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_stack.cc Mon Mar  4 16:41:15 2019
@@ -31,28 +31,23 @@ u32 GetMallocContextSize() {
 void __sanitizer::BufferedStackTrace::UnwindImpl(
     uptr pc, uptr bp, void *context, bool request_fast, u32 max_depth) {
   using namespace __asan;
-#if SANITIZER_WINDOWS
-  Unwind(max_depth, pc, 0, context, 0, 0, false);
-#else
-  AsanThread *t;
   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(request_fast))
-          Unwind(max_depth, pc, bp, nullptr, stack_top, stack_bottom, true);
-        else
-          Unwind(max_depth, pc, 0, context, 0, 0, false);
-      }
-    } else if (!t && !request_fast) {
-      /* If GetCurrentThread() has failed, try to do slow unwind anyways. */
-      Unwind(max_depth, pc, bp, context, 0, 0, false);
+  if (UNLIKELY(!asan_inited)) return;
+
+  AsanThread *t = GetCurrentThread();
+  if (t && !t->isUnwinding() && WillUseFastUnwind(request_fast)) {
+    uptr top = t->stack_top();
+    uptr bottom = t->stack_bottom();
+    ScopedUnwinding unwind_scope(t);
+    if (!SANITIZER_MIPS || IsValidFrame(bp, top, bottom)) {
+      UnwindFast(pc, bp, top, bottom, max_depth);
+      return;
     }
   }
-#endif // SANITIZER_WINDOWS
+
+#if SANITIZER_CAN_SLOW_UNWIND
+    UnwindSlowWithOptionalContext(pc, context, max_depth);
+#endif
 }
 
 // ------------------ Interface -------------- {{{1

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=355355&r1=355354&r2=355355&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.h Mon Mar  4 16:41:15 2019
@@ -134,6 +134,11 @@ struct BufferedStackTrace : public Stack
   void UnwindSlow(uptr pc, u32 max_depth);
   void UnwindSlow(uptr pc, void *context, u32 max_depth);
 
+  void UnwindSlowWithOptionalContext(uptr pc, void *context, u32 max_depth) {
+    if (context) UnwindSlow(pc, context, max_depth);
+    else         UnwindSlow(pc, max_depth);
+  }
+
   void PopStackFrames(uptr count);
   uptr LocatePcInTrace(uptr pc);
 




More information about the llvm-commits mailing list