[PATCH] libgcc: fix backtrace fallback on PowerPC Big-endian. [PR103004]
Raphael M Zinsly
rzinsly@linux.ibm.com
Thu Nov 11 14:26:14 GMT 2021
Hi Segher,
On 11/11/2021 10:43, Segher Boessenkool wrote:
> Hi!
>
> On Wed, Nov 10, 2021 at 06:59:23PM -0300, Raphael Moreira Zinsly wrote:
>> 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:
>>
>> * config/rs6000/linux-unwind.h (ppc_backchain_fallback): turn into
>> static to fix -Wmissing-prototypes. 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.
>
> Formatting is messed up. Lines start with a capital. Two spaces after
> full stop, while you're at it.
>
Ok.
>> -void ppc_backchain_fallback (struct _Unwind_Context *context, void *a)
>> +static void
>> +ppc_backchain_fallback (struct _Unwind_Context *context, void *a)
>
> This was already fixed in 75ef0353a2d3.
Ops, missed that.
>
>> {
>> struct frame_layout *current;
>> struct trace_arg *arg = a;
>> int count;
>>
>> - /* Get the last address computed and start with the next. */
>> + /* Get the last address computed. */
>> current = context->cfa;
>
> Empty line after here please. Most of the time if you have a full-line
> comment it means a new paragraph is starting.
>
Ok.
>> + /* If the trace CFA is not the context CFA the backtrace is done. */
>> + if (arg == NULL || arg->cfa != current)
>> + return;
>> +
>> + /* Start with next address. */
>> current = current->backchain;
>
> Like you did here :-)
>
> Do you have a testcase (that failed without this, but now doesn't)?
>
I don't have a simple testcase for that, but many of the asan and go
tests catch that.
> Looks okay, but please update and resend.
>
>
> Segher
>
Thanks,
--
Raphael Moreira Zinsly
More information about the Gcc-patches
mailing list