Patchwork Fix PR target/51921

login
register
mail settings
Submitter Eric Botcazou
Date Feb. 15, 2012, 8:09 a.m.
Message ID <201202150909.07090.ebotcazou@adacore.com>
Download mbox | patch
Permalink /patch/141263/
State New
Headers show

Comments

Eric Botcazou - Feb. 15, 2012, 8:09 a.m.
This fixes the regression in the frame unwinding support on SPARC/Solaris 11 
present on the mainline and 4.6 branch.  Tested (by me) on 6 differents OS 
versions of Solaris 8, 9 and 10 and on Solaris 11 by Ian and Rainer.

Applied on the mainline and 4.6 branch.


2012-02-15  Eric Botcazou  <ebotcazou@adacore.com>

	PR target/51921
	PR target/52205
	* config/sparc/sol2-unwind.h (sparc64_is_sighandler): Add support for
	Solaris 11 and slightly reformat.
	(sparc_is_sighandler): Likewise.

Patch

Index: config/sparc/sol2-unwind.h
===================================================================
--- config/sparc/sol2-unwind.h	(revision 183864)
+++ config/sparc/sol2-unwind.h	(working copy)
@@ -119,7 +119,12 @@  sparc64_is_sighandler (unsigned int *pc,
       unsigned int cuh_pattern
 	= *(unsigned int *)(*(unsigned long *)(cfa + 15*8) - 4);
 
-      if (cuh_pattern == 0xd25fa7ef)
+      if (cuh_pattern == 0x92100019)
+	/* This matches the call_user_handler pattern for Solaris 11.
+	   This is the same setup as for Solaris 9, see below.  */
+	*nframes = 3;
+
+      else if (cuh_pattern == 0xd25fa7ef)
 	{
 	  /* This matches the call_user_handler pattern for Solaris 10.
 	     There are 2 cases so we look for the return address of the
@@ -140,6 +145,7 @@  sparc64_is_sighandler (unsigned int *pc,
 	    */
 	    *nframes = 2;
 	}
+
       else if (cuh_pattern == 0x9410001a || cuh_pattern == 0x94100013)
 	/* This matches the call_user_handler pattern for Solaris 9 and
 	   for Solaris 8 running inside Solaris Containers respectively
@@ -152,7 +158,8 @@  sparc64_is_sighandler (unsigned int *pc,
 		<kernel>
 	*/
 	*nframes = 3;
-      else
+
+      else /* cuh_pattern == 0xe0272010 */
 	/* This is the default Solaris 8 case.
 	   We need to move up two frames:
 
@@ -162,6 +169,7 @@  sparc64_is_sighandler (unsigned int *pc,
 		<kernel>
 	*/
 	*nframes = 2;
+
       return 1;
     }
 
@@ -296,7 +304,12 @@  sparc_is_sighandler (unsigned int *pc, v
       unsigned int cuh_pattern
 	= *(unsigned int *)(*(unsigned int *)(cfa + 15*4) - 4);
 
-      if (cuh_pattern == 0xd407a04c)
+      if (cuh_pattern == 0x92100019)
+	/* This matches the call_user_handler pattern for Solaris 11.
+	   This is the same setup as for Solaris 9, see below.  */
+	*nframes = 3;
+
+      else if (cuh_pattern == 0xd407a04c)
 	{
 	  /* This matches the call_user_handler pattern for Solaris 10.
 	     There are 2 cases so we look for the return address of the
@@ -317,6 +330,7 @@  sparc_is_sighandler (unsigned int *pc, v
 	    */
 	    *nframes = 2;
 	}
+
       else if (cuh_pattern == 0x9410001a || cuh_pattern == 0x9410001b)
 	/* This matches the call_user_handler pattern for Solaris 9 and
 	   for Solaris 8 running inside Solaris Containers respectively.
@@ -329,7 +343,8 @@  sparc_is_sighandler (unsigned int *pc, v
 		<kernel>
 	*/
 	*nframes = 3;
-      else
+
+      else /* cuh_pattern == 0x90100018 */
 	/* This is the default Solaris 8 case.
 	   We need to move up two frames:
 
@@ -339,6 +354,7 @@  sparc_is_sighandler (unsigned int *pc, v
 		<kernel>
 	*/
 	*nframes = 2;
+
       return 1;
     }