[PATCH] D156504: [sanitizer_common] Remove hacks for __builtin_return_address abuse on SPARC

Rainer Orth via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 27 22:53:27 PDT 2023


ro created this revision.
ro added a reviewer: vitalybuka.
ro added a project: Sanitizers.
Herald added subscribers: Enna1, jrtc27, fedor.sergeev, kristof.beyls, jyknight.
Herald added a project: All.
ro requested review of this revision.
Herald added a subscriber: Sanitizers.

As detailed in Issue #57624, the introduction of `__builtin_extract_return_address` to `GET_CALLER_PC` in 4248f32b9ebe87c7af8ee53911efd47c2652f488 <https://reviews.llvm.org/rG4248f32b9ebe87c7af8ee53911efd47c2652f488> broke `TestCases/Misc/missing_return.cpp` on Solaris/SPARC.  Unlike most other targets, the builtin isn't a no-op on SPARC and thus has always been necessary. Its lack had previously been worked around by calls to `GetNextInstructionPc` in `sanitizer_stacktrace_sparc.cpp` (`BufferedStackTrace::UnwindFast`) and `sanitizer_unwind_linux_libcdep.cpp` (`BufferedStackTrace::UnwindSlow`).  However, those calls are superfluous now and actually harmful.

This patch removes those hacks, fixing the failure.

Tested on `sparcv9-sun-solaris2.11` and on `sparc-sun-solaris2.11` in the GCC tree.  On the latter, several more testcase failures had been caused by this issue since ASan actually works with `gcc` on SPARC, unlike `clang`.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D156504

Files:
  compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_sparc.cpp
  compiler-rt/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp


Index: compiler-rt/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp
===================================================================
--- compiler-rt/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp
+++ compiler-rt/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp
@@ -139,13 +139,7 @@
   if (to_pop == 0 && size > 1)
     to_pop = 1;
   PopStackFrames(to_pop);
-#if defined(__GNUC__) && defined(__sparc__)
-  // __builtin_return_address returns the address of the call instruction
-  // on the SPARC and not the return address, so we need to compensate.
-  trace_buffer[0] = GetNextInstructionPc(pc);
-#else
   trace_buffer[0] = pc;
-#endif
 }
 
 void BufferedStackTrace::UnwindSlow(uptr pc, void *context, u32 max_depth) {
Index: compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_sparc.cpp
===================================================================
--- compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_sparc.cpp
+++ compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_sparc.cpp
@@ -30,13 +30,7 @@
   // TODO(yln): add arg sanity check for stack_top/stack_bottom
   CHECK_GE(max_depth, 2);
   const uptr kPageSize = GetPageSizeCached();
-#if defined(__GNUC__)
-  // __builtin_return_address returns the address of the call instruction
-  // on the SPARC and not the return address, so we need to compensate.
-  trace_buffer[0] = GetNextInstructionPc(pc);
-#else
   trace_buffer[0] = pc;
-#endif
   size = 1;
   if (stack_top < 4096) return;  // Sanity check for stack top.
   // Flush register windows to memory


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D156504.544901.patch
Type: text/x-patch
Size: 1555 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230728/d6205c35/attachment.bin>


More information about the llvm-commits mailing list