libgcc: Fix backtrace fallback on PowerPC Big-endian
authorRaphael Moreira Zinsly <rzinsly@linux.ibm.com>
Thu, 11 Nov 2021 14:40:10 +0000 (11:40 -0300)
committerSegher Boessenkool <segher@kernel.crashing.org>
Thu, 11 Nov 2021 15:29:25 +0000 (15:29 +0000)
commit8d71d3a317236ab4a69f441cf867a43aeb448150
tree2faac06ced47961dc0f913bdac9cab9d91992537
parent8d3abf42d5c2ccd5c5e879088fdf6e071c3d1b9e
libgcc: Fix backtrace fallback on PowerPC Big-endian

At the end of the backtrace stream _Unwind_Find_FDE() may not be able
to find the frame unwind info and will later call the backtrace fallback
instead of finishing. This occurs when using an old libc on ppc64 due to
dl_iterate_phdr() not being able to set the fde in the last trace.
When this occurs the cfa of the trace will be behind of context's cfa.
Also, libgo’s probestackmaps() calls the backtrace with a null pointer
and can get to the backchain fallback with the same problem, in this case
we are only interested in find a stack map, we don't need nor can do a
backchain.
_Unwind_ForcedUnwind_Phase2() can hit the same issue as it uses
uw_frame_state_for(), so we need to treat _URC_NORMAL_STOP.

libgcc/ChangeLog:
PR libgcc/103044
* config/rs6000/linux-unwind.h (ppc_backchain_fallback): Check if it's
called with a null argument or at the end of the backtrace and return.
* unwind.inc (_Unwind_ForcedUnwind_Phase2): Treat _URC_NORMAL_STOP.
libgcc/config/rs6000/linux-unwind.h
libgcc/unwind.inc