From fec417190420a427bec2340853f42051da251b65 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 25 Feb 2003 23:27:06 +0000 Subject: [PATCH] 2003-02-25 Steven Munroe * 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. --- ChangeLog | 11 +++++ elf/elf.h | 44 ++++++++++++++++- elf/tls-macros.h | 52 ++++++++++++++++++++ sysdeps/powerpc/powerpc64/elf/configure | 76 ++++++++++++++++++++++++++++++ sysdeps/powerpc/powerpc64/elf/configure.in | 61 ++++++++++++++++++++++++ 5 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 sysdeps/powerpc/powerpc64/elf/configure create mode 100644 sysdeps/powerpc/powerpc64/elf/configure.in diff --git a/ChangeLog b/ChangeLog index 85a99fe..c1d3baa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2003-02-25 Steven Munroe + + * 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 * manual/memory.texi (Malloc Tunable Parameters): Clarify diff --git a/elf/elf.h b/elf/elf.h index 30d0669..6f78e3b 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 81736c9..a1ae536 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 0000000..22aa75f --- /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 0000000..98abcf0 --- /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) -- 2.7.4