Tue Mar 12 04:42:01 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>

* sysdeps/sparc/jmp_buf.h: Rewritten; use array of ints, not struct.
	* sysdeps/sparc/setjmp.S: Rewritten; store %fp value as well.
	* sysdeps/sparc/__longjmp.S: Rewritten; unwind frames one by one with
	`restore' until the target frame is hit.

Sun Mar 10 20:29:40 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/sysv/linux/sigsuspend.c: New file.
	* sysdeps/unix/sysv/linux/syscalls.list: Remove sigsuspend, add
	s_sigsuspend.

Thu Mar  7 21:30:58 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makerules (+make-deps, sed-remove-objpfx): Quote periods on the
	left side of sed substitutions.

Sun Mar 10 16:58:10 1996  Ulrich Drepper  <drepper@gnu.ai.mit.edu>

	* stdio-common/printf_fp.c (hack_digit): __mpn_normal_size
	is not available anymore.  Do it ourselves.

	* sysdeps/unix/sysv/linux/i386/fpu_control.h (_FPU_SETCW):
	Correct GCC `asm' syntax.

	* stdio-common/Makefile (tests): Add tst-ungetc.
	* stdio-common/tst-ungetc.c: New test from drepper.
	* stdio-common/tstscanf.c (main): New %[ test case from drepper.

	* sysdeps/libm-ieee754/s_scalbn.c (scalbn): Rename to __scalbn;
	somehow this was missed, though the weak alias is already there.
This commit is contained in:
Roland McGrath 1996-03-12 09:50:46 +00:00
parent dd0e4e0c8b
commit 1177c8babf
12 changed files with 180 additions and 51 deletions

View File

@ -1,5 +1,38 @@
Tue Mar 12 04:42:01 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* sysdeps/sparc/jmp_buf.h: Rewritten; use array of ints, not struct.
* sysdeps/sparc/setjmp.S: Rewritten; store %fp value as well.
* sysdeps/sparc/__longjmp.S: Rewritten; unwind frames one by one with
`restore' until the target frame is hit.
Sun Mar 10 20:29:40 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/sysv/linux/sigsuspend.c: New file.
* sysdeps/unix/sysv/linux/syscalls.list: Remove sigsuspend, add
s_sigsuspend.
Thu Mar 7 21:30:58 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* Makerules (+make-deps, sed-remove-objpfx): Quote periods on the
left side of sed substitutions.
Sun Mar 10 16:58:10 1996 Ulrich Drepper <drepper@gnu.ai.mit.edu>
* stdio-common/printf_fp.c (hack_digit): __mpn_normal_size
is not available anymore. Do it ourselves.
* sysdeps/unix/sysv/linux/i386/fpu_control.h (_FPU_SETCW):
Correct GCC `asm' syntax.
Tue Mar 12 03:15:02 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* stdio-common/Makefile (tests): Add tst-ungetc.
* stdio-common/tst-ungetc.c: New test from drepper.
* stdio-common/tstscanf.c (main): New %[ test case from drepper.
* sysdeps/libm-ieee754/s_scalbn.c (scalbn): Rename to __scalbn;
somehow this was missed, though the weak alias is already there.
* sysdeps/unix/sysv/linux/i386/fpu_control.h (_FPU_DEFAULT): Change
default to double precision, all interrupts masked; fdlibm requires.

View File

@ -276,13 +276,14 @@ S-CPPFLAGS = $(asm-CPPFLAGS)
define +make-deps
-@rm -f $@
$(+mkdep) $< $(CPPFLAGS) $($(<:$*.%=%)-CPPFLAGS) | \
sed -e 's,$*\.o,$(foreach o,$(object-suffixes),$(@:.d=$o)) $@,' \
sed -e 's,$(subst .,\.,$*)\.o,$(foreach o,$(object-suffixes),$(@:.d=$o)) $@,' \
$(sed-remove-objpfx) > $(@:.d=.T)
mv -f $(@:.d=.T) $@
endef
ifneq (,$(objpfx))
sed-remove-objpfx = -e 's@ $(subst @,\@,$(objpfx))@ $$(objpfx)@g' \
-e 's@^$(subst @,\@,$(objpfx))@$$(objpfx)@g'
sed-remove-objpfx = -e 's@ $(subst .,\., \
$(subst @,\@,$(objpfx)))@ $$(objpfx)@g' \
-e 's@^$(subst .,\.,$(subst @,\@,$(objpfx)))@$$(objpfx)@g'
endif
# Figure out the source filenames in this directory.

View File

@ -37,7 +37,7 @@ aux := errlist siglist
distribute := _itoa.h printf-parse.h
tests := tst-printf tstscanf test_rdwr test-popen tstgetln test-fseek \
temptest tst-fileno test-fwrite \
temptest tst-fileno test-fwrite tst-ungetc \
xbug errnobug \
bug1 bug2 bug3 bug4 bug5 bug6 bug7 bug8 bug9 bug10 bug11 \
tfformat tiformat tstdiomisc \

View File

@ -208,7 +208,9 @@ __printf_fp (FILE *fp,
tmp[fracsize - scalesize] = hi;
hi = tmp[0];
fracsize = __mpn_normal_size (frac, scalesize);
fracsize = scalesize;
while (fracsize != 0 && frac[fracsize - 1] == 0)
--fracsize;
if (fracsize == 0)
{
/* We're not prepared for an mpn variable with zero

42
stdio-common/tst-ungetc.c Normal file
View File

@ -0,0 +1,42 @@
/* Test for ungetc bugs. */
#include <stdio.h>
#define assert(x) \
if (!(x)) \
{ \
fputs ("test failed: " #x "\n", stderr); \
retval = 1; \
goto the_end; \
}
int
main (int argc, char *argv[])
{
char *name;
FILE *fp = NULL;
int retval = 0;
int c;
name = tmpnam (NULL);
fp = fopen (name, "w");
assert (fp != NULL)
fputs ("bl", fp);
fclose (fp);
fp = NULL;
fp = fopen (name, "r");
assert (fp != NULL)
assert (getc (fp) != EOF);
assert ((c = getc (fp)) != EOF);
assert (getc (fp) == EOF);
assert (ungetc (c, fp) == c);
assert (feof (fp) == 0);
the_end:
if (fp != NULL)
fclose (fp);
unlink (name);
return retval;
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1992, 1996 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
@ -36,6 +36,13 @@ DEFUN(main, (argc, argv), int argc AND char **argv)
if (sscanf ("0", "%d", &x) != 1)
exit (EXIT_FAILURE);
sscanf ("conversion] Zero flag Ze]ro#\n", "%*[^]] %[^#]\n", buf);
if (strcmp (buf, "] Zero flag Ze]ro") != 0)
{
fputs ("test failed!", stderr);
return 1;
}
if (argc == 2 && !strcmp (argv[1], "-opipe"))
{
out = popen ("/bin/cat", "w");

View File

@ -5,7 +5,7 @@
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
@ -14,10 +14,10 @@
static char rcsid[] = "$NetBSD: s_scalbn.c,v 1.8 1995/05/10 20:48:08 jtc Exp $";
#endif
/*
/*
* scalbn (double x, int n)
* scalbn(x,n) returns x* 2**n computed by exponent
* manipulation rather than by actually performing an
* scalbn(x,n) returns x* 2**n computed by exponent
* manipulation rather than by actually performing an
* exponentiation or a multiplication.
*/
@ -35,9 +35,9 @@ huge = 1.0e+300,
tiny = 1.0e-300;
#ifdef __STDC__
double scalbn (double x, int n)
double __scalbn (double x, int n)
#else
double scalbn (x,n)
double __scalbn (x,n)
double x; int n;
#endif
{
@ -46,20 +46,20 @@ tiny = 1.0e-300;
k = (hx&0x7ff00000)>>20; /* extract exponent */
if (k==0) { /* 0 or subnormal x */
if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
x *= two54;
x *= two54;
GET_HIGH_WORD(hx,x);
k = ((hx&0x7ff00000)>>20) - 54;
k = ((hx&0x7ff00000)>>20) - 54;
if (n< -50000) return tiny*x; /*underflow*/
}
if (k==0x7ff) return x+x; /* NaN or Inf */
k = k+n;
if (k > 0x7fe) return huge*copysign(huge,x); /* overflow */
k = k+n;
if (k > 0x7fe) return huge*__copysign(huge,x); /* overflow */
if (k > 0) /* normal result */
{SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
if (k <= -54)
if (n > 50000) /* in case integer overflow in n+k */
return huge*copysign(huge,x); /*overflow*/
else return tiny*copysign(tiny,x); /*underflow*/
return huge*__copysign(huge,x); /*overflow*/
else return tiny*__copysign(tiny,x); /*underflow*/
k += 54; /* subnormal result */
SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
return x*twom54;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1993 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1993, 1996 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,31 +17,42 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <sysdep.h>
#ifdef __svr4__
#include <sys/trap.h>
#else
#include <machine/trap.h>
#endif
/* NOTE: This code depends on the definition of `__jmp_buf' in <jmp_buf.h>. */
#include <jmp_buf.h>
#define ENV(reg) [%g1 + (reg * 4)]
ENTRY (__longjmp)
/* Do a "flush register windows trap". The trap handler in the
kernel writes all the register windows to their stack slots, and
marks them all as invalid (needing to be sucked up from the
stack when used). This ensures that all information needed to
unwind to these callers is in memory, not in the register
windows. */
ta ST_FLUSH_WINDOWS
ld [%o0], %o7 /* Return PC. */
ld [%o0 + 4], %fp /* Saved SP. */
sub %fp, 64, %sp /* Allocate a register save area. */
/* Store our arguments in global registers so we can still
use them while unwinding frames and their register windows. */
mov %o0, %g1 /* ENV in %g1 */
orcc %o1, %g0, %g6 /* VAL in %g6 */
be,a 0f /* Branch if zero; else skip delay slot. */
mov 1, %g6 /* Delay slot only hit if zero: VAL = 1. */
0:
/* if (%o1 == 0) %o1 = 1; */
tst %o1
be,a Ldone
mov 1, %o1
/* Cache target FP in register %g7. */
ld ENV (JB_FP), %g7
Ldone: retl
/* On the way out, put the return value in %o0. */
restore %o1, 0, %o0
/* Now we will loop, unwinding the register windows up the stack
until the restored %fp value matches the target value in %g7. */
loop: cmp %fp, %g7 /* Have we reached the target frame? */
bl,a loop /* Loop while current fp is below target. */
restore /* Unwind register window in delay slot. */
be,a found /* Better have hit it exactly. */
ld ENV (JB_SP), %o0 /* Delay slot: extract target SP. */
bogus: /* Get here only if the jmp_buf or stack is clobbered. */
call C_SYMBOL_NAME (abort)
nop
unimp 0
found: /* We have unwound register windows so %fp matches the target. */
cmp %o0, %sp /* Check jmp_buf SP vs register window. */
bge,a sp_ok /* Saved must not be deeper than register. */
mov %o0, %sp /* OK, install new SP. */
b,a bogus /* Bogus, we lose. */
sp_ok: ld ENV (JB_PC), %o0 /* Extract target return PC. */
jmp %o0 + 8 /* Return there. */
mov %g6, %o0 /* Delay slot: set return value. */

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1993, 1994, 1996 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,15 +17,15 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <sysdep.h>
/* NOTE: This code depends on the definition of `__jmp_buf' in <jmp_buf.h>. */
#include <jmp_buf.h>
ENTRY (__sigsetjmp)
/* Save our return PC and SP (second store in the jmp delay slot). */
st %o7, [%o0]
/* Save the signal mask if requested. We do this as a tail-call
/* Save our SP and FP; in the delay slot of the jump, save our
return PC. Save the signal mask if requested with a tail-call
for simplicity; it always returns zero. */
sethi %hi(C_SYMBOL_NAME (__sigjmp_save)), %g1
st %sp, [%o0 + (JB_SP*4)]
or %lo(C_SYMBOL_NAME (__sigjmp_save)), %g1, %g1
st %fp, [%o0 + (JB_FP*4)]
jmp %g1
st %sp, [%o0 + 4]
st %o7, [%o0 + (JB_PC*4)]

View File

@ -89,7 +89,7 @@ typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__)));
/* Macros for accessing the hardware control word. */
#define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (cw))
#define _FPU_SETCW(cw) __asm__ ("fldcw %0" : "m" (cw))
#define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (cw))
/* Default control word set at startup. */
extern fpu_control_t __fpu_control;

View File

@ -0,0 +1,33 @@
/* Copyright (C) 1996 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
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <ansidecl.h>
#include <errno.h>
#include <signal.h>
#include <stddef.h>
#include <unistd.h>
extern int __syscall_sigsuspend (int, unsigned long, unsigned long);
/* Change the set of blocked signals to SET,
wait until a signal arrives, and restore the set of blocked signals. */
int
DEFUN(sigsuspend, (set), CONST sigset_t *set)
{
return __syscall_sigsuspend (0, 0, *set);
}

View File

@ -18,10 +18,10 @@ munlockall - munlockall 0 __munlockall munlockall
pipe - pipe 1 __pipe pipe
reboot - reboot 3 reboot
s_ptrace ptrace ptrace 4 __syscall_ptrace
s_sigsuspend sigsuspend sigsuspend 3 __syscall_sigsuspend
setpgid - setpgid 2 setpgid
sigpending - sigpending 1 sigpending
sigprocmask - sigprocmask 3 __sigprocmask sigprocmask
sigsuspend - sigsuspend 1 sigsuspend
stty - stty 2 stty
umount - umount 1 __umount umount
wait4 - wait4 4 __wait4 wait4