From 34cf263e6149a0e13cbcba35d1017624e59ed996 Mon Sep 17 00:00:00 2001 From: Rainer Orth Date: Thu, 3 Aug 2023 16:06:59 +0200 Subject: [PATCH] [sanitizer_common] Remove hacks for __builtin_return_address abuse on SPARC As detailed in Issue #57624, the introduction of `__builtin_extract_return_address` to `GET_CALLER_PC` in 4248f32b9ebe87c7af8ee53911efd47c2652f488 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`. Differential Revision: https://reviews.llvm.org/D156504 (cherry picked from commit 679c076ae446af81eba81ce9b94203a273d4b88a) --- compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_sparc.cpp | 6 ------ compiler-rt/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp | 6 ------ 2 files changed, 12 deletions(-) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_sparc.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_sparc.cpp index 1e635a6..a200079 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_sparc.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_sparc.cpp @@ -30,13 +30,7 @@ void BufferedStackTrace::UnwindFast(uptr pc, uptr bp, uptr stack_top, // 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 diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp index 72f025a..6a8e82e 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp @@ -139,13 +139,7 @@ void BufferedStackTrace::UnwindSlow(uptr pc, u32 max_depth) { 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) { -- 2.7.4