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] Linuxthreads enable Altivec for setjmp/longjmp part 4 of5


With changes to merge trivial differences between the 32-/64-bit source into common powerpc source.



2004-02-10  Steven Munroe  <sjmunroe@us.ibm.com>

	* Makefile(libpthread-routines): Add ptcleanup
	* ptlongjmp.c: Removed.
	* ptcleanup.c: Copied __pthread_cleanup_upto to here. New file.
	* sysdeps/pthread/ptlongjmp.c: Copied longjmp to here. New file.
	* sysdeps/unix/sysv/linux/powerpc/Versions: New file. 
	Version longjmp, siglongjmp for GLIBC_2.3.4.
	* sysdeps/unix/sysv/linux/powerpc/ptlongjmp.c: New File.

diff -urN libc23-cvstip-20040210/linuxthreads/Makefile libc23/linuxthreads/Makefile
--- libc23-cvstip-20040210/linuxthreads/Makefile	2004-01-01 12:43:01.000000000 -0600
+++ libc23/linuxthreads/Makefile	2004-02-11 10:49:59.000000000 -0600
@@ -49,7 +49,8 @@
 		       ptw-lseek64 ptw-llseek ptw-msync ptw-nanosleep \
 		       ptw-open ptw-open64 ptw-pause ptw-pread ptw-pread64 \
 		       ptw-pwrite ptw-pwrite64 ptw-tcdrain ptw-wait \
-		       ptw-waitpid pt-system old_pthread_atfork pthread_atfork
+		       ptw-waitpid pt-system old_pthread_atfork pthread_atfork \
+		       ptcleanup
 # Don't generate deps for calls with no sources.  See sysdeps/unix/Makefile.
 omit-deps = $(unix-syscalls:%=ptw-%)
 
diff -urN libc23-cvstip-20040210/linuxthreads/ptcleanup.c libc23/linuxthreads/ptcleanup.c
--- libc23-cvstip-20040210/linuxthreads/ptcleanup.c	Wed Dec 31 17:00:00 1969
+++ libc23/linuxthreads/ptcleanup.c	Wed Feb 11 10:49:59 2004
@@ -0,0 +1,53 @@
+/* Linuxthreads - a simple clone()-based implementation of Posix        */
+/* threads for Linux.                                                   */
+/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr)              */
+/*                                                                      */
+/* This program is free software; you can redistribute it and/or        */
+/* modify it under the terms of the GNU Library General Public License  */
+/* as published by the Free Software Foundation; either version 2       */
+/* of the License, or (at your option) any later version.               */
+/*                                                                      */
+/* This program 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 Library General Public License for more details.                 */
+
+/* Redefine siglongjmp and longjmp so that they interact correctly
+   with cleanup handlers */
+
+#include <setjmp.h>
+#include "pthread.h"
+#include "internals.h"
+
+void __pthread_cleanup_upto (__jmp_buf target, char *targetframe)
+{
+  pthread_descr self = thread_self();
+  struct _pthread_cleanup_buffer * c;
+
+  for (c = THREAD_GETMEM(self, p_cleanup);
+       c != NULL && _JMPBUF_UNWINDS(target, c);
+       c = c->__prev)
+    {
+#if _STACK_GROWS_DOWN
+      if ((char *) c <= targetframe)
+	{
+	  c = NULL;
+	  break;
+	}
+#elif _STACK_GROWS_UP
+      if ((char *) c >= targetframe)
+	{
+	  c = NULL;
+	  break;
+	}
+#else
+# error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP"
+#endif
+      c->__routine(c->__arg);
+    }
+  THREAD_SETMEM(self, p_cleanup, c);
+  if (THREAD_GETMEM(self, p_in_sighandler)
+      && _JMPBUF_UNWINDS(target, THREAD_GETMEM(self, p_in_sighandler)))
+    THREAD_SETMEM(self, p_in_sighandler, NULL);
+}
+
diff -urN libc23-cvstip-20040210/linuxthreads/ptlongjmp.c libc23/linuxthreads/ptlongjmp.c
--- libc23-cvstip-20040210/linuxthreads/ptlongjmp.c	Thu Jan 02 18:32:20 2003
+++ libc23/linuxthreads/ptlongjmp.c	Wed Dec 31 17:00:00 1969
@@ -1,72 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix        */
-/* threads for Linux.                                                   */
-/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr)              */
-/*                                                                      */
-/* This program is free software; you can redistribute it and/or        */
-/* modify it under the terms of the GNU Library General Public License  */
-/* as published by the Free Software Foundation; either version 2       */
-/* of the License, or (at your option) any later version.               */
-/*                                                                      */
-/* This program 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 Library General Public License for more details.                 */
-
-/* Redefine siglongjmp and longjmp so that they interact correctly
-   with cleanup handlers */
-
-#include <setjmp.h>
-#include "pthread.h"
-#include "internals.h"
-
-/* These functions are not declared anywhere since they shouldn't be
-   used at another place but here.  */
-extern void __libc_siglongjmp (sigjmp_buf env, int val)
-     __attribute__ ((noreturn));
-extern void __libc_longjmp (sigjmp_buf env, int val)
-     __attribute__ ((noreturn));
-
-
-void __pthread_cleanup_upto (__jmp_buf target, char *targetframe)
-{
-  pthread_descr self = thread_self();
-  struct _pthread_cleanup_buffer * c;
-
-  for (c = THREAD_GETMEM(self, p_cleanup);
-       c != NULL && _JMPBUF_UNWINDS(target, c);
-       c = c->__prev)
-    {
-#if _STACK_GROWS_DOWN
-      if ((char *) c <= targetframe)
-	{
-	  c = NULL;
-	  break;
-	}
-#elif _STACK_GROWS_UP
-      if ((char *) c >= targetframe)
-	{
-	  c = NULL;
-	  break;
-	}
-#else
-# error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP"
-#endif
-      c->__routine(c->__arg);
-    }
-  THREAD_SETMEM(self, p_cleanup, c);
-  if (THREAD_GETMEM(self, p_in_sighandler)
-      && _JMPBUF_UNWINDS(target, THREAD_GETMEM(self, p_in_sighandler)))
-    THREAD_SETMEM(self, p_in_sighandler, NULL);
-}
-
-#ifdef SHARED
-void siglongjmp (sigjmp_buf env, int val)
-{
-  __libc_siglongjmp (env, val);
-}
-
-void longjmp (jmp_buf env, int val)
-{
-  __libc_longjmp (env, val);
-}
-#endif
diff -urN libc23-cvstip-20040210/linuxthreads/sysdeps/pthread/ptlongjmp.c libc23/linuxthreads/sysdeps/pthread/ptlongjmp.c
--- libc23-cvstip-20040210/linuxthreads/sysdeps/pthread/ptlongjmp.c	Wed Dec 31 17:00:00 1969
+++ libc23/linuxthreads/sysdeps/pthread/ptlongjmp.c	Wed Feb 11 10:49:59 2004
@@ -0,0 +1,39 @@
+/* Linuxthreads - a simple clone()-based implementation of Posix        */
+/* threads for Linux.                                                   */
+/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr)              */
+/*                                                                      */
+/* This program is free software; you can redistribute it and/or        */
+/* modify it under the terms of the GNU Library General Public License  */
+/* as published by the Free Software Foundation; either version 2       */
+/* of the License, or (at your option) any later version.               */
+/*                                                                      */
+/* This program 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 Library General Public License for more details.                 */
+
+/* Redefine siglongjmp and longjmp so that they interact correctly
+   with cleanup handlers */
+
+#include <setjmp.h>
+#include "pthread.h"
+#include "internals.h"
+
+/* These functions are not declared anywhere since they shouldn't be
+   used at another place but here.  */
+extern void __libc_siglongjmp (sigjmp_buf env, int val)
+     __attribute__ ((noreturn));
+extern void __libc_longjmp (sigjmp_buf env, int val)
+     __attribute__ ((noreturn));
+
+#ifdef SHARED
+void siglongjmp (sigjmp_buf env, int val)
+{
+  __libc_siglongjmp (env, val);
+}
+
+void longjmp (jmp_buf env, int val)
+{
+  __libc_longjmp (env, val);
+}
+#endif
diff -urN libc23-cvstip-20040210/linuxthreads/sysdeps/unix/sysv/linux/powerpc/Versions libc23/linuxthreads/sysdeps/unix/sysv/linux/powerpc/Versions
--- libc23-cvstip-20040210/linuxthreads/sysdeps/unix/sysv/linux/powerpc/Versions	Wed Dec 31 17:00:00 1969
+++ libc23/linuxthreads/sysdeps/unix/sysv/linux/powerpc/Versions	Wed Feb 11 10:49:59 2004
@@ -0,0 +1,5 @@
+libpthread {
+  GLIBC_2.3.4 {
+	longjmp;  siglongjmp;
+  }
+}
diff -urN libc23-cvstip-20040210/linuxthreads/sysdeps/unix/sysv/linux/powerpc/ptlongjmp.c libc23/linuxthreads/sysdeps/unix/sysv/linux/powerpc/ptlongjmp.c
--- libc23-cvstip-20040210/linuxthreads/sysdeps/unix/sysv/linux/powerpc/ptlongjmp.c	Wed Dec 31 17:00:00 1969
+++ libc23/linuxthreads/sysdeps/unix/sysv/linux/powerpc/ptlongjmp.c	Wed Feb 11 10:49:59 2004
@@ -0,0 +1,70 @@
+/* Linuxthreads - a simple clone()-based implementation of Posix        */
+/* threads for Linux.                                                   */
+/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr)              */
+/*                                                                      */
+/* This program is free software; you can redistribute it and/or        */
+/* modify it under the terms of the GNU Library General Public License  */
+/* as published by the Free Software Foundation; either version 2       */
+/* of the License, or (at your option) any later version.               */
+/*                                                                      */
+/* This program 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 Library General Public License for more details.                 */
+
+/* Redefine siglongjmp and longjmp so that they interact correctly
+   with cleanup handlers */
+/* Derived from linuxthreads/ptlongjmp.c & added AltiVec/VMX versioning. */
+#include "pthread.h"
+#include <setjmp.h>
+#include <bits/wordsize.h>
+#include <shlib-compat.h>
+#if defined SHARED && SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_3_4)
+
+/* These functions are not declared anywhere since they shouldn't be
+   used at another place but here.  */
+extern void __novmx__libc_siglongjmp (sigjmp_buf env, int val)
+     __attribute__ ((noreturn));
+extern void __novmx__libc_longjmp (sigjmp_buf env, int val)
+     __attribute__ ((noreturn));
+
+
+void __novmx_siglongjmp (sigjmp_buf env, int val)
+{
+  __novmx__libc_siglongjmp (env, val);
+}
+
+void __novmx_longjmp (jmp_buf env, int val)
+{
+  __novmx__libc_longjmp (env, val);
+}
+
+# if __WORDSIZE == 64
+symbol_version (__novmx_longjmp,longjmp,GLIBC_2.3);
+symbol_version (__novmx_siglongjmp,siglongjmp,GLIBC_2.3);
+# else
+symbol_version (__novmx_longjmp,longjmp,GLIBC_2.0);
+symbol_version (__novmx_siglongjmp,siglongjmp,GLIBC_2.0);
+# endif
+#endif  /* defined SHARED && SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_3_4) ) */
+
+/* These functions are not declared anywhere since they shouldn't be
+   used at another place but here.  */
+extern void __vmx__libc_siglongjmp (sigjmp_buf env, int val)
+     __attribute__ ((noreturn));
+extern void __vmx__libc_longjmp (sigjmp_buf env, int val)
+     __attribute__ ((noreturn));
+
+#ifdef SHARED
+void __vmx_siglongjmp (sigjmp_buf env, int val)
+{
+  __vmx__libc_siglongjmp (env, val);
+}
+
+void __vmxlongjmp (jmp_buf env, int val)
+{
+  __vmx__libc_longjmp (env, val);
+}
+#endif
+default_symbol_version (__vmx_longjmp,longjmp,GLIBC_2.3.4);
+default_symbol_version (__vmx_siglongjmp,siglongjmp,GLIBC_2.3.4);

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