From 69bf5f75475e708abde760b2b401c2bfa65eec17 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 27 Jun 1998 09:52:12 +0000 Subject: Update. 1998-06-27 7:07 Richard Henderson * math/atest-exp.c (exp_mpn, main): Cast to mp_limb_t appropriately. * math/atest-exp2.c (exp_mpn, main): Likewise. * math/atest-sincos.c (main): Likewise. * resolv/inet_addr.c (inet_aton): Check for 32-bit overflow. Move base handling away from strtoul. Always reset errno. * sysdeps/alpha/Makefile (elf): Kill -mno-fp-regs. * sysdeps/alpha/dl-machine.h (elf_machine_runtime_setup): Only set _dl_profile_map if _dl_name_match_p. (RTLD_START): Fix .prologue. Set __libc_stack_end. * sysdeps/alpha/elf/start.S: Pass sp as arg 7. Kill __data_start. * sysdeps/alpha/fpu/fraiseexcpt.c (feraiseexcept): Mark tmp as early-clobber. * sysdeps/libm-ieee754/e_exp10.c: Include "math_private.h". * sysdeps/libm-ieee754/e_exp10f.c: Likewise. * sysdeps/libm-ieee754/e_exp10l.c: Likewise. --- ChangeLog | 23 +++++++++++++++++ io/sys/poll.h | 5 ++-- libc.map | 2 +- math/atest-exp.c | 8 +++--- math/atest-exp2.c | 8 +++--- math/atest-sincos.c | 4 +-- resolv/inet_addr.c | 51 ++++++++++++++++++++++++-------------- sysdeps/alpha/Makefile | 7 +----- sysdeps/alpha/dl-machine.h | 22 +++++++++++----- sysdeps/alpha/elf/start.S | 24 ++++++------------ sysdeps/alpha/fpu/fraiseexcpt.c | 10 ++++---- sysdeps/i386/fpu/bits/mathinline.h | 2 +- sysdeps/libm-ieee754/e_exp10.c | 1 + sysdeps/libm-ieee754/e_exp10f.c | 1 + sysdeps/libm-ieee754/e_exp10l.c | 1 + 15 files changed, 102 insertions(+), 67 deletions(-) diff --git a/ChangeLog b/ChangeLog index aaa3e0d4f6..fe2d543fd1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +1998-06-27 7:07 Richard Henderson + + * math/atest-exp.c (exp_mpn, main): Cast to mp_limb_t appropriately. + * math/atest-exp2.c (exp_mpn, main): Likewise. + * math/atest-sincos.c (main): Likewise. + + * resolv/inet_addr.c (inet_aton): Check for 32-bit overflow. Move + base handling away from strtoul. Always reset errno. + + * sysdeps/alpha/Makefile (elf): Kill -mno-fp-regs. + + * sysdeps/alpha/dl-machine.h (elf_machine_runtime_setup): Only set + _dl_profile_map if _dl_name_match_p. + (RTLD_START): Fix .prologue. Set __libc_stack_end. + * sysdeps/alpha/elf/start.S: Pass sp as arg 7. Kill __data_start. + + * sysdeps/alpha/fpu/fraiseexcpt.c (feraiseexcept): Mark tmp + as early-clobber. + + * sysdeps/libm-ieee754/e_exp10.c: Include "math_private.h". + * sysdeps/libm-ieee754/e_exp10f.c: Likewise. + * sysdeps/libm-ieee754/e_exp10l.c: Likewise. + 1998-06-26 Ulrich Drepper * sysdeps/i386/fpu/bits/mathinline.h (__finite): Use alias-safe diff --git a/io/sys/poll.h b/io/sys/poll.h index b9af2cfc0e..9cb60e72ea 100644 --- a/io/sys/poll.h +++ b/io/sys/poll.h @@ -1,5 +1,5 @@ /* Compatibility definitions for System V `poll' interface. - Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1994, 1996, 1997, 1998 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 @@ -41,7 +41,8 @@ struct pollfd an event to occur; if TIMEOUT is -1, block until an event occurs. Returns the number of file descriptors with events, zero if timed out, or -1 for errors. */ - +extern int __poll __P ((struct pollfd *__fds, unsigned long int __nfds, + int __timeout)); extern int poll __P ((struct pollfd *__fds, unsigned long int __nfds, int __timeout)); diff --git a/libc.map b/libc.map index 314bd8b959..ff0d42c2af 100644 --- a/libc.map +++ b/libc.map @@ -497,7 +497,7 @@ GLIBC_2.1 { __xstat64; __fxstat64; __lxstat64; __pread64; __pwrite64; __backtrace; __backtrace_symbols; - _dl_mcount; _dl_mcount_wrapper; + _dl_mcount; _dl_mcount_wrapper; __poll; # helper functions __libc_current_sigrtmin; __libc_current_sigrtmax; __libc_allocate_rtsig; diff --git a/math/atest-exp.c b/math/atest-exp.c index 28e572c444..4cab953e46 100644 --- a/math/atest-exp.c +++ b/math/atest-exp.c @@ -67,9 +67,9 @@ exp_mpn (mp1 ex, mp1 x) memset (xp, 0, sizeof (mp1)); memset (ex, 0, sizeof (mp1)); - xp[FRAC / mpbpl] = 1 << FRAC % mpbpl; + xp[FRAC / mpbpl] = (mp_limb_t)1 << FRAC % mpbpl; memset (tol,0, sizeof (mp1)); - tol[(FRAC - TOL) / mpbpl] = 1 << (FRAC - TOL) % mpbpl; + tol[(FRAC - TOL) / mpbpl] = (mp_limb_t)1 << (FRAC - TOL) % mpbpl; n = 0; @@ -119,7 +119,7 @@ main (void) memset (maxerror, 0, sizeof (mp1)); memset (xt, 0, sizeof (mp1)); - xt[(FRAC - N2) / mpbpl] = 1 << (FRAC - N2) % mpbpl; + xt[(FRAC - N2) / mpbpl] = (mp_limb_t)1 << (FRAC - N2) % mpbpl; for (i = 0; i < 1 << N2; i++) { @@ -166,7 +166,7 @@ main (void) /* Check exp_mpn against precomputed value of exp(1). */ memset (x, '\0', sizeof (mp1)); - x[FRAC / mpbpl] = 1 << FRAC % mpbpl; + x[FRAC / mpbpl] = (mp_limb_t)1 << FRAC % mpbpl; exp_mpn (ex, x); memset (e2, '\0', sizeof (mp1)); diff --git a/math/atest-exp2.c b/math/atest-exp2.c index 1f5d7ccd86..7243944c66 100644 --- a/math/atest-exp2.c +++ b/math/atest-exp2.c @@ -107,9 +107,9 @@ exp_mpn (mp1 ex, mp1 x) memset (xp, 0, sizeof (mp1)); memset (ex, 0, sizeof (mp1)); - xp[FRAC / mpbpl] = 1 << FRAC % mpbpl; + xp[FRAC / mpbpl] = (mp_limb_t)1 << FRAC % mpbpl; memset (tol, 0, sizeof (mp1)); - tol[(FRAC - TOL) / mpbpl] = 1 << (FRAC - TOL) % mpbpl; + tol[(FRAC - TOL) / mpbpl] = (mp_limb_t)1 << (FRAC - TOL) % mpbpl; n = 0; @@ -170,7 +170,7 @@ main (void) memset (maxerror, 0, sizeof (mp1)); memset (xt, 0, sizeof (mp1)); - xt[(FRAC - N2) / mpbpl] = 1 << (FRAC - N2) % mpbpl; + xt[(FRAC - N2) / mpbpl] = (mp_limb_t)1 << (FRAC - N2) % mpbpl; for (i = 0; i < (1 << N2); ++i) { @@ -219,7 +219,7 @@ main (void) /* Check exp_mpn against precomputed value of exp(1). */ memset (x, 0, sizeof (mp1)); - x[FRAC / mpbpl] = 1 << FRAC % mpbpl; + x[FRAC / mpbpl] = (mp_limb_t)1 << FRAC % mpbpl; exp_mpn (ex, x); read_mpn_hex (e2, exp1); if (mpn_cmp (ex, e2, SZ) >= 0) diff --git a/math/atest-sincos.c b/math/atest-sincos.c index 98f1e719b1..2f4187c9c0 100644 --- a/math/atest-sincos.c +++ b/math/atest-sincos.c @@ -156,7 +156,7 @@ main (void) memset (sin_maxerror, 0, sizeof (mp1)); memset (cos_maxerror, 0, sizeof (mp1)); memset (xt, 0, sizeof (mp1)); - xt[(FRAC - N2) / mpbpl] = 1 << (FRAC - N2) % mpbpl; + xt[(FRAC - N2) / mpbpl] = (mp_limb_t)1 << (FRAC - N2) % mpbpl; for (i = 0; i < 1 << N2; i++) { @@ -232,7 +232,7 @@ main (void) /* Check Range-Kutta against precomputed values of sin(1) and cos(1). */ memset (x, 0, sizeof (mp1)); - x[FRAC / mpbpl] = 1 << FRAC % mpbpl; + x[FRAC / mpbpl] = (mp_limb_t)1 << FRAC % mpbpl; sincosx_mpn (si, co, x, ox); memset (s2, 0, sizeof (mp1)); diff --git a/resolv/inet_addr.c b/resolv/inet_addr.c index 635dd4596d..68659e9a04 100644 --- a/resolv/inet_addr.c +++ b/resolv/inet_addr.c @@ -102,13 +102,14 @@ inet_aton(cp, addr) register u_int32_t val; /* changed from u_long --david */ register int base, n; register char c; - u_int parts[4]; - register u_int *pp = parts; + u_int32_t parts[4]; + register u_int32_t *pp = parts; + #ifdef _LIBC int saved_errno = errno; - __set_errno (0); #endif + c = *cp; for (;;) { /* @@ -117,7 +118,18 @@ inet_aton(cp, addr) * 0x=hex, 0=octal, isdigit=decimal. */ if (!isdigit(c)) - return (0); + goto ret_0; +#ifdef _LIBC + { + unsigned long ul = strtoul (cp, (char **) &cp, 0); + if (ul == ULONG_MAX && errno == ERANGE) + goto ret_0; + if (ul > 0xfffffffful) + goto ret_0; + val = ul; + } + c = *cp; +#else base = 10; if (c == '0') { c = *++cp; @@ -126,15 +138,6 @@ inet_aton(cp, addr) else base = 8; } -#ifdef _LIBC - val = strtoul (cp, (char **) &cp, base); - if (val == ULONG_MAX && errno == ERANGE) - { - __set_errno (saved_errno); - return 0; - } - c = *cp; -#else val = 0; for (;;) { if (isascii(c) && isdigit(c)) { @@ -156,7 +159,7 @@ inet_aton(cp, addr) * a.b (with b treated as 24 bits) */ if (pp >= parts + 3) - return (0); + goto ret_0; *pp++ = val; c = *++cp; } else @@ -166,7 +169,7 @@ inet_aton(cp, addr) * Check for trailing characters. */ if (c != '\0' && (!isascii(c) || !isspace(c))) - return (0); + goto ret_0; /* * Concoct the address according to * the number of parts specified. @@ -175,30 +178,40 @@ inet_aton(cp, addr) switch (n) { case 0: - return (0); /* initial nondigit */ + goto ret_0; /* initial nondigit */ case 1: /* a -- 32 bits */ break; case 2: /* a.b -- 8.24 bits */ if (val > 0xffffff) - return (0); + goto ret_0; val |= parts[0] << 24; break; case 3: /* a.b.c -- 8.8.16 bits */ if (val > 0xffff) - return (0); + goto ret_0; val |= (parts[0] << 24) | (parts[1] << 16); break; case 4: /* a.b.c.d -- 8.8.8.8 bits */ if (val > 0xff) - return (0); + goto ret_0; val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); break; } if (addr) addr->s_addr = htonl(val); + +#ifdef _LIBC + __set_errno (saved_errno); +#endif return (1); + +ret_0: +#ifdef _LIBC + __set_errno (saved_errno); +#endif + return (0); } diff --git a/sysdeps/alpha/Makefile b/sysdeps/alpha/Makefile index 6cf4a173a6..250a31779c 100644 --- a/sysdeps/alpha/Makefile +++ b/sysdeps/alpha/Makefile @@ -31,12 +31,7 @@ endif ifeq ($(subdir),elf) # The ld.so startup code cannot use literals until it self-relocates. - ifeq ($(elf),yes) - CFLAGS-rtld.c = -mbuild-constants - endif -# The rest of ld.so shouldn't use FP regs for block moves so -# that the lazy link trampoline doesn't have to save them. -sysdep-CFLAGS += -mno-fp-regs +CFLAGS-rtld.c = -mbuild-constants endif divrem := divl divq reml remq diff --git a/sysdeps/alpha/dl-machine.h b/sysdeps/alpha/dl-machine.h index 455fd7b695..8f639a94b9 100644 --- a/sysdeps/alpha/dl-machine.h +++ b/sysdeps/alpha/dl-machine.h @@ -106,8 +106,13 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) else { *(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_profile; - /* Say that we really want profiling and the timers are started. */ - _dl_profile_map = l; + + if (_dl_name_match_p (_dl_profile, l)) + { + /* This is the object we are looking for. Say that we really + want profiling and the timers are started. */ + _dl_profile_map = l; + } } /* Identify this shared object */ @@ -131,7 +136,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) " #tramp_name ": lda $sp, -168($sp) .frame $sp, 168, $26 - /* Preserve all registers that C normally doesn't. */ + /* Preserve all integer registers that C normally doesn't. */ stq $26, 0($sp) stq $0, 8($sp) stq $1, 16($sp) @@ -157,7 +162,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) /* Set up our $gp */ br $gp, .+4 ldgp $gp, 0($gp) - .prologue 1 + .prologue 0 /* Set up the arguments for fixup: */ /* $16 = link_map out of plt0 */ /* $17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24 */ @@ -216,11 +221,13 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) #define RTLD_START asm ("\ .text + .set at .globl _start .ent _start _start: br $gp, 0f 0: ldgp $gp, 0($gp) + .prologue 0 /* Pass pointer to argument block to _dl_start. */ mov $sp, $16 bsr $26, "ASM_ALPHA_NG_SYMBOL_PREFIX"_dl_start..ng @@ -229,8 +236,12 @@ _start: .globl _dl_start_user .ent _dl_start_user _dl_start_user: + .frame $30,0,$31,0 + .prologue 0 /* Save the user entry point address in s0. */ mov $0, $9 + /* Store the highest stack address. */ + stq $30, __libc_stack_end /* See if we were run as a command with the executable file name as an extra leading argument. If so, adjust the stack pointer to skip _dl_skip_args words. */ @@ -253,15 +264,14 @@ _dl_start_user: ldgp $gp, 0($26) br 1b 2: /* Clear the startup flag. */ - .set at stl $31, _dl_starting_up - .set noat /* Pass our finalizer function to the user in $0. */ lda $0, _dl_fini /* Jump to the user's entry point. */ mov $9, $27 jmp ($9) .end _dl_start_user + .set noat .previous"); /* Nonzero iff TYPE describes relocation of a PLT entry, so diff --git a/sysdeps/alpha/elf/start.S b/sysdeps/alpha/elf/start.S index 1330d1fda2..ecb8174152 100644 --- a/sysdeps/alpha/elf/start.S +++ b/sysdeps/alpha/elf/start.S @@ -29,13 +29,14 @@ _start: mov zero, fp br gp, 1f 1: ldgp gp, 0(gp) + subq sp, 16, sp .prologue 1 /* Load address of the user's main function. */ lda a0, main - ldl a1, 0(sp) /* get argc */ - lda a2, 8(sp) /* get argv */ + ldl a1, 16(sp) /* get argc */ + lda a2, 24(sp) /* get argv */ /* Load address of our own entry points to .fini and .init. */ lda a3, _init @@ -44,10 +45,12 @@ _start: /* Store address of the shared library termination function. */ mov v0, a5 + /* Provide the highest stack address to the user code. */ + stq sp, 0(sp) + /* Call the user's main function, and exit with its value. - But let the libc call main. */ + But let the libc call main. */ jsr ra, __libc_start_main - ldgp gp, 0(ra) /* Die very horribly if exit returns. Call_pal hlt is callable from kernel mode only; this will result in an illegal instruction trap. */ @@ -56,16 +59,3 @@ _start: /* For ECOFF backwards compatibility. */ weak_alias(_start, __start) - -/* Define a symbol for the first piece of initialized data. */ - .data - .globl __data_start -__data_start: - .long 0 - -#ifdef __ELF__ - .size __data_start, 4 - .type __data_start, @object -#endif - -weak_alias(__data_start, data_start) diff --git a/sysdeps/alpha/fpu/fraiseexcpt.c b/sysdeps/alpha/fpu/fraiseexcpt.c index c2a96e3f87..9b61ddb843 100644 --- a/sysdeps/alpha/fpu/fraiseexcpt.c +++ b/sysdeps/alpha/fpu/fraiseexcpt.c @@ -39,28 +39,28 @@ feraiseexcept (int excepts) { /* One example of a invalid operation is 0 * Infinity. */ __asm__ __volatile__("mult/sui $f31,%1,%0; trapb" - : "=f"(tmp) : "f"(HUGE_VAL)); + : "=&f"(tmp) : "f"(HUGE_VAL)); } /* Next: division by zero. */ if (FE_DIVBYZERO & excepts) { __asm__ __volatile__("cmpteq $f31,$f31,%1; divt/sui %1,$f31,%0; trapb" - : "=f"(tmp), "=f"(dummy)); + : "=&f"(tmp), "=f"(dummy)); } /* Next: overflow. */ if (FE_OVERFLOW & excepts) { __asm__ __volatile__("mult/sui %1,%1,%0; trapb" - : "=f"(tmp) : "f"(DBL_MAX)); + : "=&f"(tmp) : "f"(DBL_MAX)); } /* Next: underflow. */ if (FE_UNDERFLOW & excepts) { __asm__ __volatile__("divt/sui %1,%2,%0; trapb" - : "=f"(tmp) : "f"(DBL_MIN), + : "=&f"(tmp) : "f"(DBL_MIN), "f"((double) (1UL << 60))); } @@ -68,6 +68,6 @@ feraiseexcept (int excepts) if (FE_INEXACT & excepts) { __asm__ __volatile__("divt/sui %1,%2,%0; trapb" - : "=f"(tmp) : "f"(1.0), "f"(M_PI)); + : "=&f"(tmp) : "f"(1.0), "f"(M_PI)); } } diff --git a/sysdeps/i386/fpu/bits/mathinline.h b/sysdeps/i386/fpu/bits/mathinline.h index 836e5a3050..465592c764 100644 --- a/sysdeps/i386/fpu/bits/mathinline.h +++ b/sysdeps/i386/fpu/bits/mathinline.h @@ -582,7 +582,7 @@ __MATH_INLINE int __finite (double __x) { return (__extension__ - (((((union { double __d; int __i[2]; }) {__d: __x}).i[1] + (((((union { double __d; int __i[2]; }) {__d: __x}).__i[1] | 0x800fffff) + 1) >> 31)); } diff --git a/sysdeps/libm-ieee754/e_exp10.c b/sysdeps/libm-ieee754/e_exp10.c index 3b367641cd..55d676ec09 100644 --- a/sysdeps/libm-ieee754/e_exp10.c +++ b/sysdeps/libm-ieee754/e_exp10.c @@ -18,6 +18,7 @@ Boston, MA 02111-1307, USA. */ #include +#include "math_private.h" double diff --git a/sysdeps/libm-ieee754/e_exp10f.c b/sysdeps/libm-ieee754/e_exp10f.c index 200eecd833..d6cc9dc03d 100644 --- a/sysdeps/libm-ieee754/e_exp10f.c +++ b/sysdeps/libm-ieee754/e_exp10f.c @@ -18,6 +18,7 @@ Boston, MA 02111-1307, USA. */ #include +#include "math_private.h" float diff --git a/sysdeps/libm-ieee754/e_exp10l.c b/sysdeps/libm-ieee754/e_exp10l.c index e2820d24f7..cf8658b747 100644 --- a/sysdeps/libm-ieee754/e_exp10l.c +++ b/sysdeps/libm-ieee754/e_exp10l.c @@ -18,6 +18,7 @@ Boston, MA 02111-1307, USA. */ #include +#include "math_private.h" long double -- cgit v1.2.3