aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog15
-rw-r--r--sysdeps/powerpc/elf/libc-start.c13
-rw-r--r--sysdeps/powerpc/fpu/s_lrint.c29
3 files changed, 40 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index dac9eae..79e594e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)