Add internal API to allow bypassing stack trace fixups when needed

PiperOrigin-RevId: 822668786
Change-Id: I72d6178bbbde8b05b529e2d8297772cbb63758d0
diff --git a/absl/debugging/stacktrace.cc b/absl/debugging/stacktrace.cc
index 67df814..420005c 100644
--- a/absl/debugging/stacktrace.cc
+++ b/absl/debugging/stacktrace.cc
@@ -78,7 +78,8 @@
 ABSL_ATTRIBUTE_ALWAYS_INLINE inline int Unwind(void** result, uintptr_t* frames,
                                                int* sizes, size_t max_depth,
                                                int skip_count, const void* uc,
-                                               int* min_dropped_frames) {
+                                               int* min_dropped_frames,
+                                               bool unwind_with_fixup = true) {
   static constexpr size_t kMinPageSize = 4096;
 
   // Allow up to ~half a page, leaving some slack space for local variables etc.
@@ -100,7 +101,8 @@
   bool must_free_frames = false;
   bool must_free_sizes = false;
 
-  bool unwind_with_fixup = internal_stacktrace::ShouldFixUpStack();
+  unwind_with_fixup =
+      unwind_with_fixup && internal_stacktrace::ShouldFixUpStack();
 
 #ifdef _WIN32
   if (unwind_with_fixup) {
@@ -194,6 +196,14 @@
                             min_dropped_frames);
 }
 
+ABSL_ATTRIBUTE_NOINLINE ABSL_ATTRIBUTE_NO_TAIL_CALL int
+internal_stacktrace::GetStackTraceNoFixup(void** result, int max_depth,
+                                          int skip_count) {
+  return Unwind<false, false>(result, nullptr, nullptr,
+                              static_cast<size_t>(max_depth), skip_count,
+                              nullptr, nullptr, /*unwind_with_fixup=*/false);
+}
+
 ABSL_ATTRIBUTE_NOINLINE ABSL_ATTRIBUTE_NO_TAIL_CALL int GetStackTrace(
     void** result, int max_depth, int skip_count) {
   return Unwind<false, false>(result, nullptr, nullptr,
diff --git a/absl/debugging/stacktrace.h b/absl/debugging/stacktrace.h
index 8777172..79f7651 100644
--- a/absl/debugging/stacktrace.h
+++ b/absl/debugging/stacktrace.h
@@ -69,6 +69,9 @@
                                      int* sizes, int max_depth, int skip_count,
                                      const void* uc, int* min_dropped_frames);
 
+// As above, but skips fix-ups for efficiency.
+extern int GetStackTraceNoFixup(void** result, int max_depth, int skip_count);
+
 // Same as `absl::DefaultStackUnwinder`, but with an optional `frames` parameter
 // to allow callers to receive the raw stack frame addresses.
 // This is internal for now; do not depend on this externally.