Skip to content

Commit

Permalink
* sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_runtime_setup):
Browse files Browse the repository at this point in the history
	Handle prelinked libraries and binaries with new style PLT.

2005-06-07  Jakub Jelinek  <jakub@redhat.com>

	* elf/elf.h (R_PPC_REL16, R_PPC_REL16_LO, R_PPC_REL16_HI,
	R_PPC_REL16_HA): Define.

2005-06-14  Alan Modra  <amodra@bigpond.net.au>

	* config.h.in (HAVE_ASM_PPC_REL16): Add.
	* elf/elf.h (DT_PPC_GOT, DT_PPC_NUM): Define.
	* elf/tls-macros.h (PowerPC32): Include config.h.  Add variants of
	TLS_IE, TLS_LD and TLS_GD for new PLT/GOT layout.
	* sysdeps/powerpc/powerpc32/configure.in: New file,
	* sysdeps/powerpc/powerpc32/dl-dtprocnum.h: New file.
	* sysdeps/powerpc/powerpc32/dl-machine.h (DT_PPC): Define.
	(ppc_got): New inline function.
	(elf_machine_dynamic): Use ppc_got.  Add attribute const.
	(elf_machine_load_address): Add attribute const.  Don't use int vars.
	Use bcl rather than bl to save trashing branch target stack.  Use
	elf_machine_dynamic rather than duplicating code here.
	(elf_machine_runtime_setup): New inline function replacing define.
	Handle new PLT.
	(elf_machine_fixup_plt): Handle new PLT.
	(elf_machine_rela): Likewise.
	* sysdeps/powerpc/powerpc32/sysdep.h: Include config.h.
	(CALL_MCOUNT): Don't set up counter vars.
	* sysdeps/powerpc/powerpc32/ppc-mcount.S: Correct comment.
	* sysdeps/powerpc/powerpc32/elf/start.S (start_addressesp): Don't
	define when HAVE_ASM_PPC_REL16.
	(_start): Add HAVE_ASM_PPC_REL16 code.
	* sysdeps/powerpc/powerpc32/dl-start.S (_dl_start_user): Don't bl
	into the GOT when HAVE_ASM_PPC_REL16.
	* sysdeps/powerpc/powerpc32/memset.S (memset): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S (__longjmp): Ditto.
	* sysdeps/powerpc/powerpc32/fpu/s_ceil.S (__ceil): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_ceilf.S (__ceilf): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_floor.S (__floor): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_floorf.S (__floorf): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_lround.S (__lround): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_rint.S (__rint): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_rintf.S (__rintf): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_round.S (__round): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_roundf.S (__roundf): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_trunc.S (__trunc): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_truncf.S (__truncf): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/setjmp-common.S (__sigsetjmp):
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/brk.S (__brk): Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S
	(__getcontext): Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S
	(__setcontext): Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext.S
	(__swapcontext): Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/socket.S (stackblock):
	Comment.
	(__socket): Bomb if NARGS >= 7.  Invoke CGOTSETUP and CGOTRESTORE.

2005-06-17  Ulrich Drepper  <drepper@redhat.com>

	* sysdeps/posix/sigignore.c: Include <string.h> to tell the compiler
	to use __GI_memset.
	* sysdeps/posix/signal.c: Likewise.
	* sysdeps/posix/sigset.c: Likewise.
	* sysdeps/posix/sysv_signal.c: Likewise.
	* sysdeps/unix/sysv/linux/sleep.c: Likewise.
	* sysdeps/unix/sysv/linux/sysctl.c: Likewise.
	* sysdeps/unix/sysv/linux/system.c: Likewise.
  • Loading branch information
Ulrich Drepper committed Jun 17, 2005
1 parent 7b01092 commit 99c7f87
Show file tree
Hide file tree
Showing 43 changed files with 551 additions and 79 deletions.
73 changes: 73 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,76 @@
2005-06-10 Jakub Jelinek <jakub@redhat.com>

* sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_runtime_setup):
Handle prelinked libraries and binaries with new style PLT.

2005-06-07 Jakub Jelinek <jakub@redhat.com>

* elf/elf.h (R_PPC_REL16, R_PPC_REL16_LO, R_PPC_REL16_HI,
R_PPC_REL16_HA): Define.

2005-06-14 Alan Modra <amodra@bigpond.net.au>

* config.h.in (HAVE_ASM_PPC_REL16): Add.
* elf/elf.h (DT_PPC_GOT, DT_PPC_NUM): Define.
* elf/tls-macros.h (PowerPC32): Include config.h. Add variants of
TLS_IE, TLS_LD and TLS_GD for new PLT/GOT layout.
* sysdeps/powerpc/powerpc32/configure.in: New file,
* sysdeps/powerpc/powerpc32/dl-dtprocnum.h: New file.
* sysdeps/powerpc/powerpc32/dl-machine.h (DT_PPC): Define.
(ppc_got): New inline function.
(elf_machine_dynamic): Use ppc_got. Add attribute const.
(elf_machine_load_address): Add attribute const. Don't use int vars.
Use bcl rather than bl to save trashing branch target stack. Use
elf_machine_dynamic rather than duplicating code here.
(elf_machine_runtime_setup): New inline function replacing define.
Handle new PLT.
(elf_machine_fixup_plt): Handle new PLT.
(elf_machine_rela): Likewise.
* sysdeps/powerpc/powerpc32/sysdep.h: Include config.h.
(CALL_MCOUNT): Don't set up counter vars.
* sysdeps/powerpc/powerpc32/ppc-mcount.S: Correct comment.
* sysdeps/powerpc/powerpc32/elf/start.S (start_addressesp): Don't
define when HAVE_ASM_PPC_REL16.
(_start): Add HAVE_ASM_PPC_REL16 code.
* sysdeps/powerpc/powerpc32/dl-start.S (_dl_start_user): Don't bl
into the GOT when HAVE_ASM_PPC_REL16.
* sysdeps/powerpc/powerpc32/memset.S (memset): Likewise.
* sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S (__longjmp): Ditto.
* sysdeps/powerpc/powerpc32/fpu/s_ceil.S (__ceil): Likewise.
* sysdeps/powerpc/powerpc32/fpu/s_ceilf.S (__ceilf): Likewise.
* sysdeps/powerpc/powerpc32/fpu/s_floor.S (__floor): Likewise.
* sysdeps/powerpc/powerpc32/fpu/s_floorf.S (__floorf): Likewise.
* sysdeps/powerpc/powerpc32/fpu/s_lround.S (__lround): Likewise.
* sysdeps/powerpc/powerpc32/fpu/s_rint.S (__rint): Likewise.
* sysdeps/powerpc/powerpc32/fpu/s_rintf.S (__rintf): Likewise.
* sysdeps/powerpc/powerpc32/fpu/s_round.S (__round): Likewise.
* sysdeps/powerpc/powerpc32/fpu/s_roundf.S (__roundf): Likewise.
* sysdeps/powerpc/powerpc32/fpu/s_trunc.S (__trunc): Likewise.
* sysdeps/powerpc/powerpc32/fpu/s_truncf.S (__truncf): Likewise.
* sysdeps/powerpc/powerpc32/fpu/setjmp-common.S (__sigsetjmp):
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/brk.S (__brk): Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S
(__getcontext): Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S
(__setcontext): Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext.S
(__swapcontext): Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/socket.S (stackblock):
Comment.
(__socket): Bomb if NARGS >= 7. Invoke CGOTSETUP and CGOTRESTORE.

2005-06-17 Ulrich Drepper <drepper@redhat.com>

* sysdeps/posix/sigignore.c: Include <string.h> to tell the compiler
to use __GI_memset.
* sysdeps/posix/signal.c: Likewise.
* sysdeps/posix/sigset.c: Likewise.
* sysdeps/posix/sysv_signal.c: Likewise.
* sysdeps/unix/sysv/linux/sleep.c: Likewise.
* sysdeps/unix/sysv/linux/sysctl.c: Likewise.
* sysdeps/unix/sysv/linux/system.c: Likewise.

2005-06-15 Jakub Jelinek <jakub@redhat.com>

* hesiod/hesiod.c (hesiod_init): Don't check for ctx->classes[0] == 0
Expand Down
3 changes: 3 additions & 0 deletions config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,9 @@
/* Define if inlined system calls are available. */
#undef HAVE_INLINED_SYSCALLS

/* Define if your assembler and linker support R_PPC_REL16* relocs. */
#undef HAVE_ASM_PPC_REL16

/*
*/

Expand Down
9 changes: 9 additions & 0 deletions elf/elf.h
Original file line number Diff line number Diff line change
Expand Up @@ -1979,10 +1979,19 @@ typedef Elf32_Addr Elf32_Conflict;
#define R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */
#define R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */

/* GNU relocs used in PIC code sequences. */
#define R_PPC_REL16 249 /* word32 (sym-.) */
#define R_PPC_REL16_LO 250 /* half16 (sym-.)@l */
#define R_PPC_REL16_HI 251 /* half16 (sym-.)@h */
#define R_PPC_REL16_HA 252 /* half16 (sym-.)@ha */

/* This is a phony reloc to handle any old fashioned TOC16 references
that may still be in object files. */
#define R_PPC_TOC16 255

/* PowerPC specific values for the Dyn d_tag field. */
#define DT_PPC_GOT (DT_LOPROC + 0)
#define DT_PPC_NUM 1

/* PowerPC64 relocations defined by the ABIs */
#define R_PPC64_NONE R_PPC_NONE
Expand Down
51 changes: 48 additions & 3 deletions elf/tls-macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -703,6 +703,8 @@ register void *__gp __asm__("$29");

#elif defined __powerpc__ && !defined __powerpc64__

#include "config.h"

# define __TLS_CALL_CLOBBERS \
"0", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", \
"lr", "ctr", "cr0", "cr1", "cr5", "cr6", "cr7"
Expand All @@ -715,7 +717,20 @@ register void *__gp __asm__("$29");
__result; })

/* PowerPC32 Initial Exec TLS access. */
# define TLS_IE(x) \
# ifdef HAVE_ASM_PPC_REL16
# define TLS_IE(x) \
({ int *__result; \
asm ("bcl 20,31,1f\n1:\t" \
"mflr %0\n\t" \
"addis %0,%0,_GLOBAL_OFFSET_TABLE_-1b@ha\n\t" \
"addi %0,%0,_GLOBAL_OFFSET_TABLE_-1b@l\n\t" \
"lwz %0," #x "@got@tprel(%0)\n\t" \
"add %0,%0," #x "@tls" \
: "=b" (__result) : \
: "lr"); \
__result; })
# else
# define TLS_IE(x) \
({ int *__result; \
asm ("bl _GLOBAL_OFFSET_TABLE_@local-4\n\t" \
"mflr %0\n\t" \
Expand All @@ -724,9 +739,24 @@ register void *__gp __asm__("$29");
: "=b" (__result) : \
: "lr"); \
__result; })
# endif

/* PowerPC32 Local Dynamic TLS access. */
# define TLS_LD(x) \
# ifdef HAVE_ASM_PPC_REL16
# define TLS_LD(x) \
({ int *__result; \
asm ("bcl 20,31,1f\n1:\t" \
"mflr 3\n\t" \
"addis 3,3,_GLOBAL_OFFSET_TABLE_-1b@ha\n\t" \
"addi 3,3,_GLOBAL_OFFSET_TABLE_-1b@l\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; })
# else
# define TLS_LD(x) \
({ int *__result; \
asm ("bl _GLOBAL_OFFSET_TABLE_@local-4\n\t" \
"mflr 3\n\t" \
Expand All @@ -736,9 +766,23 @@ register void *__gp __asm__("$29");
: "=r" (__result) : \
: __TLS_CALL_CLOBBERS); \
__result; })
# endif

/* PowerPC32 General Dynamic TLS access. */
# define TLS_GD(x) \
# ifdef HAVE_ASM_PPC_REL16
# define TLS_GD(x) \
({ register int *__result __asm__ ("r3"); \
asm ("bcl 20,31,1f\n1:\t" \
"mflr 3\n\t" \
"addis 3,3,_GLOBAL_OFFSET_TABLE_-1b@ha\n\t" \
"addi 3,3,_GLOBAL_OFFSET_TABLE_-1b@l\n\t" \
"addi 3,3," #x "@got@tlsgd\n\t" \
"bl __tls_get_addr@plt" \
: : \
: __TLS_CALL_CLOBBERS); \
__result; })
# else
# define TLS_GD(x) \
({ register int *__result __asm__ ("r3"); \
asm ("bl _GLOBAL_OFFSET_TABLE_@local-4\n\t" \
"mflr 3\n\t" \
Expand All @@ -747,6 +791,7 @@ register void *__gp __asm__("$29");
: : \
: __TLS_CALL_CLOBBERS); \
__result; })
# endif

#elif defined __powerpc__ && defined __powerpc64__

Expand Down
9 changes: 9 additions & 0 deletions linuxthreads/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
2005-06-14 Alan Modra <amodra@bigpond.net.au>

* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h (PSEUDO):
Invoke CGOTSETUP and CGOTRESTORE.
(CGOTSETUP, CGOTRESTORE): Define.
(SINGLE_THREAD_P): Add variant for new PLT/GOT layout.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S (__vfork): Avoid
bl into the GOT when HAVE_ASM_PPC_REL16.

2005-05-23 Roland McGrath <roland@redhat.com>

* sysdeps/arm, sysdeps/unix/sysv/linux/arm: Subdirectories moved to
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
stwu 1,-48(1); \
mflr 9; \
stw 9,52(1); \
CGOTSETUP; \
DOCARGS_##args; /* save syscall args around CENABLE. */ \
CENABLE; \
stw 3,16(1); /* store CENABLE return value (MASK). */ \
Expand All @@ -50,6 +51,7 @@
lwz 4,52(1); \
lwz 0,12(1); /* restore CR/R3. */ \
lwz 3,8(1); \
CGOTRESTORE; \
mtlr 4; \
mtcr 0; \
addi 1,1,48;
Expand All @@ -75,6 +77,9 @@
# define DOCARGS_6 stw 8,40(1); DOCARGS_5
# define UNDOCARGS_6 lwz 8,40(1); UNDOCARGS_5

# define CGOTSETUP
# define CGOTRESTORE

# ifdef IS_IN_libpthread
# define CENABLE bl __pthread_enable_asynccancel@local
# define CDISABLE bl __pthread_disable_asynccancel@local
Expand All @@ -84,6 +89,18 @@
# else
# define CENABLE bl JUMPTARGET(__librt_enable_asynccancel)
# define CDISABLE bl JUMPTARGET(__librt_disable_asynccancel)
# if defined HAVE_AS_REL16 && defined PIC
# undef CGOTSETUP
# define CGOTSETUP \
bcl 20,31,1f; \
1: stw 30,44(1); \
mflr 30; \
addis 30,30,_GLOBAL_OFFSET_TABLE-1b@ha; \
addi 30,30,_GLOBAL_OFFSET_TABLE-1b@l
# undef CGOTRESTORE
# define CGOTRESTORE \
lwz 30,44(1)
# endif
# endif

# ifdef HAVE_TLS_SUPPORT
Expand Down Expand Up @@ -111,14 +128,25 @@ extern int __local_multiple_threads attribute_hidden;
lwz 10,__local_multiple_threads@l(10); \
cmpwi 10,0
# else
# define SINGLE_THREAD_P \
# ifdef HAVE_ASM_PPC_REL16
# define SINGLE_THREAD_P \
mflr 9; \
bcl 20,31,1f; \
1:mflr 10; \
addis 10,10,__local_multiple_threads-1b@ha; \
lwz 10,__local_multiple_threads-1b@l(10); \
mtlr 9; \
cmpwi 10,0
# else
# define SINGLE_THREAD_P \
mflr 9; \
bl _GLOBAL_OFFSET_TABLE_@local-4; \
mflr 10; \
mtlr 9; \
lwz 10,__local_multiple_threads@got(10); \
lwz 10,0(10); \
cmpwi 10,0
# endif
# endif
# endif
# endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,19 @@ ENTRY (__vfork)
#ifdef __NR_vfork
# ifdef SHARED
mflr 9
# ifdef HAVE_ASM_PPC_REL16
bcl 20,31,1f
1: mflr 10
addis 10,10,__libc_pthread_functions-1b@ha
lwz 10,__libc_pthread_functions-1b@l(10)
mtlr 9
# else
bl _GLOBAL_OFFSET_TABLE_@local-4
mflr 10
mtlr 9
lwz 10,__libc_pthread_functions@got(10)
lwz 10,0(10)
# endif
# else
.weak pthread_create
lis 10,pthread_create@ha
Expand Down
6 changes: 6 additions & 0 deletions nptl/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2005-06-14 Alan Modra <amodra@bigpond.net.au>

* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h (PSEUDO):
Invoke CGOTSETUP and CGOTRESTORE.
(CGOTSETUP, CGOTRESTORE): Define.

2005-05-29 Richard Henderson <rth@redhat.com>

* tst-cancel4.c (WRITE_BUFFER_SIZE): New.
Expand Down
17 changes: 17 additions & 0 deletions nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
mflr 9; \
stw 9,52(1); \
cfi_offset (lr, 4); \
CGOTSETUP; \
DOCARGS_##args; /* save syscall args around CENABLE. */ \
CENABLE; \
stw 3,16(1); /* store CENABLE return value (MASK). */ \
Expand All @@ -58,6 +59,7 @@
lwz 4,52(1); \
lwz 0,12(1); /* restore CR/R3. */ \
lwz 3,8(1); \
CGOTRESTORE; \
mtlr 4; \
mtcr 0; \
addi 1,1,48; \
Expand All @@ -84,6 +86,9 @@
# define DOCARGS_6 stw 8,40(1); DOCARGS_5
# define UNDOCARGS_6 lwz 8,40(1); UNDOCARGS_5

# define CGOTSETUP
# define CGOTRESTORE

# ifdef IS_IN_libpthread
# define CENABLE bl __pthread_enable_asynccancel@local
# define CDISABLE bl __pthread_disable_asynccancel@local
Expand All @@ -93,6 +98,18 @@
# elif defined IS_IN_librt
# define CENABLE bl JUMPTARGET(__librt_enable_asynccancel)
# define CDISABLE bl JUMPTARGET(__librt_disable_asynccancel)
# if defined HAVE_AS_REL16 && defined PIC
# undef CGOTSETUP
# define CGOTSETUP \
bcl 20,31,1f; \
1: stw 30,44(1); \
mflr 30; \
addis 30,30,_GLOBAL_OFFSET_TABLE-1b@ha; \
addi 30,30,_GLOBAL_OFFSET_TABLE-1b@l
# undef CGOTRESTORE
# define CGOTRESTORE \
lwz 30,44(1)
# endif
# else
# error Unsupported library
# endif
Expand Down
4 changes: 3 additions & 1 deletion sysdeps/posix/sigignore.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Set the disposition of SIG to SIG_IGN.
Copyright (C) 1998 Free Software Foundation, Inc.
Copyright (C) 1998, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
Expand All @@ -22,6 +22,8 @@
#define __need_NULL
#include <stddef.h>
#include <signal.h>
#include <string.h> /* For the real memset prototype. */


int
sigignore (sig)
Expand Down
4 changes: 3 additions & 1 deletion sysdeps/posix/signal.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/* BSD-like signal function.
Copyright (C) 1991,1992,1996,1997,2000,2002 Free Software Foundation, Inc.
Copyright (C) 1991,1992,1996,1997,2000,2002,2005
Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
Expand All @@ -19,6 +20,7 @@

#include <errno.h>
#include <signal.h>
#include <string.h> /* For the real memset prototype. */


sigset_t _sigintr attribute_hidden; /* Set by siginterrupt. */
Expand Down
Loading

0 comments on commit 99c7f87

Please sign in to comment.