public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Segher Boessenkool <segher@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r12-5160] libgcc: Fix backtrace fallback on PowerPC Big-endian
Date: Thu, 11 Nov 2021 15:30:49 +0000 (GMT)	[thread overview]
Message-ID: <20211111153049.B461B3858408@sourceware.org> (raw)

https://gcc.gnu.org/g:8d71d3a317236ab4a69f441cf867a43aeb448150

commit r12-5160-g8d71d3a317236ab4a69f441cf867a43aeb448150
Author: Raphael Moreira Zinsly <rzinsly@linux.ibm.com>
Date:   Thu Nov 11 11:40:10 2021 -0300

    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.

Diff:
---
 libgcc/config/rs6000/linux-unwind.h | 8 +++++++-
 libgcc/unwind.inc                   | 5 +++--
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/libgcc/config/rs6000/linux-unwind.h b/libgcc/config/rs6000/linux-unwind.h
index 47884973ca5..5ef9c1aa0d1 100644
--- a/libgcc/config/rs6000/linux-unwind.h
+++ b/libgcc/config/rs6000/linux-unwind.h
@@ -402,8 +402,14 @@ ppc_backchain_fallback (struct _Unwind_Context *context, void *a)
   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;
+
+  /* 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;
 
   for (count = arg->count; current != NULL; current = current->backchain)
diff --git a/libgcc/unwind.inc b/libgcc/unwind.inc
index 456a5ee682f..dc2f9c13e97 100644
--- a/libgcc/unwind.inc
+++ b/libgcc/unwind.inc
@@ -160,12 +160,13 @@ _Unwind_ForcedUnwind_Phase2 (struct _Unwind_Exception *exc,
 
       /* Set up fs to describe the FDE for the caller of cur_context.  */
       code = uw_frame_state_for (context, &fs);
-      if (code != _URC_NO_REASON && code != _URC_END_OF_STACK)
+      if (code != _URC_NO_REASON && code != _URC_END_OF_STACK
+	  && code != _URC_NORMAL_STOP)
 	return _URC_FATAL_PHASE2_ERROR;
 
       /* Unwind successful.  */
       action = _UA_FORCE_UNWIND | _UA_CLEANUP_PHASE;
-      if (code == _URC_END_OF_STACK)
+      if (code == _URC_END_OF_STACK || code == _URC_NORMAL_STOP)
 	action |= _UA_END_OF_STACK;
       stop_code = (*stop) (1, action, exc->exception_class, exc,
 			   context, stop_argument);


                 reply	other threads:[~2021-11-11 15:30 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211111153049.B461B3858408@sourceware.org \
    --to=segher@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).