diff options
Diffstat (limited to 'sysdeps/sparc/sparc64')
-rw-r--r-- | sysdeps/sparc/sparc64/configure | 33 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/configure.in | 26 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/dl-machine.h | 17 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/hp-timing.h | 8 |
4 files changed, 74 insertions, 10 deletions
diff --git a/sysdeps/sparc/sparc64/configure b/sysdeps/sparc/sparc64/configure new file mode 100644 index 0000000000..954ff7a03d --- /dev/null +++ b/sysdeps/sparc/sparc64/configure @@ -0,0 +1,33 @@ + # Local configure fragment for sysdeps/sparc/sparc64. + +# Check whether .got section comes before or after .dynamic +echo $ac_n "checking where sparc64 .dynamic section comes before .got""... $ac_c" 1>&6 +echo "configure:6: checking where sparc64 .dynamic section comes before .got" >&5 +if eval "test \"`echo '$''{'libc_cv_sparc64_dynamic_before_got'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + +${CC-cc} $CFLAGS -shared -Wl,--verbose 2>&1 \ + | grep '^[ ]*\.\(got\|dynamic\)[^A-Za-z0-9_]' > conftest.order + +if test `cat conftest.order | wc -l` != 2; then + { echo "configure: error: Couldn't figure .got/.dynamic relative placement" 1>&2; exit 1; } +else + + if head -n 1 conftest.order | grep '^[ ]*\.got'; then + libc_cv_sparc64_dynamic_before_got=no + else + libc_cv_sparc64_dynamic_before_got=yes + fi + +fi +rm -f conftest* +fi + +echo "$ac_t""$libc_cv_sparc64_dynamic_before_got" 1>&6 +if test $libc_cv_sparc64_dynamic_before_got = yes; then + cat >> confdefs.h <<\EOF +#define SPARC64_DYNAMIC_BEFORE_GOT 1 +EOF + +fi diff --git a/sysdeps/sparc/sparc64/configure.in b/sysdeps/sparc/sparc64/configure.in new file mode 100644 index 0000000000..30b012205b --- /dev/null +++ b/sysdeps/sparc/sparc64/configure.in @@ -0,0 +1,26 @@ +sinclude(./aclocal.m4)dnl Autoconf lossage +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. +# Local configure fragment for sysdeps/sparc/sparc64. + +# Check whether .got section comes before or after .dynamic +AC_CACHE_CHECK(where sparc64 .dynamic section comes before .got, + libc_cv_sparc64_dynamic_before_got, [dnl +changequote(,) +${CC-cc} $CFLAGS -shared -Wl,--verbose 2>&1 \ + | grep '^[ ]*\.\(got\|dynamic\)[^A-Za-z0-9_]' > conftest.order +changequote([,]) +if test `cat conftest.order | wc -l` != 2; then + AC_ERROR(Couldn't figure .got/.dynamic relative placement) +else + changequote(,) + if head -n 1 conftest.order | grep '^[ ]*\.got'; then + libc_cv_sparc64_dynamic_before_got=no + else + libc_cv_sparc64_dynamic_before_got=yes + fi + changequote([,]) +fi +rm -f conftest*]) +if test $libc_cv_sparc64_dynamic_before_got = yes; then + AC_DEFINE(SPARC64_DYNAMIC_BEFORE_GOT) +fi diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h index 8d9bf7aa67..4ced7deef8 100644 --- a/sysdeps/sparc/sparc64/dl-machine.h +++ b/sysdeps/sparc/sparc64/dl-machine.h @@ -77,14 +77,19 @@ elf_machine_load_address (void) The following method relies on the fact that sparcv9 ABI maximal page length is 1MB and all ELF segments on sparc64 are aligned - to 1MB. Also, it relies on _DYNAMIC coming after _GLOBAL_OFFSET_TABLE_ - and assumes that they both fit into the first 1MB of the RW segment. - This should be true for some time unless ld.so grows too much, at the - moment the whole stripped ld.so is 128KB and only smaller part of that - is in the RW segment. */ - + to 1MB. Also assumes that they both fit into the first 1MB of + the RW segment. This should be true for some time unless ld.so + grows too much, at the moment the whole stripped ld.so is 128KB + and only smaller part of that is in the RW segment. */ + +#ifdef SPARC64_DYNAMIC_BEFORE_GOT + /* If _DYNAMIC comes before _GLOBAL_OFFSET_TABLE_... */ + return ((Elf64_Addr)elf_pic_register - *elf_pic_register) & ~0xfffffUL; +#else + /* ... and if _DYNAMIC comes after _GLOBAL_OFFSET_TABLE_. */ return ((Elf64_Addr)elf_pic_register - *elf_pic_register + 0xfffff) & ~0xfffffUL; +#endif } /* We have 4 cases to handle. And we code different code sequences diff --git a/sysdeps/sparc/sparc64/hp-timing.h b/sysdeps/sparc/sparc64/hp-timing.h index 8475e15ae0..f6cb89b603 100644 --- a/sysdeps/sparc/sparc64/hp-timing.h +++ b/sysdeps/sparc/sparc64/hp-timing.h @@ -37,14 +37,14 @@ typedef unsigned long int hp_timing_t; #define HP_TIMING_DIFF_INIT() \ do { \ int __cnt = 5; \ - GL(hp_timing_overhead) = ~0ull; \ + GL(dl_hp_timing_overhead) = ~0ull; \ do \ { \ hp_timing_t __t1, __t2; \ HP_TIMING_NOW (__t1); \ HP_TIMING_NOW (__t2); \ - if (__t2 - __t1 < GL(hp_timing_overhead)) \ - GL(hp_timing_overhead) = __t2 - __t1; \ + if (__t2 - __t1 < GL(dl_hp_timing_overhead)) \ + GL(dl_hp_timing_overhead) = __t2 - __t1; \ } \ while (--__cnt > 0); \ } while (0) @@ -53,7 +53,7 @@ typedef unsigned long int hp_timing_t; #define HP_TIMING_ACCUM(Sum, Diff) \ do { \ - hp_timing_t __diff = (Diff) - GL(hp_timing_overhead); \ + hp_timing_t __diff = (Diff) - GL(dl_hp_timing_overhead); \ hp_timing_t tmp1, tmp2; \ __asm__ __volatile__("1: ldx [%3], %0\n\t" \ "add %0, %2, %1\n\t" \ |