Revert 502f0cc0e38 "[GWP-ASan] Split the unwinder into segv/non-segv."

It was causing tests to fail in -DCOMPILER_RT_BUILD_BUILTINS=OFF builds:

   GwpAsan-Unittest :: ./GwpAsan-x86_64-Test/BacktraceGuardedPoolAllocator.DoubleFree
   GwpAsan-Unittest :: ./GwpAsan-x86_64-Test/BacktraceGuardedPoolAllocator.UseAfterFree

see comment on the code review.

> Summary:
> Splits the unwinder into a non-segv (for allocation/deallocation traces) and a
> segv unwinder. This ensures that implementations can select an accurate, slower
> unwinder in the segv handler (if they choose to use the GWP-ASan provided one).
> This is important as fast frame-pointer unwinders (like the sanitizer unwinder)
> don't like unwinding through signal handlers.
>
> Reviewers: morehouse, cryptoad
>
> Reviewed By: morehouse, cryptoad
>
> Subscribers: cryptoad, mgorny, eugenis, pcc, #sanitizers
>
> Tags: #sanitizers
>
> Differential Revision: https://reviews.llvm.org/D83994

This reverts commit 502f0cc0e3889229e923e187f38dda91324ae139.

GitOrigin-RevId: ab6263c9258ccd0e3c9cb4f675979f22cfba6131
diff --git a/optional/backtrace_linux_libc.cpp b/optional/backtrace_linux_libc.cpp
index 92eb293..bb0aad2 100644
--- a/optional/backtrace_linux_libc.cpp
+++ b/optional/backtrace_linux_libc.cpp
@@ -23,14 +23,6 @@
   return backtrace(reinterpret_cast<void **>(TraceBuffer), Size);
 }
 
-// We don't need any custom handling for the Segv backtrace - the libc unwinder
-// has no problems with unwinding through a signal handler. Force inlining here
-// to avoid the additional frame.
-GWP_ASAN_ALWAYS_INLINE size_t SegvBacktrace(uintptr_t *TraceBuffer, size_t Size,
-                                            void * /*Context*/) {
-  return Backtrace(TraceBuffer, Size);
-}
-
 static void PrintBacktrace(uintptr_t *Trace, size_t TraceLength,
                            gwp_asan::crash_handler::Printf_t Printf) {
   if (TraceLength == 0) {
@@ -61,8 +53,4 @@
   return PrintBacktrace;
 }
 } // namespace options
-
-namespace crash_handler {
-SegvBacktrace_t getSegvBacktraceFunction() { return SegvBacktrace; }
-} // namespace crash_handler
 } // namespace gwp_asan
diff --git a/optional/backtrace_sanitizer_common.cpp b/optional/backtrace_sanitizer_common.cpp
index a8083e4..3ac4b52 100644
--- a/optional/backtrace_sanitizer_common.cpp
+++ b/optional/backtrace_sanitizer_common.cpp
@@ -22,45 +22,28 @@
                                                  void *context,
                                                  bool request_fast,
                                                  u32 max_depth) {
-  if (!StackTrace::WillUseFastUnwind(request_fast))
-    return Unwind(max_depth, pc, 0, context, 0, 0, false);
-
-  uptr top = 0;
-  uptr bottom = 0;
-  GetThreadStackTopAndBottom(/*at_initialization*/ false, &top, &bottom);
-
-  return Unwind(max_depth, pc, bp, context, top, bottom, request_fast);
+  if (!StackTrace::WillUseFastUnwind(request_fast)) {
+    return Unwind(max_depth, pc, bp, context, 0, 0, request_fast);
+  }
+  Unwind(max_depth, pc, 0, context, 0, 0, false);
 }
 
 namespace {
-size_t BacktraceCommon(uintptr_t *TraceBuffer, size_t Size, void *Context) {
-  // Use the slow sanitizer unwinder in the segv handler. Fast frame pointer
-  // unwinders can end up dropping frames because the kernel sigreturn() frame's
-  // return address is the return address at time of fault. This has the result
-  // of never actually capturing the PC where the signal was raised.
-  bool UseFastUnwind = (Context == nullptr);
-
+size_t Backtrace(uintptr_t *TraceBuffer, size_t Size) {
   __sanitizer::BufferedStackTrace Trace;
   Trace.Reset();
   if (Size > __sanitizer::kStackTraceMax)
     Size = __sanitizer::kStackTraceMax;
 
   Trace.Unwind((__sanitizer::uptr)__builtin_return_address(0),
-               (__sanitizer::uptr)__builtin_frame_address(0), Context,
-               UseFastUnwind, Size - 1);
+               (__sanitizer::uptr)__builtin_frame_address(0),
+               /* ucontext */ nullptr,
+               /* fast unwind */ true, Size - 1);
 
   memcpy(TraceBuffer, Trace.trace, Trace.size * sizeof(uintptr_t));
   return Trace.size;
 }
 
-size_t Backtrace(uintptr_t *TraceBuffer, size_t Size) {
-  return BacktraceCommon(TraceBuffer, Size, nullptr);
-}
-
-size_t SegvBacktrace(uintptr_t *TraceBuffer, size_t Size, void *Context) {
-  return BacktraceCommon(TraceBuffer, Size, Context);
-}
-
 static void PrintBacktrace(uintptr_t *Trace, size_t TraceLength,
                            gwp_asan::crash_handler::Printf_t Printf) {
   __sanitizer::StackTrace StackTrace;
@@ -94,8 +77,4 @@
   return PrintBacktrace;
 }
 } // namespace options
-
-namespace crash_handler {
-SegvBacktrace_t getSegvBacktraceFunction() { return SegvBacktrace; }
-} // namespace crash_handler
 } // namespace gwp_asan
diff --git a/optional/segv_handler.h b/optional/segv_handler.h
index 0fed4f2..10af150 100644
--- a/optional/segv_handler.h
+++ b/optional/segv_handler.h
@@ -59,15 +59,6 @@
 // without any symbolization.
 PrintBacktrace_t getBasicPrintBacktraceFunction();
 
-// Returns a function pointer to a backtrace function that's suitable for
-// unwinding through a signal handler. This is important primarily for frame-
-// pointer based unwinders, DWARF or other unwinders can simply provide the
-// normal backtrace function as the implementation here. On POSIX, SignalContext
-// should be the `ucontext_t` from the signal handler.
-typedef size_t (*SegvBacktrace_t)(uintptr_t *TraceBuffer, size_t Size,
-                                  void *SignalContext);
-SegvBacktrace_t getSegvBacktraceFunction();
-
 // Install the SIGSEGV crash handler for printing use-after-free and heap-
 // buffer-{under|over}flow exceptions if the user asked for it. This is platform
 // specific as even though POSIX and Windows both support registering handlers
@@ -76,14 +67,14 @@
 // before this function.
 void installSignalHandlers(gwp_asan::GuardedPoolAllocator *GPA, Printf_t Printf,
                            PrintBacktrace_t PrintBacktrace,
-                           SegvBacktrace_t SegvBacktrace);
+                           options::Backtrace_t Backtrace);
 
 void uninstallSignalHandlers();
 
 void dumpReport(uintptr_t ErrorPtr, const gwp_asan::AllocatorState *State,
                 const gwp_asan::AllocationMetadata *Metadata,
-                SegvBacktrace_t SegvBacktrace, Printf_t Printf,
-                PrintBacktrace_t PrintBacktrace, void *Context);
+                options::Backtrace_t Backtrace, Printf_t Printf,
+                PrintBacktrace_t PrintBacktrace);
 } // namespace crash_handler
 } // namespace gwp_asan
 
diff --git a/optional/segv_handler_posix.cpp b/optional/segv_handler_posix.cpp
index 1bd7a60..22589b8 100644
--- a/optional/segv_handler_posix.cpp
+++ b/optional/segv_handler_posix.cpp
@@ -23,14 +23,14 @@
 using gwp_asan::GuardedPoolAllocator;
 using gwp_asan::crash_handler::PrintBacktrace_t;
 using gwp_asan::crash_handler::Printf_t;
-using gwp_asan::crash_handler::SegvBacktrace_t;
+using gwp_asan::options::Backtrace_t;
 
 struct sigaction PreviousHandler;
 bool SignalHandlerInstalled;
 gwp_asan::GuardedPoolAllocator *GPAForSignalHandler;
 Printf_t PrintfForSignalHandler;
 PrintBacktrace_t PrintBacktraceForSignalHandler;
-SegvBacktrace_t BacktraceForSignalHandler;
+Backtrace_t BacktraceForSignalHandler;
 
 static void sigSegvHandler(int sig, siginfo_t *info, void *ucontext) {
   if (GPAForSignalHandler) {
@@ -40,7 +40,7 @@
         reinterpret_cast<uintptr_t>(info->si_addr),
         GPAForSignalHandler->getAllocatorState(),
         GPAForSignalHandler->getMetadataRegion(), BacktraceForSignalHandler,
-        PrintfForSignalHandler, PrintBacktraceForSignalHandler, ucontext);
+        PrintfForSignalHandler, PrintBacktraceForSignalHandler);
   }
 
   // Process any previous handlers.
@@ -138,11 +138,11 @@
 
 void installSignalHandlers(gwp_asan::GuardedPoolAllocator *GPA, Printf_t Printf,
                            PrintBacktrace_t PrintBacktrace,
-                           SegvBacktrace_t SegvBacktrace) {
+                           options::Backtrace_t Backtrace) {
   GPAForSignalHandler = GPA;
   PrintfForSignalHandler = Printf;
   PrintBacktraceForSignalHandler = PrintBacktrace;
-  BacktraceForSignalHandler = SegvBacktrace;
+  BacktraceForSignalHandler = Backtrace;
 
   struct sigaction Action;
   Action.sa_sigaction = sigSegvHandler;
@@ -160,8 +160,8 @@
 
 void dumpReport(uintptr_t ErrorPtr, const gwp_asan::AllocatorState *State,
                 const gwp_asan::AllocationMetadata *Metadata,
-                SegvBacktrace_t SegvBacktrace, Printf_t Printf,
-                PrintBacktrace_t PrintBacktrace, void *Context) {
+                options::Backtrace_t Backtrace, Printf_t Printf,
+                PrintBacktrace_t PrintBacktrace) {
   assert(State && "dumpReport missing Allocator State.");
   assert(Metadata && "dumpReport missing Metadata.");
   assert(Printf && "dumpReport missing Printf.");
@@ -194,8 +194,7 @@
   // Print the fault backtrace.
   static constexpr unsigned kMaximumStackFramesForCrashTrace = 512;
   uintptr_t Trace[kMaximumStackFramesForCrashTrace];
-  size_t TraceLength =
-      SegvBacktrace(Trace, kMaximumStackFramesForCrashTrace, Context);
+  size_t TraceLength = Backtrace(Trace, kMaximumStackFramesForCrashTrace);
 
   PrintBacktrace(Trace, TraceLength, Printf);
 
diff --git a/tests/harness.h b/tests/harness.h
index d303b2c..e47254e 100644
--- a/tests/harness.h
+++ b/tests/harness.h
@@ -86,8 +86,7 @@
 
     gwp_asan::crash_handler::installSignalHandlers(
         &GPA, gwp_asan::test::getPrintfFunction(),
-        gwp_asan::options::getPrintBacktraceFunction(),
-        gwp_asan::crash_handler::getSegvBacktraceFunction());
+        gwp_asan::options::getPrintBacktraceFunction(), Opts.Backtrace);
   }
 
   void TearDown() override {