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 s390x tst-tls* when built with GCC 3.4+


Hi!

GCC 3.4+ on s390x no longer considers r14 to be a fixed register, so we need
to tell the compiler we are clobbering it, otherwise GCC puts vital
temporaries in it and they get clobbered by the TLS_{LD,GD} macros.
I have built tst-tlsmod2.c with this patch even with GCC 3.3 and it built
just fine.

2004-06-10  Jakub Jelinek  <jakub@redhat.com>

	* elf/tls-macros.h [__s390x__] (TLS_LD, TLS_GD): Clobber also r14.

--- libc/elf/tls-macros.h.jj	2003-09-11 19:35:21.000000000 -0400
+++ libc/elf/tls-macros.h	2004-06-10 17:48:09.000000000 -0400
@@ -484,7 +484,7 @@ register void *__gp __asm__("$29");
 	  "algr %0,%%r2\n\t"						      \
           "lgr %%r12,%1"						      \
 	  : "=&a" (__offset), "=&a" (__save12)				      \
-          : : "cc", "0", "1", "2", "3", "4", "5" );			      \
+          : : "cc", "0", "1", "2", "3", "4", "5", "14" );		      \
      (int *) (__builtin_thread_pointer() + __offset); })
 # else
 #  define TLS_LD(x) \
@@ -497,7 +497,8 @@ register void *__gp __asm__("$29");
 	  "brasl %%r14,__tls_get_offset@plt:tls_ldcall:" #x "\n\t"	      \
 	  "lg %0,8(%0)\n\t"						      \
 	  "algr %0,%%r2"						      \
-	  : "=&a" (__offset) : : "cc", "0", "1", "2", "3", "4", "5", "12" );  \
+	  : "=&a" (__offset)						      \
+	  : : "cc", "0", "1", "2", "3", "4", "5", "12", "14" );		      \
      (int *) (__builtin_thread_pointer() + __offset); })
 # endif
 
@@ -513,7 +514,7 @@ register void *__gp __asm__("$29");
           "lgr %0,%%r2\n\t"						      \
           "lgr %%r12,%1"						      \
 	  : "=&a" (__offset), "=&a" (__save12)				      \
-          : : "cc", "0", "1", "2", "3", "4", "5" );			      \
+          : : "cc", "0", "1", "2", "3", "4", "5", "14" );		      \
      (int *) (__builtin_thread_pointer() + __offset); })
 # else
 #  define TLS_GD(x) \
@@ -524,7 +525,8 @@ register void *__gp __asm__("$29");
 	  "lg %%r2,0(%0)\n\t"						      \
 	  "brasl %%r14,__tls_get_offset@plt:tls_gdcall:" #x "\n\t"	      \
           "lgr %0,%%r2"							      \
-	  : "=&a" (__offset) : : "cc", "0", "1", "2", "3", "4", "5", "12" );  \
+	  : "=&a" (__offset)						      \
+	  : : "cc", "0", "1", "2", "3", "4", "5", "12", "14" );		      \
      (int *) (__builtin_thread_pointer() + __offset); })
 # endif
 

	Jakub


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