This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] PPC64 fix for Bugz# 269


2nd try with added testcase.

This captures the callers TOC for the dynamic case and saves it in the jmpbuf (without clobbering the libc.so's TOC). Also handle the special case of internal libc.so calles which don't save the TOC. Then it is safe for __longjmp to retore the TOC (R2) to the TOC save area on the (jmpbuf's) previous frame.

2004-07-16  Steven Munroe  <sjmunroe@us.ibm.com>

	[BZ #269]
	* setjmp/Makefile (tests): Add  bug269-setjmp.
	* setjmp/bug269-setjmp.c: New file.
	* sysdeps/powerpc/powerpc64/__longjmp-common.S [SHARED && !IS_IN_rtld]:
	Store R2 from jmpbuf in callers TOC save area.
	* sysdeps/powerpc/powerpc64/bsd-_setjmp.S [SHARED && !IS_IN_rtld]:
	Store R2 in TOC save area.
	* sysdeps/powerpc/powerpc64/setjmp-common.S [SHARED && !IS_IN_rtld]:
	Copy TOC save area from previous frame as R2 (TOC) in jmpbuf.


diff -urN libc23-cvstip-20040713/setjmp/Makefile libc23/setjmp/Makefile
--- libc23-cvstip-20040713/setjmp/Makefile	2001-07-05 23:55:39.000000000 -0500
+++ libc23/setjmp/Makefile	2004-07-16 15:43:50.346389296 -0500
@@ -26,7 +26,7 @@
 routines	:= setjmp sigjmp bsd-setjmp bsd-_setjmp \
 		   longjmp __longjmp jmp-unwind
 
-tests		:= tst-setjmp jmpbug
+tests		:= tst-setjmp jmpbug bug269-setjmp
 
 
 include ../Rules
diff -urN libc23-cvstip-20040713/setjmp/bug269-setjmp.c libc23/setjmp/bug269-setjmp.c
--- libc23-cvstip-20040713/setjmp/bug269-setjmp.c	Wed Dec 31 18:00:00 1969
+++ libc23/setjmp/bug269-setjmp.c	Fri Jul 16 15:46:42 2004
@@ -0,0 +1,104 @@
+/* Copyright (C) 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */ ;
+
+/* Test case for Bugzilla # 269 */
+
+#include <stdio.h>
+#include <setjmp.h>
+#include <stdlib.h>
+
+jmp_buf buf1;
+jmp_buf buf2;
+int *p;
+int n_x = 6;
+
+static int g_counter = 0;
+
+int
+f (void) 
+{
+  static int counter = 0;
+  static int way_point1 = 3;
+  static int way_point2 = 2;
+  int lose = 0;
+
+  if (setjmp (buf1) != 101)
+    {
+      int a[n_x];		/* reallocate stack space */
+      g_counter++;
+      p = &a[0];
+      if (g_counter < 5)
+	longjmp (buf1, 2);
+      else if (g_counter == 5)
+	longjmp (buf1, 101);
+      else
+	{
+	  _setjmp (buf2);
+	  _longjmp (buf1, 101);
+	}
+    }
+
+  way_point1--;
+
+  if (counter == 0)
+    {
+      counter++;
+      {
+	int a[n_x];		/* reallocate stack space */
+	g_counter++;
+	p = &a[0];
+	if (g_counter < 5)
+	  longjmp (buf1, 2);
+	else if (g_counter == 5)
+	  longjmp (buf1, 101);
+	else
+	  {
+	    _setjmp (buf2);
+	    _longjmp (buf1, 101);
+	  }
+      }
+    }
+
+  way_point2--;
+
+  if (counter == 1)
+    {
+      counter++;
+      longjmp (buf2, 2);
+    }
+
+  lose = !(way_point1 == 0 && way_point2 == 0
+	   && g_counter == 6 && counter == 2);
+
+  return lose;
+}
+
+int
+main (int argc, char *argv[])
+{
+  int lose;
+
+  lose = f ();
+
+  if (lose)
+    puts ("Test FAILED!");
+  else
+    puts ("Test succeeded!");
+
+  return lose ? EXIT_FAILURE : EXIT_SUCCESS;
+}
diff -urN libc23-cvstip-20040713/sysdeps/powerpc/powerpc64/__longjmp-common.S libc23/sysdeps/powerpc/powerpc64/__longjmp-common.S
--- libc23-cvstip-20040713/sysdeps/powerpc/powerpc64/__longjmp-common.S	2004-05-28 16:19:15.000000000 -0500
+++ libc23/sysdeps/powerpc/powerpc64/__longjmp-common.S	2004-07-15 17:39:12.171310648 -0500
@@ -112,6 +112,9 @@
 	ld r0,(JB_LR*8)(r3)
 	ld r14,((JB_GPRS+0)*8)(r3)
 	lfd fp14,((JB_FPRS+0)*8)(r3)
+#if defined SHARED && !defined IS_IN_rtld
+	std r2,40(r1)	/* Restore the callers TOC save area.  */
+#endif
 	ld r15,((JB_GPRS+1)*8)(r3)
 	lfd fp15,((JB_FPRS+1)*8)(r3)
 	ld r16,((JB_GPRS+2)*8)(r3)
@@ -125,6 +128,7 @@
 	ld r20,((JB_GPRS+6)*8)(r3)
 	lfd fp20,((JB_FPRS+6)*8)(r3)
 	mtlr r0
+/* 	std r2,40(r1)	Restore the TOC save area.  */
 	ld r21,((JB_GPRS+7)*8)(r3)
 	lfd fp21,((JB_FPRS+7)*8)(r3)
 	ld r22,((JB_GPRS+8)*8)(r3)
diff -urN libc23-cvstip-20040713/sysdeps/powerpc/powerpc64/bsd-_setjmp.S libc23/sysdeps/powerpc/powerpc64/bsd-_setjmp.S
--- libc23-cvstip-20040713/sysdeps/powerpc/powerpc64/bsd-_setjmp.S	2004-03-17 11:26:38.000000000 -0600
+++ libc23/sysdeps/powerpc/powerpc64/bsd-_setjmp.S	2004-07-15 18:23:43.562364760 -0500
@@ -47,6 +47,9 @@
    as a libc_hidden_proto & is used in sysdeps/generic/libc-start.c
    if HAVE_CLEANUP_JMP_BUF is defined */
 ENTRY (BP_SYM (__GI__setjmp))
+#if defined SHARED && !defined IS_IN_rtld
+	std r2,40(r1)	/* Save the callers TOC in the save area.  */
+#endif
 	li r4,0			/* Set second argument to 0.  */
 	b JUMPTARGET(BP_SYM (__vmx__sigsetjmp))
 END (BP_SYM (__GI__setjmp))
diff -urN libc23-cvstip-20040713/sysdeps/powerpc/powerpc64/setjmp-common.S libc23/sysdeps/powerpc/powerpc64/setjmp-common.S
--- libc23-cvstip-20040713/sysdeps/powerpc/powerpc64/setjmp-common.S	2004-05-28 16:19:15.000000000 -0500
+++ libc23/sysdeps/powerpc/powerpc64/setjmp-common.S	2004-07-15 18:04:01.022289672 -0500
@@ -44,7 +44,12 @@
 	CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
 	std  r1,(JB_GPR1*8)(3)
 	mflr r0
+#if defined SHARED && !defined IS_IN_rtld
+	ld   r5,40(r1)	/* Retrieve the callers TOC.  */
+	std  r5,(JB_GPR2*8)(3)
+#else
 	std  r2,(JB_GPR2*8)(3)
+#endif
 	std  r14,((JB_GPRS+0)*8)(3)
 	stfd fp14,((JB_FPRS+0)*8)(3)
 	std  r0,(JB_LR*8)(3)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]