summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--elf/elf.h44
-rw-r--r--elf/tls-macros.h52
-rw-r--r--sysdeps/powerpc/powerpc64/elf/configure76
-rw-r--r--sysdeps/powerpc/powerpc64/elf/configure.in61
5 files changed, 243 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 85a99fe3b0..c1d3baab55 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2003-02-25  Steven Munroe  <sjmunroe@us.ibm.com>
+
+        * elf/elf.h: Add new R_PPC64_* relocs for TLS.
+        * elf/tls-macros.h [__powerpc64__]
+        (TLS_LE, TLS_IE, TLS_LD, TLS_GD): Define.
+	* sysdeps/powerpc/powerpc64/elf/configure.in: New file.
+	* sysdeps/powerpc/powerpc64/elf/configure: New file (generated).
+
+        * sysdeps/powerpc/elf/libc-start.c (__libc_start_main):
+	Do DL_SYSDEP_OSCHECK here, matching 2002-12-01 change to generic file.
+
 2003-02-25  Andreas Jaeger  <aj@suse.de>
 
 	* manual/memory.texi (Malloc Tunable Parameters): Clarify
diff --git a/elf/elf.h b/elf/elf.h
index 30d0669040..6f78e3b752 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -1953,8 +1953,50 @@ typedef Elf32_Addr Elf32_Conflict;
 #define R_PPC64_TOC16_LO_DS    64 /* half16ds  #lo(S + A - .TOC.) >> 2.  */
 #define R_PPC64_PLTGOT16_DS    65 /* half16ds* (M + A) >> 2.  */
 #define R_PPC64_PLTGOT16_LO_DS 66 /* half16ds  #lo(M + A) >> 2.  */
+
+/* PowerPC64 relocations defined for the TLS access ABI.  */
+#define R_PPC64_TLS             67 /* none         (sym+add)@tls.  */
+#define R_PPC64_DTPMOD64        68 /* doubleword64 (sym+add)@dtpmod.  */
+#define R_PPC64_TPREL16         69 /* half16*      (sym+add)@tprel.  */
+#define R_PPC64_TPREL16_LO      60 /* half16       (sym+add)@tprel@l. */
+#define R_PPC64_TPREL16_HI      71 /* half16       (sym+add)@tprel@h.  */
+#define R_PPC64_TPREL16_HA      72 /* half16       (sym+add)@tprel@ha.  */
+#define R_PPC64_TPREL64         73 /* doubleword64 (sym+add)@tprel.  */
+#define R_PPC64_DTPREL16        74 /* half16*      (sym+add)@dtprel.  */
+#define R_PPC64_DTPREL16_LO     75 /* half16       (sym+add)@dtprel@l.  */
+#define R_PPC64_DTPREL16_HI     76 /* half16       (sym+add)@dtprel@h.  */
+#define R_PPC64_DTPREL16_HA     77 /* half16       (sym+add)@dtprel@ha.  */
+#define R_PPC64_DTPREL64        78 /* doubleword64 (sym+add)@dtprel.  */
+#define R_PPC64_GOT_TLSGD16     79 /* half16*      (sym+add)@got@tlsgd.  */
+#define R_PPC64_GOT_TLSGD16_LO  80 /* half16       (sym+add)@got@tlsgd@l.  */
+#define R_PPC64_GOT_TLSGD16_HI  81 /* half16       (sym+add)@got@tlsgd@h.  */
+#define R_PPC64_GOT_TLSGD16_HA  82 /* half16       (sym+add)@got@tlsgd@ha.  */
+#define R_PPC64_GOT_TLSLD16     83 /* half16*      (sym+add)@got@tlsld.  */
+#define R_PPC64_GOT_TLSLD16_LO  84 /* half16       (sym+add)@got@tlsld@l.  */
+#define R_PPC64_GOT_TLSLD16_HI  85 /* half16       (sym+add)@got@tlsld@h.  */
+#define R_PPC64_GOT_TLSLD16_HA  86 /* half16       (sym+add)@got@tlsld@ha.  */
+#define R_PPC64_GOT_TPREL16_DS  87 /* half16ds*    (sym+add)@got@tprel.  */
+#define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds   (sym+add)@got@tprel@l.  */
+#define R_PPC64_GOT_TPREL16_HI  89 /* half16       (sym+add)@got@tprel@h.  */
+#define R_PPC64_GOT_TPREL16_HA  90 /* half16       (sym+add)@got@tprel@ha.  */
+#define R_PPC64_GOT_DTPREL16_DS 91 /* half16ds*    (sym+add)@got@dtprel.  */
+#define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds  (sym+add)@got@dtprel@l.  */
+#define R_PPC64_GOT_DTPREL16_HI 93 /* half16       (sym+add)@got@dtprel@h.  */
+#define R_PPC64_GOT_DTPREL16_HA 94 /* half16       (sym+add)@got@dtprel@ha.  */
+#define R_PPC64_TPREL16_DS      95 /* half16ds*    (sym+add)@tprel.  */
+#define R_PPC64_TPREL16_LO_DS   96 /* half16ds     (sym+add)@tprel@l.  */
+#define R_PPC64_TPREL16_HIGHER  97 /* half16       (sym+add)@tprel@higher.  */
+#define R_PPC64_TPREL16_HIGHERA 98 /* half16       (sym+add)@tprel@highera.  */
+#define R_PPC64_TPREL16_HIGHEST 99 /* half16       (sym+add)@tprel@highest.  */
+#define R_PPC64_TPREL16_HIGHESTA 100 /* half16    (sym+add)@tprel@highesta.  */
+#define R_PPC64_DTPREL16_DS    101 /* half16ds*    (sym+add)@dtprel.  */
+#define R_PPC64_DTPREL16_LO_DS 102 /* half16ds     (sym+add)@dtprel@l.  */
+#define R_PPC64_DTPREL16_HIGHER 103 /* half16      (sym+add)@dtprel@higher.  */
+#define R_PPC64_DTPREL16_HIGHERA 104 /* half16    (sym+add)@dtprel@highera.  */
+#define R_PPC64_DTPREL16_HIGHEST 105 /* half16    (sym+add)@dtprel@highest.  */
+#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16  (sym+add)@dtprel@highesta.  */
 /* Keep this the last entry.  */
-#define R_PPC64_NUM		67
+#define R_PPC64_NUM		107
 
 /* The remaining relocs are from the Embedded ELF ABI, and are not
    in the SVR4 ELF ABI.  */
diff --git a/elf/tls-macros.h b/elf/tls-macros.h
index 81736c95b9..a1ae536bef 100644
--- a/elf/tls-macros.h
+++ b/elf/tls-macros.h
@@ -623,6 +623,58 @@ register void *__gp __asm__("$29");
      (int *) (__builtin_thread_pointer() + __offset); })
 # endif
 
+#elif defined __powerpc__ && defined __powerpc64__
+
+/* PowerPC64 Local Exec TLS access.  */
+# define TLS_LE(x) \
+  ({  int * __result;  \
+      asm ( \
+        "  addis %0,13," #x "@tprel@ha\n"  \
+        "  addi  %0,%0," #x "@tprel@l\n"   \
+        : "=b" (__result) );  \
+      __result;  \
+  })
+/* PowerPC64 Initial Exec TLS access.  */
+#  define TLS_IE(x) \
+  ({  int * __result;  \
+      asm (  \
+        "  ld  %0," #x "@got@tprel(2)\n"  \
+        "  add %0,%0," #x "@tls\n"   \
+        : "=b" (__result) );  \
+      __result;  \
+  })
+/* PowerPC64 Local Dynamic TLS access.  */
+#  define TLS_LD(x) \
+  ({  int * __result;  \
+      asm (  \
+        "  addi  3,2," #x "@got@tlsld\n"  \
+        "  bl    .__tls_get_addr\n"  \
+        "  nop   \n"  \
+        "  addis %0,3," #x "@dtprel@ha\n"  \
+        "  addi  %0,%0," #x "@dtprel@l\n"  \
+        : "=b" (__result) :  \
+        : "0", "3", "4", "5", "6", "7",    \
+          "8", "9", "10", "11", "12",      \
+          "lr", "ctr",  \
+          "cr0", "cr1", "cr5", "cr6", "cr7");  \
+      __result;  \
+  })
+/* PowerPC64 General Dynamic TLS access.  */
+#  define TLS_GD(x) \
+  ({  int * __result;  \
+      asm (  \
+        "  addi  3,2," #x "@got@tlsgd\n"  \
+        "  bl    .__tls_get_addr\n"  \
+        "  nop   \n"  \
+        "  mr    %0,3\n"  \
+        : "=b" (__result) :  \
+        : "0", "3", "4", "5", "6", "7",    \
+          "8", "9", "10", "11", "12",      \
+          "lr", "ctr",  \
+          "cr0", "cr1", "cr5", "cr6", "cr7");  \
+      __result;  \
+  })
+
 #else
 # error "No support for this architecture so far."
 #endif
diff --git a/sysdeps/powerpc/powerpc64/elf/configure b/sysdeps/powerpc/powerpc64/elf/configure
new file mode 100644
index 0000000000..22aa75f995
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/elf/configure
@@ -0,0 +1,76 @@
+# This file is generated from configure.in by Autoconf.  DO NOT EDIT!
+ # Local configure fragment for sysdeps/powerpc64/elf.
+
+if test "$usetls" != no; then
+# Check for support of thread-local storage handling in assembler and
+# linker.
+echo "$as_me:$LINENO: checking for powerpc64 TLS support" >&5
+echo $ECHO_N "checking for powerpc64 TLS support... $ECHO_C" >&6
+if test "${libc_cv_powerpc64_tls+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat > conftest.s <<\EOF
+        .section ".tdata","awT",@progbits
+x:      .quad   1
+x1:     .quad   1
+x2:     .quad   1
+x3:     .quad   1
+x4:     .long   1
+        .section ".toc","aw"
+.LC0:
+        .quad	x@dtpmod
+        .quad	x@dtprel
+.LC1:
+        .quad	x1@dtpmod
+        .quad	0
+.LC2:
+	.quad	x@tprel
+        .text
+        addi    3,2,x@got@tlsgd
+        addi    3,2,.LC0@toc
+        addi    3,2,x1@got@tlsld
+        addi    9,3,x1@dtprel
+        addis   9,3,x2@dtprel@ha
+        addi    9,9,x2@dtprel@l
+        ld      9,x3@got@dtprel(2)
+        addi    3,2,.LC0@toc
+        lwz     0,x1@dtprel(3)
+        ld      0,x1@dtprel(3)
+        addis   9,3,x2@dtprel@ha
+        lwz     0,x2@dtprel@l(9)
+        ld      0,x2@dtprel@l(9)
+        ld      9,x3@got@dtprel(2)
+        ld      9,x@got@tprel(2)
+        add     9,9,x@tls
+        ld      9,.LC2@toc(2)
+        add     9,9,.LC2@tls
+        addi    9,13,x1@tprel
+        addis   9,13,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_powerpc64_tls=yes
+else
+  libc_cv_powerpc64_tls=no
+fi
+rm -f conftest*
+fi
+echo "$as_me:$LINENO: result: $libc_cv_powerpc64_tls" >&5
+echo "${ECHO_T}$libc_cv_powerpc64_tls" >&6
+if test $libc_cv_powerpc64_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/powerpc64/elf/configure.in b/sysdeps/powerpc/powerpc64/elf/configure.in
new file mode 100644
index 0000000000..98abcf0356
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/elf/configure.in
@@ -0,0 +1,61 @@
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/powerpc64/elf.
+
+if test "$usetls" != no; then
+# Check for support of thread-local storage handling in assembler and
+# linker.
+AC_CACHE_CHECK(for powerpc64 TLS support, libc_cv_powerpc64_tls, [dnl
+cat > conftest.s <<\EOF
+        .section ".tdata","awT",@progbits
+x:      .quad   1
+x1:     .quad   1
+x2:     .quad   1
+x3:     .quad   1
+x4:     .long   1
+        .section ".toc","aw"
+.LC0:
+        .quad	x@dtpmod
+        .quad	x@dtprel
+.LC1:
+        .quad	x1@dtpmod
+        .quad	0
+.LC2:
+	.quad	x@tprel
+        .text
+        addi    3,2,x@got@tlsgd
+        addi    3,2,.LC0@toc
+        addi    3,2,x1@got@tlsld
+        addi    9,3,x1@dtprel
+        addis   9,3,x2@dtprel@ha
+        addi    9,9,x2@dtprel@l
+        ld      9,x3@got@dtprel(2)
+        addi    3,2,.LC0@toc
+        lwz     0,x1@dtprel(3)
+        ld      0,x1@dtprel(3)
+        addis   9,3,x2@dtprel@ha
+        lwz     0,x2@dtprel@l(9)
+        ld      0,x2@dtprel@l(9)
+        ld      9,x3@got@dtprel(2)
+        ld      9,x@got@tprel(2)
+        add     9,9,x@tls
+        ld      9,.LC2@toc(2)
+        add     9,9,.LC2@tls
+        addi    9,13,x1@tprel
+        addis   9,13,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_powerpc64_tls=yes
+else
+  libc_cv_powerpc64_tls=no
+fi
+rm -f conftest*])
+if test $libc_cv_powerpc64_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)