diff options
author | Rainer Orth <ro@gcc.gnu.org> | 2024-08-03 22:19:44 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-03 22:19:44 +0200 |
commit | 3368a3245ce5049b090d7c1081c2d52a6b6fda68 (patch) | |
tree | d6eda82ef7fe70a3fed4589ba4f3639964f6e077 /llvm/lib/Transforms/Utils/LoopVersioning.cpp | |
parent | 63a7786111c501920afc4cc27a4633f76cdaf803 (diff) | |
download | llvm-3368a3245ce5049b090d7c1081c2d52a6b6fda68.zip llvm-3368a3245ce5049b090d7c1081c2d52a6b6fda68.tar.gz llvm-3368a3245ce5049b090d7c1081c2d52a6b6fda68.tar.bz2 |
[sanitizer_common] Fix UnwindFast on SPARC (#101634)
```
UBSan-Standalone-sparc :: TestCases/Misc/Linux/diag-stacktrace.cpp
```
`FAIL`s on 32 and 64-bit Linux/sparc64 (and on Solaris/sparcv9, too: the
test isn't Linux-specific at all). With
`UBSAN_OPTIONS=fast_unwind_on_fatal=1`, the stack trace shows a
duplicate innermost frame:
```
compiler-rt/test/ubsan/TestCases/Misc/Linux/diag-stacktrace.cpp:14:31: runtime error: execution reached the end of a value-returning function without returning a value
#0 0x7003a708 in f() compiler-rt/test/ubsan/TestCases/Misc/Linux/diag-stacktrace.cpp:14:35
#1 0x7003a708 in f() compiler-rt/test/ubsan/TestCases/Misc/Linux/diag-stacktrace.cpp:14:35
#2 0x7003a714 in g() compiler-rt/test/ubsan/TestCases/Misc/Linux/diag-stacktrace.cpp:17:38
```
which isn't seen with `fast_unwind_on_fatal=0`.
This turns out to be another fallout from fixing
`__builtin_return_address`/`__builtin_extract_return_addr` on SPARC. In
`sanitizer_stacktrace_sparc.cpp` (`BufferedStackTrace::UnwindFast`) the
`pc` arg is the return address, while `pc1` from the stack frame
(`fr_savpc`) is the address of the `call` insn, leading to a double
entry for the innermost frame in `trace_buffer[]`.
This patch fixes this by moving the adjustment before all uses.
Tested on `sparc64-unknown-linux-gnu` and `sparcv9-sun-solaris2.11`
(with the `ubsan/TestCases/Misc/Linux` tests enabled).
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopVersioning.cpp')
0 files changed, 0 insertions, 0 deletions