diff options
author | David S. Miller <davem@davemloft.net> | 2012-02-21 15:42:42 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-02-20 17:51:53 -0800 |
commit | 3d2b3019e0efa9735370498122ac80298deff8c7 (patch) | |
tree | 693771bb0b1fba08098558d99613ce80bc36a923 /sysdeps/sparc/sparc64 | |
parent | c80098a9a05b7d5f8ad1488135f2cee613998c50 (diff) | |
download | glibc-3d2b3019e0efa9735370498122ac80298deff8c7.tar glibc-3d2b3019e0efa9735370498122ac80298deff8c7.tar.gz glibc-3d2b3019e0efa9735370498122ac80298deff8c7.tar.bz2 glibc-3d2b3019e0efa9735370498122ac80298deff8c7.zip |
Use sparc GOTDATA relocations whenever possible.
* sysdeps/sparc/crti.S: Try to use GOTDATA relocs.
* sysdeps/sparc/sparc32/dl-machine.h (RTLD_START): Likewise.
* sysdeps/sparc/sparc32/elf/start.S: Likewise.
* sysdeps/sparc/sparc64/dl-machine.h (RTLD_START): Likewise.
* sysdeps/sparc/sparc64/elf/start.S: Likewise.
* sysdeps/sparc/sparc64/multiarch/memcpy.S: Likewise.
* sysdeps/sparc/sparc64/multiarch/memset.S: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
(SYSCALL_ERROR_HANDLER): Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/brk.S: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
(SYSCALL_ERROR_HANDLER): Likewise.
Diffstat (limited to 'sysdeps/sparc/sparc64')
-rw-r--r-- | sysdeps/sparc/sparc64/dl-machine.h | 32 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/elf/start.S | 42 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/multiarch/memcpy.S | 7 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/multiarch/memset.S | 14 |
4 files changed, 48 insertions, 47 deletions
diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h index 5a00c9356e..6bab5ce310 100644 --- a/sysdeps/sparc/sparc64/dl-machine.h +++ b/sysdeps/sparc/sparc64/dl-machine.h @@ -264,6 +264,18 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) The C function `_dl_start' is the real entry point; its return value is the user program's entry point. */ +#ifdef HAVE_BINUTILS_GOTDATA +#define RTLD_GOT_ADDRESS(pic_reg, reg, symbol) \ + "sethi %gdop_hix22(" #symbol "), " #reg "\n\t" \ + "xor " #reg ", %gdop_lox10(" #symbol "), " #reg "\n\t" \ + "ldx [" #pic_reg " + " #reg "], " #reg ", %gdop(" #symbol ")\n" +#else +#define RTLD_GOT_ADDRESS(pic_reg, reg, symbol) \ + "sethi %hi(" #symbol "), " #reg "\n\t" \ + "or " #reg ", %lo(" #symbol "), " #reg "\n\t" \ + "ldx [" #pic_reg " + " #reg "], " #reg "\n" +#endif + #define __S1(x) #x #define __S(x) __S1(x) @@ -288,24 +300,20 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) "1: call 11f\n" \ " sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7\n" \ "11: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7\n" \ -" sethi %hi(_dl_skip_args), %g5\n" \ " add %l7, %o7, %l7\n" \ -" or %g5, %lo(_dl_skip_args), %g5\n" \ " /* Save the user entry point address in %l0. */\n" \ " mov %o0, %l0\n" \ " /* See if we were run as a command with the executable file name as an\n" \ " extra leading argument. If so, we must shift things around since we\n" \ " must keep the stack doubleword aligned. */\n" \ -" ldx [%l7 + %g5], %i0\n" \ -" ld [%i0], %i0\n" \ + RTLD_GOT_ADDRESS(%l7, %g5, _dl_skip_args) \ +" ld [%g5], %i0\n" \ " brz,pt %i0, 2f\n" \ " ldx [%sp + " __S(STACK_BIAS) " + 22*8], %i5\n" \ " /* Find out how far to shift. */\n" \ -" sethi %hi(_dl_argv), %l4\n" \ " sub %i5, %i0, %i5\n" \ -" or %l4, %lo(_dl_argv), %l4\n" \ " sllx %i0, 3, %l6\n" \ -" ldx [%l7 + %l4], %l4\n" \ + RTLD_GOT_ADDRESS(%l7, %l4, _dl_argv) \ " stx %i5, [%sp + " __S(STACK_BIAS) " + 22*8]\n" \ " add %sp, " __S(STACK_BIAS) " + 23*8, %i1\n" \ " add %i1, %l6, %i2\n" \ @@ -333,20 +341,16 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) " add %i1, 16, %i1\n" \ " stx %l5, [%l4]\n" \ " /* %o0 = _dl_loaded, %o1 = argc, %o2 = argv, %o3 = envp. */\n" \ -"2: sethi %hi(_rtld_local), %o0\n" \ -" add %sp, " __S(STACK_BIAS) " + 23*8, %o2\n" \ -" orcc %o0, %lo(_rtld_local), %o0\n" \ +"2:\t" RTLD_GOT_ADDRESS(%l7, %o0, _rtld_local) \ " sllx %i5, 3, %o3\n" \ -" ldx [%l7 + %o0], %o0\n" \ +" add %sp, " __S(STACK_BIAS) " + 23*8, %o2\n" \ " add %o3, 8, %o3\n" \ " mov %i5, %o1\n" \ " add %o2, %o3, %o3\n" \ " call _dl_init_internal\n" \ " ldx [%o0], %o0\n" \ " /* Pass our finalizer function to the user in %g1. */\n" \ -" sethi %hi(_dl_fini), %g1\n" \ -" or %g1, %lo(_dl_fini), %g1\n" \ -" ldx [%l7 + %g1], %g1\n" \ + RTLD_GOT_ADDRESS(%l7, %g1, _dl_fini) \ " /* Jump to the user's entry point and deallocate the extra stack we got. */\n" \ " jmp %l0\n" \ " add %sp, 6*8, %sp\n" \ diff --git a/sysdeps/sparc/sparc64/elf/start.S b/sysdeps/sparc/sparc64/elf/start.S index afae70b4ba..50f2df2c7e 100644 --- a/sysdeps/sparc/sparc64/elf/start.S +++ b/sysdeps/sparc/sparc64/elf/start.S @@ -40,18 +40,11 @@ .section ".text" .align 4 -#ifdef SHARED -.LLGETPC0: - retl - add %o7, %l7, %l7 -#endif .global _start .type _start,#function _start: #ifdef SHARED - sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7 - call .LLGETPC0 - add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7 + SETUP_PIC_REG(l7) #endif /* Terminate the stack frame, and reserve space for functions to @@ -66,17 +59,36 @@ _start: add %sp, STACK_BIAS+23*8, %o2 /* Load the addresses of the user entry points. */ - sethi %hi(main), %o0 - sethi %hi(__libc_csu_init), %o3 - sethi %hi(__libc_csu_fini), %o4 - or %o0, %lo(main), %o0 - or %o3, %lo(__libc_csu_init), %o3 - or %o4, %lo(__libc_csu_fini), %o4 -#ifdef SHARED +#ifndef SHARED + sethi %hi(main), %o0 + sethi %hi(__libc_csu_init), %o3 + sethi %hi(__libc_csu_fini), %o4 + or %o0, %lo(main), %o0 + or %o3, %lo(__libc_csu_init), %o3 + or %o4, %lo(__libc_csu_fini), %o4 +#else +#ifdef HAVE_BINUTILS_GOTDATA + sethi %gdop_hix22(main), %o0 + sethi %gdop_hix22(__libc_csu_init), %o3 + sethi %gdop_hix22(__libc_csu_fini), %o4 + xor %o0, %gdop_lox10(main), %o0 + xor %o3, %gdop_lox10(__libc_csu_init), %o3 + xor %o4, %gdop_lox10(__libc_csu_fini), %o4 + ldx [%l7 + %o0], %o0, %gdop(main) + ldx [%l7 + %o3], %o3, %gdop(__libc_csu_init) + ldx [%l7 + %o4], %o4, %gdop(__libc_csu_fini) +#else + sethi %hi(main), %o0 + sethi %hi(__libc_csu_init), %o3 + sethi %hi(__libc_csu_fini), %o4 + or %o0, %lo(main), %o0 + or %o3, %lo(__libc_csu_init), %o3 + or %o4, %lo(__libc_csu_fini), %o4 ldx [%l7 + %o0], %o0 ldx [%l7 + %o3], %o3 ldx [%l7 + %o4], %o4 #endif +#endif /* When starting a binary via the dynamic linker, %g1 contains the address of the shared library termination function, which will be diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy.S b/sysdeps/sparc/sparc64/multiarch/memcpy.S index 2fd5e9bf9b..739687f3b8 100644 --- a/sysdeps/sparc/sparc64/multiarch/memcpy.S +++ b/sysdeps/sparc/sparc64/multiarch/memcpy.S @@ -25,12 +25,7 @@ ENTRY(memcpy) .type memcpy, @gnu_indirect_function # ifdef SHARED - mov %o7, %o5 - sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o3 - call 1f - or %o3, %lo(_GLOBAL_OFFSET_TABLE_+4), %o3 -1: add %o7, %o3, %o3 - mov %o5, %o7 + SETUP_PIC_REG_LEAF(o3, o5) # endif andcc %o0, HWCAP_SPARC_N2, %g0 be 1f diff --git a/sysdeps/sparc/sparc64/multiarch/memset.S b/sysdeps/sparc/sparc64/multiarch/memset.S index bf2eb637e6..13533450c2 100644 --- a/sysdeps/sparc/sparc64/multiarch/memset.S +++ b/sysdeps/sparc/sparc64/multiarch/memset.S @@ -25,12 +25,7 @@ ENTRY(memset) .type memset, @gnu_indirect_function # ifdef SHARED - mov %o7, %o5 - sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o3 - call 1f - or %o3, %lo(_GLOBAL_OFFSET_TABLE_+4), %o3 -1: add %o7, %o3, %o3 - mov %o5, %o7 + SETUP_PIC_REG_LEAF(o3, o5) # endif andcc %o0, HWCAP_SPARC_BLKINIT, %g0 be 9f @@ -61,12 +56,7 @@ END(memset) ENTRY(__bzero) .type bzero, @gnu_indirect_function # ifdef SHARED - mov %o7, %o5 - sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o3 - call 1f - or %o3, %lo(_GLOBAL_OFFSET_TABLE_+4), %o3 -1: add %o7, %o3, %o3 - mov %o5, %o7 + SETUP_PIC_REG_LEAF(o3, o5) # endif andcc %o0, HWCAP_SPARC_BLKINIT, %g0 be 9f |