diff options
49 files changed, 893 insertions, 385 deletions
@@ -1,3 +1,80 @@ +2003-01-26 Andreas Schwab <schwab@suse.de> + + * sysdeps/wordsize-32/divdi3.c: Export the functions only as + compatibility symbols. Remove INTDEF for __divdi3. + * sysdeps/wordsize-32/lldiv.c: Don't use __divdi3_internal. + * sysdeps/powerpc/powerpc32/divdi3.c: Remove. + * sysdeps/powerpc/powerpc32/Makefile (CPPFLAGS-divdi3.c): Don't + define. + * sysdeps/powerpc/powerpc32/Dist: Remove divdi3.c. + +2003-01-24 Jakub Jelinek <jakub@redhat.com> + + * elf/tls-macros.h: Add SPARC 32-bit definitions. + * sysdeps/sparc/sparc32/elf/configure.in: Add TLS check. + * sysdeps/sparc/sparc32/dl-machine.h: Add dl_machine_h guards + for the first half of the header. Include tls.h. + (elf_machine_type_class): Return ELF_RTYPE_CLASS_PLT for TLS + relocs too. + (elf_machine_rela): Handle TLS relocs. + * sysdeps/sparc/dl-tls.h: New file. + + * sysdeps/unix/sysv/linux/sparc/sparc32/socket.S: Add cancellation + support. + + * sysdeps/sparc/sparc32/sparcv9/hp-timing.h: Use %g6 instead of %g7. + * sysdeps/sparc/sparc32/memchr.S: Likewise. + * sysdeps/sparc/sparc32/memcpy.S: Likewise. + * sysdeps/sparc/sparc32/strcat.S: Likewise. + * sysdeps/sparc/sparc32/strchr.S: Likewise. + * sysdeps/sparc/sparc32/strcmp.S: Likewise. + * sysdeps/sparc/sparc32/strcpy.S: Likewise. + * sysdeps/sparc/sparc64/sparcv9b/memcpy.S: Likewise. + * sysdeps/sparc/sparc64/hp-timing.h: Likewise. + * sysdeps/sparc/sparc64/memcpy.S: Likewise. + * sysdeps/sparc/sparc64/stpcpy.S: Likewise. + * sysdeps/sparc/sparc64/stpncpy.S: Likewise. + * sysdeps/sparc/sparc64/strcat.S: Likewise. + * sysdeps/sparc/sparc64/strchr.S: Likewise. + * sysdeps/sparc/sparc64/strcmp.S: Likewise. + * sysdeps/sparc/sparc64/strcpy.S: Likewise. + * sysdeps/sparc/sparc64/strncmp.S: Likewise. + * sysdeps/sparc/sparc64/strncpy.S: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise. + +2003-01-24 Andreas Schwab <schwab@suse.de> + + * elf/dl-close.c (_dl_close): Don't relocate DT_FINI_ARRAY + elements, and process them backwards. + * elf/Makefile ($(objpfx)tst-array4): New target. + ($(objpfx)tst-array4.out): Likewise. + (tests) [$(have-initfini-array) = yes]: Add tst-array4. + * elf/tst-array4.c: New file. + * elf/tst-array4.exp: Likewise. + +2003-01-24 Steven Munroe <sjmunroe@us.ibm.com> + + * sysdeps/unix/sysv/linux/powerpc/powerpc64/fe_nomask.c: New file. + +2003-01-27 Guido Guenther <agx@sigxcpu.org> + + * sysdeps/unix/sysv/linux/mips/sysdep.h (SYSCALL_ERROR_LABEL): Define. + * sysdeps/unix/sysv/linux/mips/pread.c: Add support for + cancellation handling and handle both __NR_pread64 and __NR_pread. + * sysdeps/unix/sysv/linux/mips/pread64.c: Likewise. + * sysdeps/unix/sysv/linux/mips/pwrite.c: Add support for + cancellation handling and handle both __NR_pwrite64 and __NR_pwrite. + * sysdeps/unix/sysv/linux/mips/pwrite64.c: Likewise. + * sysdeps/unix/mips/sysdep.S: Don't set errno in the _LIBC_REENTRANT + case, use register names consistently. + +2003-01-27 Wolfram Gloger <wg@malloc.de> + + * malloc/hooks.c (mem2chunk_check): Check alignment of mem + pointer, not of the computed chunk. Bug report from Carlos + O'Donell <carlos@baldric.uwo.ca>. + 2003-01-25 Andreas Schwab <schwab@suse.de> * sysdeps/m68k/dl-machine.h (_dl_start_user): Use pc-relative diff --git a/elf/Makefile b/elf/Makefile index c6320d8867..09ea94800d 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -121,7 +121,7 @@ endif tests = tst-tls1 tst-tls2 tst-tls9 ifeq (yes,$(have-initfini-array)) -tests += tst-array1 tst-array2 tst-array3 +tests += tst-array1 tst-array2 tst-array3 tst-array4 endif ifeq (yes,$(build-static)) tests-static = tst-tls1-static tst-tls2-static @@ -594,6 +594,12 @@ $(objpfx)tst-array3.out: $(objpfx)tst-array3 $(objpfx)tst-array3 > $@ cmp $@ tst-array1.exp > /dev/null +$(objpfx)tst-array4: $(libdl) +$(objpfx)tst-array4.out: $(objpfx)tst-array4 $(objpfx)tst-array2dep.so + $(elf-objpfx)$(rtld-installed-name) \ + --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \ + $< > $@ + cmp $@ tst-array4.exp > /dev/null check-textrel-CFLAGS = -O $(objpfx)check-textrel: check-textrel.c diff --git a/elf/dl-close.c b/elf/dl-close.c index cdebc739e8..1d4a8c3653 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -238,10 +238,9 @@ _dl_close (void *_map) + imap->l_info[DT_FINI_ARRAY]->d_un.d_ptr); unsigned int sz = (imap->l_info[DT_FINI_ARRAYSZ]->d_un.d_val / sizeof (ElfW(Addr))); - unsigned int cnt; - for (cnt = 0; cnt < sz; ++cnt) - ((fini_t) (imap->l_addr + array[cnt])) (); + while (sz-- > 0) + ((fini_t) array[sz]) (); } /* Next try the old-style destructor. */ diff --git a/elf/tls-macros.h b/elf/tls-macros.h index 046a7d4c92..2de4b1a1af 100644 --- a/elf/tls-macros.h +++ b/elf/tls-macros.h @@ -298,6 +298,75 @@ register void *__gp __asm__("$29"); : "=r" (__l) : : "loc0", __TLS_CALL_CLOBBERS); \ __l; }) +#elif defined __sparc__ && !defined __arch64__ + +# define TLS_LE(x) \ + ({ int *__l; \ + asm ("sethi %%tle_hix22(" #x "), %0" : "=r" (__l)); \ + asm ("xor %1, %%tle_lox10(" #x "), %0" : "=r" (__l) : "r" (__l)); \ + asm ("add %%g7, %1, %0" : "=r" (__l) : "r" (__l)); \ + __l; }) + +# ifdef __PIC__ +# define TLS_LOAD_PIC \ + ({ register long pc __asm__ ("%o7"); \ + long got; \ + asm ("sethi %%hi(_GLOBAL_OFFSET_TABLE_-4), %1\n\t" \ + "call .+8\n\t" \ + "add %1, %%lo(_GLOBAL_OFFSET_TABLE_+4), %1\n\t" \ + "add %1, %0, %1\n\t" \ + : "=r" (pc), "=r" (got)); \ + got; }) +# else +# define TLS_LOAD_PIC \ + ({ long got; \ + asm (".hidden _GLOBAL_OFFSET_TABLE_\n\t" \ + "sethi %%hi(_GLOBAL_OFFSET_TABLE_), %0\n\t" \ + "or %0, %%lo(_GLOBAL_OFFSET_TABLE_), %0" \ + : "=r" (got)); \ + got; }) +# endif + +# define TLS_IE(x) \ + ({ int *__l; \ + asm ("sethi %%tie_hi22(" #x "), %0" : "=r" (__l)); \ + asm ("add %1, %%tie_lo10(" #x "), %0" : "=r" (__l) : "r" (__l)); \ + asm ("ld [%1 + %2], %0, %%tie_ld(" #x ")" \ + : "=r" (__l) : "r" (TLS_LOAD_PIC), "r" (__l)); \ + asm ("add %%g7, %1, %0, %%tie_add(" #x ")" : "=r" (__l) : "r" (__l)); \ + __l; }) + +# define TLS_LD(x) \ + ({ int *__l; register void *__o0 asm ("%o0"); \ + long __o; \ + asm ("sethi %%tldm_hi22(" #x "), %0" : "=r" (__l)); \ + asm ("add %1, %%tldm_lo10(" #x "), %0" : "=r" (__l) : "r" (__l)); \ + asm ("add %1, %2, %0, %%tldm_add(" #x ")" \ + : "=r" (__o0) : "r" (TLS_LOAD_PIC), "r" (__l)); \ + asm ("call __tls_get_addr, %%tgd_call(" #x ")\n\t" \ + " nop" \ + : "=r" (__o0) : "0" (__o0) \ + : "g1", "g2", "g3", "g4", "g5", "g6", "o1", "o2", "o3", "o4", \ + "o5", "o7"); \ + asm ("sethi %%tldo_hix22(" #x "), %0" : "=r" (__o)); \ + asm ("xor %1, %%tldo_lox10(" #x "), %0" : "=r" (__o) : "r" (__o)); \ + asm ("add %1, %2, %0, %%tldo_add(" #x ")" : "=r" (__l) \ + : "r" (__o0), "r" (__o)); \ + __l; }) + +# define TLS_GD(x) \ + ({ int *__l; register void *__o0 asm ("%o0"); \ + asm ("sethi %%tgd_hi22(" #x "), %0" : "=r" (__l)); \ + asm ("add %1, %%tgd_lo10(" #x "), %0" : "=r" (__l) : "r" (__l)); \ + asm ("add %1, %2, %0, %%tgd_add(" #x ")" \ + : "=r" (__o0) : "r" (TLS_LOAD_PIC), "r" (__l)); \ + asm ("call __tls_get_addr, %%tgd_call(" #x ")\n\t" \ + " nop" \ + : "=r" (__o0) : "0" (__o0) \ + : "g1", "g2", "g3", "g4", "g5", "g6", "o1", "o2", "o3", "o4", \ + "o5", "o7"); \ + __o0; }) + #else # error "No support for this architecture so far." #endif diff --git a/elf/tst-array4.c b/elf/tst-array4.c new file mode 100644 index 0000000000..ac3d4eb716 --- /dev/null +++ b/elf/tst-array4.c @@ -0,0 +1,18 @@ +#include <dlfcn.h> + +#define main array1_main +#include "tst-array1.c" +#undef main + +int +main (void) +{ + void *handle = dlopen ("tst-array2dep.so", RTLD_LAZY); + + array1_main (); + + if (handle != NULL) + dlclose (handle); + + return 0; +} diff --git a/elf/tst-array4.exp b/elf/tst-array4.exp new file mode 100644 index 0000000000..560444d2e8 --- /dev/null +++ b/elf/tst-array4.exp @@ -0,0 +1,19 @@ +preinit array 0 +preinit array 1 +preinit array 2 +init +init array 0 +init array 1 +init array 2 +DSO init +DSO init array 0 +DSO init array 1 +DSO init array 2 +DSO fini array 2 +DSO fini array 1 +DSO fini array 0 +DSO fini +fini array 2 +fini array 1 +fini array 0 +fini diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index d81864b977..2949321c65 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,19 @@ +2003-01-24 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/sparc/sparc32/pt-machine.h (__thread_self): Change to %g7, + as required by TLS ABI. + * sysdeps/sparc/sparc64/pt-machine.h (__thread_self): Likewise. + * sysdeps/sparc/tls.h [HAVE_TLS_SUPPORT] (USE_TLS, TLS_INIT_TCB_SIZE, + TLS_INIT_TCB_ALIGN, TLS_TCB_SIZE, TLS_TCB_ALIGN, TLS_TCB_AT_TP, + INSTALL_DTV, INSTALL_NEW_DTV, GET_DTV, TLS_INIT_TP, THREAD_DTV): + Define. + [HAVE_TLS_SUPPORT]: Include descr.h and sysdep.h. + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Use %g7 + instead of %g6 for thread pointer. + * sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S: Likewise. + 2003-01-25 Guido Guenther <agx@sigxcpu.org> * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h: New file. diff --git a/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h b/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h index 2e912332f5..cbfc872df2 100644 --- a/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h +++ b/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h @@ -1,6 +1,6 @@ /* Machine-dependent pthreads configuration and inline functions. sparc version. - Copyright (C) 1996,1997,1998,2000,2001,2002 Free Software Foundation, Inc. + Copyright (C) 1996-1998, 2000-2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson <rth@tamu.edu>. @@ -53,10 +53,10 @@ testandset (int *spinlock) register char *stack_pointer __asm__("%sp"); -/* Registers %g6 and %g7 are reserved by the ABI for "system use". It - happens that Solaris uses %g6 for the thread pointer -- we do the same. */ +/* Registers %g6 and %g7 are reserved by the ABI for "system use". + %g7 is specified in the TLS ABI as thread pointer -- we do the same. */ struct _pthread_descr_struct; -register struct _pthread_descr_struct *__thread_self __asm__("%g6"); +register struct _pthread_descr_struct *__thread_self __asm__("%g7"); /* Return the thread descriptor for the current thread. */ #define THREAD_SELF __thread_self diff --git a/linuxthreads/sysdeps/sparc |
