From 8a8a4a3b88cf0b483c5e446dd6b41a4e0bb52f9a Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Tue, 30 Jul 2024 06:28:59 -0400 Subject: [PATCH] [libunwind][AIX] Fix the wrong traceback from signal handler (#101069) Patch [llvm#92291](https://github.com/llvm/llvm-project/pull/92291) causes wrong traceback from a signal handler for AIX because the AIX unwinder uses the traceback table at the end of each function instead of FDE/CIE for unwinding. This patch adds a condition to exclude traceback table based unwinding from the code added by the patch. (cherry picked from commit d90fa612604b49dfc81c3f42c106fab7401322ec) --- libunwind/src/UnwindCursor.hpp | 3 ++- libunwind/test/aix_signal_unwind.pass.sh.S | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libunwind/src/UnwindCursor.hpp b/libunwind/src/UnwindCursor.hpp index 2ec60e4c123d5e..758557337899ed 100644 --- a/libunwind/src/UnwindCursor.hpp +++ b/libunwind/src/UnwindCursor.hpp @@ -2589,7 +2589,8 @@ void UnwindCursor::setInfoBasedOnIPRegister(bool isReturnAddress) { --pc; #endif -#if !(defined(_LIBUNWIND_SUPPORT_SEH_UNWIND) && defined(_WIN32)) +#if !(defined(_LIBUNWIND_SUPPORT_SEH_UNWIND) && defined(_WIN32)) && \ + !defined(_LIBUNWIND_SUPPORT_TBTAB_UNWIND) // In case of this is frame of signal handler, the IP saved in the signal // handler points to first non-executed instruction, while FDE/CIE expects IP // to be after the first non-executed instruction. diff --git a/libunwind/test/aix_signal_unwind.pass.sh.S b/libunwind/test/aix_signal_unwind.pass.sh.S index 9ca18e9481f4fc..a666577d095b10 100644 --- a/libunwind/test/aix_signal_unwind.pass.sh.S +++ b/libunwind/test/aix_signal_unwind.pass.sh.S @@ -10,7 +10,7 @@ // a correct traceback when the function raising the signal does not save // the link register or does not store the stack back chain. -// REQUIRES: target=powerpc{{(64)?}}-ibm-aix +// REQUIRES: target=powerpc{{(64)?}}-ibm-aix{{.*}} // Test when the function raising the signal does not save the link register // RUN: %{cxx} -x c++ %s -o %t.exe -DCXX_CODE %{flags} %{compile_flags}