2003-03-02 Roland McGrath <roland@redhat.com>
authorroland <roland>
Sun, 2 Mar 2003 11:41:54 +0000 (11:41 +0000)
committerroland <roland>
Sun, 2 Mar 2003 11:41:54 +0000 (11:41 +0000)
PowerPC TLS support contributed by Paul Mackerras <paulus@samba.org>.
* sysdeps/powerpc/powerpc32/elf/configure.in: New file.
* sysdeps/powerpc/powerpc32/elf/configure: New generated file.
* elf/tls-macros.h [__powerpc__ && !__powerpc64__]
(TLS_LE, TLS_IE, TLS_LD, TLS_GD): Define them.
* sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_rela): Support
new relocs for TLS.

elf/tls-macros.h
sysdeps/powerpc/powerpc32/elf/configure [new file with mode: 0755]
sysdeps/powerpc/powerpc32/elf/configure.in [new file with mode: 0644]

index a1ae536..4d29369 100644 (file)
@@ -623,6 +623,53 @@ register void *__gp __asm__("$29");
      (int *) (__builtin_thread_pointer() + __offset); })
 # endif
 
+#elif defined __powerpc__ && !defined __powerpc64__
+
+# define __TLS_CALL_CLOBBERS                                           \
+       "0", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",       \
+       "lr", "ctr", "cr0", "cr1", "cr5", "cr6", "cr7"
+
+/* PowerPC32 Local Exec TLS access.  */
+# define TLS_LE(x)                             \
+  ({ int *__result;                            \
+     asm ("addi %0,2," #x "@tprel"             \
+         : "=r" (__result));                   \
+     __result; })
+
+/* PowerPC32 Initial Exec TLS access.  */
+# define TLS_IE(x)                                     \
+  ({ int *__result;                                    \
+     asm ("bl _GLOBAL_OFFSET_TABLE_@local-4\n\t"       \
+         "mflr %0\n\t"                                 \
+         "lwz %0," #x "@got@tprel(%0)\n\t"             \
+         "add %0,%0," #x "@tls"                        \
+         : "=b" (__result) :                           \
+         : "lr");                                      \
+     __result; })
+
+/* PowerPC32 Local Dynamic TLS access.  */
+# define TLS_LD(x)                                     \
+  ({ int *__result;                                    \
+     asm ("bl _GLOBAL_OFFSET_TABLE_@local-4\n\t"       \
+         "mflr 3\n\t"                                  \
+         "addi 3,3," #x "@got@tlsld\n\t"               \
+         "bl __tls_get_addr@plt\n\t"                   \
+         "addi %0,3," #x "@dtprel"                     \
+         : "=r" (__result) :                           \
+         : __TLS_CALL_CLOBBERS);                       \
+     __result; })
+
+/* PowerPC32 General Dynamic TLS access.  */
+# define TLS_GD(x)                                     \
+  ({ register int *__result __asm__ ("r3");            \
+     asm ("bl _GLOBAL_OFFSET_TABLE_@local-4\n\t"       \
+         "mflr 3\n\t"                                  \
+         "addi 3,3," #x "@got@tlsgd\n\t"               \
+         "bl __tls_get_addr@plt"                       \
+         : :                                           \
+         : __TLS_CALL_CLOBBERS);                       \
+     __result; })
+
 #elif defined __powerpc__ && defined __powerpc64__
 
 /* PowerPC64 Local Exec TLS access.  */
diff --git a/sysdeps/powerpc/powerpc32/elf/configure b/sysdeps/powerpc/powerpc32/elf/configure
new file mode 100755 (executable)
index 0000000..c4bed2b
--- /dev/null
@@ -0,0 +1,57 @@
+# This file is generated from configure.in by Autoconf.  DO NOT EDIT!
+ # Local configure fragment for sysdeps/powerpc32/elf.
+
+if test "$usetls" != no; then
+# Check for support of thread-local storage handling in assembler and
+# linker.
+echo "$as_me:$LINENO: checking for powerpc32 TLS support" >&5
+echo $ECHO_N "checking for powerpc32 TLS support... $ECHO_C" >&6
+if test "${libc_cv_powerpc32_tls+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat > conftest.s <<\EOF
+       .section ".tdata","awT",@progbits
+x:     .long   1
+x1:    .long   1
+x2:    .long   1
+       .text
+       addi    3,31,x@got@tlsgd
+       addi    3,31,x1@got@tlsld
+       addi    9,3,x1@dtprel
+       addis   9,3,x2@dtprel@ha
+       addi    9,9,x2@dtprel@l
+       lwz     0,x1@dtprel(3)
+       addis   9,3,x2@dtprel@ha
+       lwz     0,x2@dtprel@l(9)
+       lwz     9,x3@got@tprel(31)
+       add     9,9,x@tls
+       addi    9,2,x1@tprel
+       addis   9,2,x2@tprel@ha
+       addi    9,9,x2@tprel@l
+EOF
+if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  libc_cv_powerpc32_tls=yes
+else
+  libc_cv_powerpc32_tls=no
+fi
+rm -f conftest*
+fi
+echo "$as_me:$LINENO: result: $libc_cv_powerpc32_tls" >&5
+echo "${ECHO_T}$libc_cv_powerpc32_tls" >&6
+if test $libc_cv_powerpc32_tls = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_TLS_SUPPORT 1
+_ACEOF
+
+fi
+fi
+
+cat >>confdefs.h <<\_ACEOF
+#define PI_STATIC_AND_HIDDEN 1
+_ACEOF
+
diff --git a/sysdeps/powerpc/powerpc32/elf/configure.in b/sysdeps/powerpc/powerpc32/elf/configure.in
new file mode 100644 (file)
index 0000000..97c300c
--- /dev/null
@@ -0,0 +1,42 @@
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/powerpc32/elf.
+
+if test "$usetls" != no; then
+# Check for support of thread-local storage handling in assembler and
+# linker.
+AC_CACHE_CHECK(for powerpc32 TLS support, libc_cv_powerpc32_tls, [dnl
+cat > conftest.s <<\EOF
+       .section ".tdata","awT",@progbits
+x:     .long   1
+x1:    .long   1
+x2:    .long   1
+       .text
+       addi    3,31,x@got@tlsgd
+       addi    3,31,x1@got@tlsld
+       addi    9,3,x1@dtprel
+       addis   9,3,x2@dtprel@ha
+       addi    9,9,x2@dtprel@l
+       lwz     0,x1@dtprel(3)
+       addis   9,3,x2@dtprel@ha
+       lwz     0,x2@dtprel@l(9)
+       lwz     9,x3@got@tprel(31)
+       add     9,9,x@tls
+       addi    9,2,x1@tprel
+       addis   9,2,x2@tprel@ha
+       addi    9,9,x2@tprel@l
+EOF
+dnl
+if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
+  libc_cv_powerpc32_tls=yes
+else
+  libc_cv_powerpc32_tls=no
+fi
+rm -f conftest*])
+if test $libc_cv_powerpc32_tls = yes; then
+  AC_DEFINE(HAVE_TLS_SUPPORT)
+fi
+fi
+
+dnl It is always possible to access static and hidden symbols in an
+dnl position independent way.
+AC_DEFINE(PI_STATIC_AND_HIDDEN)