diff options
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | sysdeps/powerpc/elf/libc-start.c | 13 | ||||
-rw-r--r-- | sysdeps/powerpc/fpu/s_lrint.c | 29 |
3 files changed, 40 insertions, 17 deletions
@@ -1,3 +1,18 @@ +2002-09-20 Steven Munroe <sjmunroe@us.ibm.com> + + * sysdeps/powerpc/elf/libc-start.c: Use long in place of int for argc + load, so as to work on both 32-bit and 64-bit. Remove unnecessary + casts. Align __libc_stack_end to 8 bytes. + +2002-09-20 Roland McGrath <roland@redhat.com> + + * sysdeps/powerpc/fpu/s_lrint.c: Use strong_alias/weak_alias macros + instead of asm for lrintf, __lrintf aliases. + + * sysdeps/powerpc/fpu/s_lrint.c (__lrint): Change union long array to + int array for 32-/64-bit compatibility. + From Steven Munroe <sjmunroe@us.ibm.com>. + 2002-09-17 Bruno Haible <bruno@clisp.org> * sysdeps/generic/ifreq.h (__if_nextreq): New function. diff --git a/sysdeps/powerpc/elf/libc-start.c b/sysdeps/powerpc/elf/libc-start.c index 9450fab..6751b9e 100644 --- a/sysdeps/powerpc/elf/libc-start.c +++ b/sysdeps/powerpc/elf/libc-start.c @@ -104,7 +104,8 @@ BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av, /* ...in which case, we have argc as the top thing on the stack, followed by argv (NULL-terminated), envp (likewise), and the auxilary vector. */ - argc = *(int *__unbounded) stack_on_entry; + /* 32/64-bit agnostic load from stack */ + argc = *(long int *__unbounded) stack_on_entry; ubp_av = stack_on_entry + 1; ubp_ev = ubp_av + argc + 1; #ifdef HAVE_AUX_VECTOR @@ -113,9 +114,8 @@ BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av, ++temp; auxvec = (ElfW(auxv_t) *)++temp; - # ifndef SHARED - _dl_aux_init ((ElfW(auxv_t) *) auxvec); + _dl_aux_init (auxvec); # endif #endif rtld_fini = NULL; @@ -124,11 +124,12 @@ BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av, INIT_ARGV_and_ENVIRON; /* Initialize the __cache_line_size variable from the aux vector. */ - __aux_init_cache((ElfW(auxv_t) *) auxvec); + __aux_init_cache(auxvec); /* Store something that has some relationship to the end of the - stack, for backtraces. This variable should be thread-specific. */ - __libc_stack_end = stack_on_entry + 4; + stack, for backtraces. This variable should be thread-specific. + Use +8 so it works for both 32- and 64-bit. */ + __libc_stack_end = stack_on_entry + 8; #ifndef SHARED /* Initialize the thread library at least a bit since the libgcc diff --git a/sysdeps/powerpc/fpu/s_lrint.c b/sysdeps/powerpc/fpu/s_lrint.c index 75d782e..c78fb03 100644 --- a/sysdeps/powerpc/fpu/s_lrint.c +++ b/sysdeps/powerpc/fpu/s_lrint.c @@ -1,5 +1,5 @@ /* Round floating-point to integer. PowerPC version. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997,2002 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 @@ -17,28 +17,35 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +/* Kludge to avoid decls that will confuse strong_alias below. */ +#define __lrintf XXX__lrintf +#define __lrintl XXX__lrintl +#define lrintf XXXlrintf +#define lrintl XXXlrintl + #include "math.h" +#undef __lrintf +#undef __lrintl +#undef lrintf +#undef lrintl + + long int __lrint (double x) { - union { + union + { double d; - long int ll[2]; + int ll[2]; } u; asm ("fctiw %0,%1" : "=f"(u.d) : "f"(x)); return u.ll[1]; } weak_alias (__lrint, lrint) -/* This code will also work for a 'float' argument. */ -asm ("\n\ - .globl __lrintf \n\ - .globl lrintf \n\ - .weak lrintf \n\ - .set __lrintf,__lrint \n\ - .set lrintf,__lrint \n\ -"); +strong_alias (__lrint, __lrintf) +weak_alias (__lrint, lrintf) #ifdef NO_LONG_DOUBLE strong_alias (__lrint, __lrintl) |