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

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


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] Fix sparcv9-linux build


Hi!

With the recent _exit.c changes I get SIGBUS whenever a program exits (ie.
already rpcgen breaks out).
The problem is that gcc optimized __GI__exit into:
	illtrap  0xf00
	b  %xcc, 0 <__GI__exit+0x0>
The reason is that sparc INLINE_SYSCALL macros weren't using
volatile asm and thus when not looking at return value it was optimized out.
Fix below, powerpc{32,64} apparently has the same problem, so I've changed
that too. Other arches apparently do use __asm __volatile.

2002-09-29  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/unix/sysv/linux/sparc/sysdep.h (inline_syscall0): Make asm
	volatile.
	(inline_syscall1, inline_syscall2, inline_syscall3, inline_syscall4,
	inline_syscall5, inline_syscall6): Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h (INLINE_SYSCALL):
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h (INLINE_SYSCALL):
	Likewise.

--- libc/sysdeps/unix/sysv/linux/sparc/sysdep.h.jj	2001-08-23 18:51:33.000000000 +0200
+++ libc/sysdeps/unix/sysv/linux/sparc/sysdep.h	2002-09-29 13:21:44.000000000 +0200
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek <jakub@redhat.com>, 2000.
 
@@ -27,9 +27,9 @@
 ({									\
 	register long __o0 __asm__ ("o0");				\
 	register long __g1 __asm__ ("g1") = __NR_##name;		\
-	__asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :		\
-		 "0" (__g1) :						\
-		 __SYSCALL_CLOBBERS);					\
+	__asm __volatile (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :	\
+			  "0" (__g1) :					\
+			  __SYSCALL_CLOBBERS);				\
 	__o0;								\
 })
 
@@ -37,9 +37,9 @@
 ({									\
 	register long __o0 __asm__ ("o0") = (long)(arg1);		\
 	register long __g1 __asm__ ("g1") = __NR_##name;		\
-	__asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :		\
-		 "0" (__g1), "1" (__o0) :				\
-		 __SYSCALL_CLOBBERS);					\
+	__asm __volatile (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :	\
+			  "0" (__g1), "1" (__o0) :			\
+			  __SYSCALL_CLOBBERS);				\
 	__o0;								\
 })
 
@@ -48,9 +48,9 @@
 	register long __o0 __asm__ ("o0") = (long)(arg1);		\
 	register long __o1 __asm__ ("o1") = (long)(arg2);		\
 	register long __g1 __asm__ ("g1") = __NR_##name;		\
-	__asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :		\
-		 "0" (__g1), "1" (__o0), "r" (__o1) :			\
-		 __SYSCALL_CLOBBERS);					\
+	__asm __volatile (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :	\
+			  "0" (__g1), "1" (__o0), "r" (__o1) :		\
+			  __SYSCALL_CLOBBERS);				\
 	__o0;								\
 })
 
@@ -60,9 +60,10 @@
 	register long __o1 __asm__ ("o1") = (long)(arg2);		\
 	register long __o2 __asm__ ("o2") = (long)(arg3);		\
 	register long __g1 __asm__ ("g1") = __NR_##name;		\
-	__asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :		\
-		 "0" (__g1), "1" (__o0), "r" (__o1), "r" (__o2) :	\
-		 __SYSCALL_CLOBBERS);					\
+	__asm __volatile (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :	\
+			  "0" (__g1), "1" (__o0), "r" (__o1),		\
+			  "r" (__o2) :					\
+			  __SYSCALL_CLOBBERS);				\
 	__o0;								\
 })
 
@@ -73,10 +74,10 @@
 	register long __o2 __asm__ ("o2") = (long)(arg3);		\
 	register long __o3 __asm__ ("o3") = (long)(arg4);		\
 	register long __g1 __asm__ ("g1") = __NR_##name;		\
-	__asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :		\
-		 "0" (__g1), "1" (__o0), "r" (__o1), "r" (__o2),	\
-		 "r" (__o3) :						\
-		 __SYSCALL_CLOBBERS);					\
+	__asm __volatile (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :	\
+			  "0" (__g1), "1" (__o0), "r" (__o1),		\
+			  "r" (__o2), "r" (__o3) :			\
+			  __SYSCALL_CLOBBERS);				\
 	__o0;								\
 })
 
@@ -88,10 +89,10 @@
 	register long __o3 __asm__ ("o3") = (long)(arg4);		\
 	register long __o4 __asm__ ("o4") = (long)(arg5);		\
 	register long __g1 __asm__ ("g1") = __NR_##name;		\
-	__asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :		\
-		 "0" (__g1), "1" (__o0), "r" (__o1), "r" (__o2),	\
-		 "r" (__o3), "r" (__o4) :				\
-		 __SYSCALL_CLOBBERS);					\
+	__asm __volatile (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :	\
+			  "0" (__g1), "1" (__o0), "r" (__o1),		\
+			  "r" (__o2), "r" (__o3), "r" (__o4) :		\
+			  __SYSCALL_CLOBBERS);				\
 	__o0;								\
 })
 
@@ -104,10 +105,11 @@
 	register long __o4 __asm__ ("o4") = (long)(arg5);		\
 	register long __o5 __asm__ ("o5") = (long)(arg6);		\
 	register long __g1 __asm__ ("g1") = __NR_##name;		\
-	__asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :		\
-		 "0" (__g1), "1" (__o0), "r" (__o1), "r" (__o2),	\
-		 "r" (__o3), "r" (__o4), "r" (__o5) :			\
-		 __SYSCALL_CLOBBERS);					\
+	__asm __volatile (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) :	\
+			  "0" (__g1), "1" (__o0), "r" (__o1),		\
+			  "r" (__o2), "r" (__o3), "r" (__o4),		\
+			  "r" (__o5) :					\
+			  __SYSCALL_CLOBBERS);				\
 	__o0;								\
 })
 
--- libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h.jj	2002-09-18 00:31:46.000000000 +0200
+++ libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h	2002-09-29 13:23:30.000000000 +0200
@@ -41,11 +41,11 @@
   ({						\
     long ret, err;				\
     LOADARGS_##nr(name, args);			\
-    __asm__ ("sc\n\t"				\
-	     "mfcr	%1\n\t"			\
-	     : "=r" (r3), "=r" (err)		\
-	     : ASM_INPUT_##nr			\
-	     : "cc", "memory");			\
+    __asm __volatile ("sc\n\t"			\
+		      "mfcr	%1\n\t"		\
+		      : "=r" (r3), "=r" (err)	\
+		      : ASM_INPUT_##nr		\
+		      : "cc", "memory");	\
     ret = r3;					\
     if (err & 1 << 28)				\
       {						\
--- libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h.jj	2002-09-18 01:50:03.000000000 +0200
+++ libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h	2002-09-29 13:25:17.000000000 +0200
@@ -57,11 +57,11 @@
     DECLARGS_##nr;				\
     long ret, err;				\
     LOADARGS_##nr(name, args);			\
-    __asm__ ("sc\n\t"				\
-	     "mfcr	%1\n\t"			\
-	     : "=r" (r3), "=r" (err)		\
-	     : ASM_INPUT_##nr			\
-	     : "cc", "memory");			\
+    __asm __volatile ("sc\n\t"			\
+		      "mfcr	%1\n\t"		\
+		      : "=r" (r3), "=r" (err)	\
+		      : ASM_INPUT_##nr		\
+		      : "cc", "memory");	\
     ret = r3;					\
     if (err & 1 << 28)				\
       {						\
@@ -123,18 +123,20 @@
     register long r8 __asm__ ("r8");				\
     long ret, err;						\
     LOADARGS_##nr(name, args);					\
-    __asm__ ("sc\n\t"						\
-	     "mfcr	%7\n\t"					\
-	     : "=r" (r0), "=r" (r3), "=r" (r4), "=r" (r5),	\
-	       "=r" (r6), "=r" (r7), "=r" (r8), "=r" (err)	\
-	     : ASM_INPUT_##nr					\
-	     : "r9", "r10", "r11", "r12",			\
-	       "fr0", "fr1", "fr2", "fr3",			\
-	       "fr4", "fr5", "fr6", "fr7",			\
-	       "fr8", "fr9", "fr10", "fr11",			\
-	       "fr12", "fr13",					\
-	       "ctr", "lr",					\
-	       "cr0", "cr1", "cr5", "cr6", "cr7", "memory");	\
+    __asm __volatile ("sc\n\t"					\
+		      "mfcr	%7\n\t"				\
+		      : "=r" (r0), "=r" (r3), "=r" (r4),	\
+		        "=r" (r5), "=r" (r6), "=r" (r7),	\
+		        "=r" (r8), "=r" (err)			\
+		      : ASM_INPUT_##nr				\
+		      : "r9", "r10", "r11", "r12",		\
+		        "fr0", "fr1", "fr2", "fr3",		\
+			"fr4", "fr5", "fr6", "fr7",		\
+			"fr8", "fr9", "fr10", "fr11",		\
+			"fr12", "fr13",				\
+			"ctr", "lr",				\
+			"cr0", "cr1", "cr5", "cr6", "cr7",	\
+			"memory");				\
     ret = r3;							\
     if (err & 1 << 28)						\
       {								\

	Jakub


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