This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[SPARC] Small tweak to Solaris unwinder
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 9 Jan 2012 19:20:23 +0100
- Subject: [SPARC] Small tweak to Solaris unwinder
On the recent Solaris 10 version I have access to (s10_72), the kernel/libc
sometimes calls the call_user_handler routines with a null returned address.
This is responsible for the last ACATS failure (cb1010c). But, in most cases,
the address is the expected one, so it isn't clear if this is a bug or not.
Tested on Solaris 8, 9 and 10, applied on mainline, 4.6 and 4.5 branches.
2012-01-09 Eric Botcazou <ebotcazou@adacore.com>
* config/sparc/sol2-unwind.h (sparc64_is_sighandler): Check that the
purported sigacthandler address isn't null before dereferencing it.
(sparc_is_sighandler): Likewise.
--
Eric Botcazou
Index: config/sparc/sol2-unwind.h
===================================================================
--- config/sparc/sol2-unwind.h (revision 183005)
+++ config/sparc/sol2-unwind.h (working copy)
@@ -124,10 +124,9 @@ sparc64_is_sighandler (unsigned int *pc,
/* This matches the call_user_handler pattern for Solaris 10.
There are 2 cases so we look for the return address of the
caller's caller frame in order to do more pattern matching. */
- unsigned int sah_pattern
- = *(unsigned int *)(*(unsigned long *)(cfa + 176 + 15*8) - 4);
+ unsigned long sah_address = *(unsigned long *)(cfa + 176 + 15*8);
- if (sah_pattern == 0x92100019)
+ if (sah_address && *(unsigned int *)(sah_address - 4) == 0x92100019)
/* This is the same setup as for Solaris 9, see below. */
*nframes = 3;
else
@@ -302,10 +301,9 @@ sparc_is_sighandler (unsigned int *pc, v
/* This matches the call_user_handler pattern for Solaris 10.
There are 2 cases so we look for the return address of the
caller's caller frame in order to do more pattern matching. */
- unsigned int sah_pattern
- = *(unsigned int *)(*(unsigned int *)(cfa + 96 + 15*4) - 4);
+ unsigned int sah_address = *(unsigned int *)(cfa + 96 + 15*4);
- if (sah_pattern == 0x92100019)
+ if (sah_address && *(unsigned int *)(sah_address - 4) == 0x92100019)
/* This is the same setup as for Solaris 9, see below. */
*nframes = 3;
else