1997-05-21 02:49  Ulrich Drepper  <drepper@cygnus.com>

	* gnu-versions.h (_GNU_OBSTACK_INTERFACE_VERSION): Set to 2 since
	interface was changed with addition of _obstack_memory_used.
	Suggested by Ian Taylor <ian@cygnus.com>.

	* malloc/obstack.c: Include <config.h>.  Include <stdlib.h> only
	if __GNU_LIBRARY__ or HAVE_STDLIB_H is defined.
	Reported by Ian Taylor <ian@cygnus.com>.

	* dirent/Makefile (routines): Add versionsort.
	* dirent/dirent.h: Add prototype for versionsort.
	* dirent/versionsort.c: New file.
	* manual/filesys.texi: Add documentation for versionsort.
	* manual/string.texi: Add documentation for strverscmp.
	* string/Makefile (routines): Add strverscmp.
	(tests): Add tst-svc.
	* string/string.h: Add prototype for strverscmp.
	* string/strverscmp.c: New file.
	* string/tst-svc.c: New file.  Test for strverscmp.
	* string/tst-svc.input: New file.  Input data for tst-svc.
	* string/tst-svc.expect: New file.  Expected out from tst-svc.

	* math/Makefile (calls): Add s_signbit.

	* po/sv.po: Update.

	* resolv/nss_dns/dns-host.c: Add casts to prevent warnings.
	* sunrpc/pmap_rmt.c: Likewise.

	* string/basename.c: Don't use ISO C definition style.
	Include <config.h> is HAVE_CONFIG_H is defined.

	* sunrpc/proto.h: Add `const' wherever possible.
	* sunrpc/rpc_cout.c: Likewise.
	* sunrpc/rpc_svcout.c: Likewise.
	* sunrpc/xdr_mem.c: Likewise.
	* sunrpc/xdr_rec.c: Likewise.
	* sunrpc/xdr_stdio.c: Likewise.
	* sunrpc/rpc_parse.c: Delete comma from end of enum definition.
	* sunrpc/xdr.c: Little code cleanups.
	* sunrpc/xdr_flaot.c: Likewise.
	Patches by Matthew Wilcox <matthew.wilcox@chbs.mhs.ciba.com>.

	* sysdeps/i386/fpu/__math.h (__finite): Fix typo.

	* sysdeps/unix/sysv/linux/shmdt.c: Add cast to prevent warning.

	* time/europe: Update from tzdata1997f.
	* time/zic.c: Update from tzcode1997e.

1997-05-20 19:20  Miguel de Icaza <miguel@athena.nuclecu.unam.mx>

	* sysdeps/sparc/setjmp.S: Flush windows.
	Bug found by Richard Henderson.

1997-05-19 12:54  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* misc/efgcvt_r.c (fcvt_r, ecvt_r): Rewritten as to fit the specs.

1997-05-19 18:41  Thorsten Kukuk  <kukuk@uni-paderborn.de>

	* nis/nss_nisplus/nisplus-spwd.c (_nss_nisplus_parse_spent): Use
	atol instead of atoi.

1997-05-18 00:22  Philip Blundell <pjb27@cam.ac.uk>

	* inet/Makefile (routines): Add if_index.
	* sysdeps/unix/sysv/linux/if_index.c: New file.
	* sysdeps/stub/if_index.c: New file.
	* sysdeps/unix/sysv/linux/net/if.h: Add prototypes for routines in
	if_index.c (required by IPv6 basic API).
	* sysdeps/unix/sysv/linux/netinet/in.h: Add struct ipv6_pktinfo.

1997-05-17 23:29  Philip Blundell  <pjb27@cam.ac.uk>

	* sysdeps/unix/sysv/linux/netinet/in.h: Update IPv6 definitions
	for new advanced API draft.

1997-05-13 21:33  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* stdio-common/printf_fp.c: Only use the field width for deciding
	on padding when printing special values.
	* stdio-common/printf_fphex.c: Likewise.

1997-05-15 13:14  Miles Bader  <miles@gnu.ai.mit.edu>

	Changes by Thomas Bushnell <thomas@gnu.ai.mit.edu>:
	* hurd/hurdauth.c (_S_msg_add_auth): Implement correctly.

1997-05-12 14:50  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* hurd/hurdsig.c (_hurdsig_init): Double size of sigthread stack;
	msg_add_auth was overflowing it.

1997-05-12 21:20  Richard Henderson  <rth@tamu.edu>

	* elf/dl-lookup.c (_dl_lookup_symbol_skip): Call _dl_signal_error
	when we can't find the symbol.

1997-05-12 16:54  Ulrich Drepper  <drepper@cygnus.com>

	* posix/regex.c: Fix handling of 32-bit Windog environments.
	Patch by Arnold Robbins <arnold@skeeve.atl.ga.us>.

1997-05-10 23:26  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/sysv/linux/m68k/syscalls.list: Add cacheflush.

1997-05-10 11:40  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* elf/ldd.bash.in: Remove spurious quote character from version
	message.

1997-05-10 08:49  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* locale/programs/locale.c (write_charmaps): Don't get stuck in a
	loop if the file ends in a long line without newline.
	* locale/programs/charmap.c (charmap_read): Likewise.

1997-05-12 03:47  Ulrich Drepper  <drepper@cygnus.com>

	* sunrpc/rpc/xdr.h: Include more headers to be self-contained.
	* sunrpc/rpc/svc_auth.h: Likewise.
	* sunrpc/rpc/svc.h: Likewise.
	* sunrpc/rpc/rpc_msg.h: Likewise.
	* sunrpc/rpc/pmap_rmt.h: Likewise.
	* sunrpc/rpc/pmap_clnt.h: Likewise.
	* sunrpc/rpc/clnt.h: Likewise.
	* sunrpc/rpc/auth_unix.h: Likewise.
	* sysdeps/generic/rpc/auth.h: Likewise.
	Patches by Michael Deutschmann <ldeutsch@mail.netshop.net>.

1997-05-11 15:29  Philip Blundell  <pjb27@cam.ac.uk>

	* sysdeps/stub/sigaction.c (__sigaction): Correct typo.
	* sysdeps/standalone/arm/errnos.h: New file.
	* sysdeps/stub/sys/param.h: Add dummy definition of MAXSYMLINKS.
	* sysdeps/unix/arm/fork.S: New file.
	* sysdeps/unix/sysv/linux/arm/sysdep.h: New file.
	* sysdeps/stub/tempname.c (__stdio_gen_tempname): Add missing
	`streamptr' argument.
	* sysdeps/stub/vdprintf.c: Remove second copy of file (!), include
	<stdarg.h> to get va_list defined, return 0 not NULL.
	* sysdeps/unix/sysv/linux/statfsbuf.h: Include <gnu/types.h>.
	* sysdeps/unix/sysv/linux/arm/syscall.S: New file.
	* sysdeps/stub/direntry.h (struct dirent): Add missing ';'.
	* sysdeps/stub/seekdir.c (seekdir): Likewise.
	* sysdeps/stub/dirfd.c (dirfd): Argument dirp is DIR*, not FILE*.
	* sysdeps/standalone/dirstream.h: Define struct __dirstream
	not DIR; <dirent.h> provides typedef.
	* sysdeps/unix/sysv/linux/arm/clone.S: New file.
	* sysdeps/unix/sysv/linux/arm/socket.S: New file.
	* sysdeps/stub/sysconf.c (__sysconf): Fix typos.

1997-05-01 06:35  Geoff Keating  <geoffk@ozemail.com.au>

	* sysdeps/powerpc/Dist: New file.
	* sysdeps/powerpc/Makefile: New file.
	* sysdeps/powerpc/fclrexcpt.c: New file.
	* sysdeps/powerpc/fegetenv.c: New file.
	* sysdeps/powerpc/fegetround.c: New file.
	* sysdeps/powerpc/feholdexcpt.c: New file.
	* sysdeps/powerpc/fenvbits.h: New file.
	* sysdeps/powerpc/fenv_const.c: New file.
	* sysdeps/powerpc/fenv_libc.h: New file.
	* sysdeps/powerpc/fesetenv.c: New file.
	* sysdeps/powerpc/fesetround.c: New file.
	* sysdeps/powerpc/feupdateenv.c: New file.
	* sysdeps/powerpc/fgetexcptflg.c: New file.
	* sysdeps/powerpc/fraiseexcpt.c: New file.
	* sysdeps/powerpc/fsetexcptflg.c: New file.
	* sysdeps/powerpc/ftestexcept.c: New file.
	* sysdeps/powerpc/mathbits.h: New file.

	* sysdeps/powerpc/dl-machine.h: Wrap in #ifndef dl_machine_h;
	define elf_machine_lookup_noexec_p, elf_machine_lookup_noplt_p,
	ELF_MACHINE_RELOC_NOPLT; consequent changes to elf_machine_rela.

	* sysdeps/powerpc/__math.h: Remove definition for hypot and __sgn.

	* sysdep/powerpc/fpu_control.h: Correct IEEE default mode.

	* sysdeps/unix/sysv/linux/powerpc/sysdep.h: Don't use .text, but
	instead .section ".text".

1997-04-25 05:06  Geoff Keating  <geoffk@ozemail.com.au>

	* sysdeps/powerpc/__longjmp.S: Use symbolic register numbering.
	* sysdeps/powerpc/bsd-_setjmp.S: Likewise.
	* sysdeps/powerpc/bsd-setjmp.S: Likewise.
	* sysdeps/powerpc/setjmp.S: Likewise.

	* sysdeps/unix/sysv/linux/clone.S: Likewise.
	* sysdeps/unix/sysv/linux/socket.S: Likewise.
	* sysdeps/unix/sysv/linux/syscall.S: Likewise.

1997-04-20 04:37  Geoff Keating  <geoffk@ozemail.com.au>

	* sysdeps/powerpc/strchr.s: New file.
	* sysdeps/powerpc/strcmp.s: New (ugly) file.
	* sysdeps/powerpc/memset.s: New file.
	* string/tester.c: Include prototype and _GNU_SOURCE to make
	standalone compilation possible. Give strcmp a better
	test. Give memset a better test.

1997-04-05 06:34  Geoff Keating  <geoffk@ozemail.com.au>

	* sysdeps/powerpc/strlen.s: Fixed bugs (how did it ever pass its
	tests before?). Changed to symbolic register numbering as an
	experiment.
	* sysdeps/powerpc/ffs.c: Don't include bstring.h, it doesn't
	exist.
	* sysdeps/rs6000/ffs.c: Likewise.

1997-05-12 02:28  Ulrich Drepper  <drepper@cygnus.com>

	* time/sys/time.h: Make second argument of setitimer const.
	Patch by Michael Deutschmann <ldeutsch@mail.netshop.net>.
	* sysdeps/stub/setitimer.c: Likewise.
	* sysdeps/mach/hurd/setitimer.c: Likewise.
This commit is contained in:
Ulrich Drepper 1997-05-21 01:48:59 +00:00
parent 43b0e40f85
commit 1f205a479b
116 changed files with 3212 additions and 1137 deletions

View File

@ -21,3 +21,5 @@ crypt
linuxthreads
localedata
secure_rpc
aio

5
BUGS
View File

@ -1,7 +1,7 @@
List of known bugs (certainly very incomplete)
----------------------------------------------
Time-stamp: <1997-03-22T04:31:41+0100 drepper>
Time-stamp: <1997-05-12T02:39:19+0200 drepper>
This following list contains those bugs which I'm aware of. Please
make sure that bugs you report are not listed here. If you can fix one
@ -29,8 +29,7 @@ Severity: [ *] to [***]
[ **] There are problems with signal handling when using LinuxThreads.
[ **] The `cbrtl' function is inaccurate. The algorithm used for `double'
and `float' is not usable for `long double'.
[ **] The `cbrtl' function for ix86 does not work in the moment.
[ **] Not really a bug, but it could lead to such:
The RPC code is ugly ugly ugly. It's more or less verbatim taken

222
ChangeLog
View File

@ -1,3 +1,225 @@
1997-05-21 02:49 Ulrich Drepper <drepper@cygnus.com>
* gnu-versions.h (_GNU_OBSTACK_INTERFACE_VERSION): Set to 2 since
interface was changed with addition of _obstack_memory_used.
Suggested by Ian Taylor <ian@cygnus.com>.
* malloc/obstack.c: Include <config.h>. Include <stdlib.h> only
if __GNU_LIBRARY__ or HAVE_STDLIB_H is defined.
Reported by Ian Taylor <ian@cygnus.com>.
* dirent/Makefile (routines): Add versionsort.
* dirent/dirent.h: Add prototype for versionsort.
* dirent/versionsort.c: New file.
* manual/filesys.texi: Add documentation for versionsort.
* manual/string.texi: Add documentation for strverscmp.
* string/Makefile (routines): Add strverscmp.
(tests): Add tst-svc.
* string/string.h: Add prototype for strverscmp.
* string/strverscmp.c: New file.
* string/tst-svc.c: New file. Test for strverscmp.
* string/tst-svc.input: New file. Input data for tst-svc.
* string/tst-svc.expect: New file. Expected out from tst-svc.
* math/Makefile (calls): Add s_signbit.
* po/sv.po: Update.
* resolv/nss_dns/dns-host.c: Add casts to prevent warnings.
* sunrpc/pmap_rmt.c: Likewise.
* string/basename.c: Don't use ISO C definition style.
Include <config.h> is HAVE_CONFIG_H is defined.
* sunrpc/proto.h: Add `const' wherever possible.
* sunrpc/rpc_cout.c: Likewise.
* sunrpc/rpc_svcout.c: Likewise.
* sunrpc/xdr_mem.c: Likewise.
* sunrpc/xdr_rec.c: Likewise.
* sunrpc/xdr_stdio.c: Likewise.
* sunrpc/rpc_parse.c: Delete comma from end of enum definition.
* sunrpc/xdr.c: Little code cleanups.
* sunrpc/xdr_flaot.c: Likewise.
Patches by Matthew Wilcox <matthew.wilcox@chbs.mhs.ciba.com>.
* sysdeps/i386/fpu/__math.h (__finite): Fix typo.
* sysdeps/unix/sysv/linux/shmdt.c: Add cast to prevent warning.
* time/europe: Update from tzdata1997f.
* time/zic.c: Update from tzcode1997e.
1997-05-20 19:20 Miguel de Icaza <miguel@athena.nuclecu.unam.mx>
* sysdeps/sparc/setjmp.S: Flush windows.
Bug found by Richard Henderson.
1997-05-19 12:54 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* misc/efgcvt_r.c (fcvt_r, ecvt_r): Rewritten as to fit the specs.
1997-05-19 18:41 Thorsten Kukuk <kukuk@uni-paderborn.de>
* nis/nss_nisplus/nisplus-spwd.c (_nss_nisplus_parse_spent): Use
atol instead of atoi.
1997-05-18 00:22 Philip Blundell <pjb27@cam.ac.uk>
* inet/Makefile (routines): Add if_index.
* sysdeps/unix/sysv/linux/if_index.c: New file.
* sysdeps/stub/if_index.c: New file.
* sysdeps/unix/sysv/linux/net/if.h: Add prototypes for routines in
if_index.c (required by IPv6 basic API).
* sysdeps/unix/sysv/linux/netinet/in.h: Add struct ipv6_pktinfo.
1997-05-17 23:29 Philip Blundell <pjb27@cam.ac.uk>
* sysdeps/unix/sysv/linux/netinet/in.h: Update IPv6 definitions
for new advanced API draft.
1997-05-13 21:33 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* stdio-common/printf_fp.c: Only use the field width for deciding
on padding when printing special values.
* stdio-common/printf_fphex.c: Likewise.
1997-05-15 13:14 Miles Bader <miles@gnu.ai.mit.edu>
Changes by Thomas Bushnell <thomas@gnu.ai.mit.edu>:
* hurd/hurdauth.c (_S_msg_add_auth): Implement correctly.
1997-05-12 14:50 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* hurd/hurdsig.c (_hurdsig_init): Double size of sigthread stack;
msg_add_auth was overflowing it.
1997-05-12 21:20 Richard Henderson <rth@tamu.edu>
* elf/dl-lookup.c (_dl_lookup_symbol_skip): Call _dl_signal_error
when we can't find the symbol.
1997-05-12 16:54 Ulrich Drepper <drepper@cygnus.com>
* posix/regex.c: Fix handling of 32-bit Windog environments.
Patch by Arnold Robbins <arnold@skeeve.atl.ga.us>.
1997-05-10 23:26 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/sysv/linux/m68k/syscalls.list: Add cacheflush.
1997-05-10 11:40 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* elf/ldd.bash.in: Remove spurious quote character from version
message.
1997-05-10 08:49 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* locale/programs/locale.c (write_charmaps): Don't get stuck in a
loop if the file ends in a long line without newline.
* locale/programs/charmap.c (charmap_read): Likewise.
1997-05-12 03:47 Ulrich Drepper <drepper@cygnus.com>
* sunrpc/rpc/xdr.h: Include more headers to be self-contained.
* sunrpc/rpc/svc_auth.h: Likewise.
* sunrpc/rpc/svc.h: Likewise.
* sunrpc/rpc/rpc_msg.h: Likewise.
* sunrpc/rpc/pmap_rmt.h: Likewise.
* sunrpc/rpc/pmap_clnt.h: Likewise.
* sunrpc/rpc/clnt.h: Likewise.
* sunrpc/rpc/auth_unix.h: Likewise.
* sysdeps/generic/rpc/auth.h: Likewise.
Patches by Michael Deutschmann <ldeutsch@mail.netshop.net>.
1997-05-11 15:29 Philip Blundell <pjb27@cam.ac.uk>
* sysdeps/stub/sigaction.c (__sigaction): Correct typo.
* sysdeps/standalone/arm/errnos.h: New file.
* sysdeps/stub/sys/param.h: Add dummy definition of MAXSYMLINKS.
* sysdeps/unix/arm/fork.S: New file.
* sysdeps/unix/sysv/linux/arm/sysdep.h: New file.
* sysdeps/stub/tempname.c (__stdio_gen_tempname): Add missing
`streamptr' argument.
* sysdeps/stub/vdprintf.c: Remove second copy of file (!), include
<stdarg.h> to get va_list defined, return 0 not NULL.
* sysdeps/unix/sysv/linux/statfsbuf.h: Include <gnu/types.h>.
* sysdeps/unix/sysv/linux/arm/syscall.S: New file.
* sysdeps/stub/direntry.h (struct dirent): Add missing ';'.
* sysdeps/stub/seekdir.c (seekdir): Likewise.
* sysdeps/stub/dirfd.c (dirfd): Argument dirp is DIR*, not FILE*.
* sysdeps/standalone/dirstream.h: Define struct __dirstream
not DIR; <dirent.h> provides typedef.
* sysdeps/unix/sysv/linux/arm/clone.S: New file.
* sysdeps/unix/sysv/linux/arm/socket.S: New file.
* sysdeps/stub/sysconf.c (__sysconf): Fix typos.
1997-05-01 06:35 Geoff Keating <geoffk@ozemail.com.au>
* sysdeps/powerpc/Dist: New file.
* sysdeps/powerpc/Makefile: New file.
* sysdeps/powerpc/fclrexcpt.c: New file.
* sysdeps/powerpc/fegetenv.c: New file.
* sysdeps/powerpc/fegetround.c: New file.
* sysdeps/powerpc/feholdexcpt.c: New file.
* sysdeps/powerpc/fenvbits.h: New file.
* sysdeps/powerpc/fenv_const.c: New file.
* sysdeps/powerpc/fenv_libc.h: New file.
* sysdeps/powerpc/fesetenv.c: New file.
* sysdeps/powerpc/fesetround.c: New file.
* sysdeps/powerpc/feupdateenv.c: New file.
* sysdeps/powerpc/fgetexcptflg.c: New file.
* sysdeps/powerpc/fraiseexcpt.c: New file.
* sysdeps/powerpc/fsetexcptflg.c: New file.
* sysdeps/powerpc/ftestexcept.c: New file.
* sysdeps/powerpc/mathbits.h: New file.
* sysdeps/powerpc/dl-machine.h: Wrap in #ifndef dl_machine_h;
define elf_machine_lookup_noexec_p, elf_machine_lookup_noplt_p,
ELF_MACHINE_RELOC_NOPLT; consequent changes to elf_machine_rela.
* sysdeps/powerpc/__math.h: Remove definition for hypot and __sgn.
* sysdep/powerpc/fpu_control.h: Correct IEEE default mode.
* sysdeps/unix/sysv/linux/powerpc/sysdep.h: Don't use .text, but
instead .section ".text".
1997-04-25 05:06 Geoff Keating <geoffk@ozemail.com.au>
* sysdeps/powerpc/__longjmp.S: Use symbolic register numbering.
* sysdeps/powerpc/bsd-_setjmp.S: Likewise.
* sysdeps/powerpc/bsd-setjmp.S: Likewise.
* sysdeps/powerpc/setjmp.S: Likewise.
* sysdeps/unix/sysv/linux/clone.S: Likewise.
* sysdeps/unix/sysv/linux/socket.S: Likewise.
* sysdeps/unix/sysv/linux/syscall.S: Likewise.
1997-04-20 04:37 Geoff Keating <geoffk@ozemail.com.au>
* sysdeps/powerpc/strchr.s: New file.
* sysdeps/powerpc/strcmp.s: New (ugly) file.
* sysdeps/powerpc/memset.s: New file.
* string/tester.c: Include prototype and _GNU_SOURCE to make
standalone compilation possible. Give strcmp a better
test. Give memset a better test.
1997-04-05 06:34 Geoff Keating <geoffk@ozemail.com.au>
* sysdeps/powerpc/strlen.s: Fixed bugs (how did it ever pass its
tests before?). Changed to symbolic register numbering as an
experiment.
* sysdeps/powerpc/ffs.c: Don't include bstring.h, it doesn't
exist.
* sysdeps/rs6000/ffs.c: Likewise.
1997-05-12 02:28 Ulrich Drepper <drepper@cygnus.com>
* time/sys/time.h: Make second argument of setitimer const.
Patch by Michael Deutschmann <ldeutsch@mail.netshop.net>.
* sysdeps/stub/setitimer.c: Likewise.
* sysdeps/mach/hurd/setitimer.c: Likewise.
1997-05-10 11:46 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
* nis/rpcsvc/nis_callback.x: New, from tirpcsrc-2.3.

13
FAQ
View File

@ -183,7 +183,12 @@ Library.
slow.
* plenty of time (approx 1h for i?86-linux on i586@133 or 2.5h on
i486@66 or 4.5h on i486@33). For Hurd systems times are much higher.
i486@66 or 4.5h on i486@33), both for shared and static only).
For Hurd systems times are much higher.
For Atari Falcon (Motorola 68030 @ 16 Mhz, 14 Mb memory) James Troup
<J.J.Troup@comp.brad.ac.uk> reports for a full build (shared, static,
and profiled) a compile time of 45h34m.
If you have some more measurements let me know.
@ -578,6 +583,10 @@ something like this:
GROUP ( libc.so.6 ld.so.1 libc.a )
or in ix86/Linux and alpha/Linux:
GROUP ( libc.so.6 ld-linux.so.2 libc.a )
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
[Q18] ``The prototypes for `connect', `accept', `getsockopt',
@ -699,7 +708,7 @@ Answers were given by:
{DMT} David Mosberger-Tang, <davidm@AZStarNet.com>
{RM} Roland McGrath, <roland@gnu.ai.mit.edu>
{HJL} H.J. Lu, <hjl@gnu.ai.mit.edu>
{AJ} Andreas Jaeger, <aj@arthur.pfalz.de>
{AJ} Andreas Jaeger, <aj@arthur.rhein-neckar.de>
{EY} Eric Youngdale, <eric@andante.jic.com>
Local Variables:

View File

@ -23,7 +23,7 @@ subdir := dirent
headers := dirent.h direntry.h
routines := opendir closedir readdir readdir_r rewinddir \
seekdir telldir scandir alphasort \
seekdir telldir scandir alphasort versionsort \
getdents dirfd
distribute := dirstream.h

View File

@ -175,6 +175,10 @@ extern int scandir __P ((__const char *__dir,
/* Function to compare two `struct dirent's alphabetically. */
extern int alphasort __P ((__const __ptr_t, __const __ptr_t));
# ifdef __USE_GNU
/* Function to compare two `struct dirent's by name & version. */
extern int versionsort __P ((__const __ptr_t, __const __ptr_t));
#endif
/* Read directory entries from FD into BUF, reading at most NBYTES.
Reading starts at offset *BASEP, and *BASEP is updated with the new

27
dirent/versionsort.c Normal file
View File

@ -0,0 +1,27 @@
/* Copyright (C) 1992, 1997 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 <dirent.h>
#include <string.h>
int
versionsort (const void *a, const void *b)
{
return strverscmp ((*(const struct dirent **) a)->d_name,
(*(const struct dirent **) b)->d_name);
}

View File

@ -332,6 +332,18 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name,
reference_name, version, skip_map, 0))
break;
if (current_value.s == NULL &&
(*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK))
{
/* We could find no value for a strong reference. */
static const char msg[] = "undefined symbol: ";
const size_t len = strlen (undef_name);
char buf[sizeof msg + len];
memcpy (buf, msg, sizeof msg - 1);
memcpy (&buf[sizeof msg - 1], undef_name, len + 1);
_dl_signal_error (0, reference_name, buf);
}
*ref = current_value.s;
return current_value.a;
}

View File

@ -35,7 +35,7 @@ bind_now=
while test $# -gt 0; do
case "$1" in
--v | --ve | --ver | --vers | --versi | --versio | --version)
echo '"ldd (GNU libc) @VERSION@'
echo 'ldd (GNU libc) @VERSION@'
echo $"Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."

View File

@ -44,7 +44,7 @@
remember, if any of these versions change, the libc.so major version
number must change too (so avoid it)! */
#define _GNU_OBSTACK_INTERFACE_VERSION 1 /* vs malloc/obstack.c */
#define _GNU_OBSTACK_INTERFACE_VERSION 2 /* vs malloc/obstack.c */
#define _GNU_REGEX_INTERFACE_VERSION 1 /* vs posix/regex.c */
#define _GNU_GLOB_INTERFACE_VERSION 1 /* vs posix/glob.c */
#define _GNU_GETOPT_INTERFACE_VERSION 2 /* vs posix/getopt.c and

View File

@ -37,17 +37,124 @@ _S_msg_add_auth (mach_port_t me,
{
error_t err;
auth_t newauth;
uid_t *genuids, *gengids, *auxuids, *auxgids;
mach_msg_type_number_t ngenuids, ngengids, nauxuids, nauxgids;
uid_t *newgenuids, *newgengids, *newauxuids, *newauxgids;
mach_msg_type_number_t nnewgenuids, nnewgengids, nnewauxuids, nnewauxgids;
if (err = __USEPORT (AUTH,
__auth_makeauth (port,
&addauth, MACH_MSG_TYPE_MOVE_SEND, 1,
NULL, 0,
NULL, 0,
NULL, 0,
NULL, 0,
&newauth)))
/* Create a list of ids and store it in NEWLISTP, length NEWLISTLEN.
Keep all the ids in EXIST (len NEXIST), adding in those from NEW
(len NNEW) which are not already there. */
error_t make_list (uid_t **newlistp, mach_msg_type_number_t *newlistlen,
uid_t *exist, mach_msg_type_number_t nexist,
uid_t *new, mach_msg_type_number_t nnew)
{
error_t urp;
int i, j, k;
vm_size_t offset;
urp = vm_allocate (mach_task_self (), (vm_address_t *) newlistp,
nexist + nnew * sizeof (uid_t), 1);
if (urp)
return urp;
j = 0;
for (i = 0; i < nexist; i++)
(*newlistp)[j++] = exist[i];
for (i = 0; i < nnew; i++)
{
for (k = 0; k < nexist; k++)
if (exist[k] == new[i])
break;
if (k < nexist)
continue;
(*newlistp)[j++] = new[i];
}
offset = (round_page (nexist + nnew * sizeof (uid_t))
- round_page (j * sizeof (uid_t)));
if (offset)
vm_deallocate (mach_task_self (),
(vm_address_t) (*newlistp
+ (nexist + nnew * sizeof (uid_t))),
offset);
*newlistlen = j;
return 0;
}
/* Find out what ids ADDAUTH refers to */
genuids = gengids = auxuids = auxgids = 0;
ngenuids = ngengids = nauxuids = nauxgids = 0;
err = __auth_getids (addauth,
&genuids, &ngenuids,
&auxuids, &nauxuids,
&gengids, &ngengids,
&auxgids, &nauxgids);
if (err)
return err;
/* OR in these ids to what we already have, creating a new list. */
HURD_CRITICAL_BEGIN;
__mutex_lock (&_hurd_id.lock);
_hurd_check_ids ();
#define MAKE(genaux,uidgid) \
make_list (&new ## genaux ## uidgid ## s, \
&nnew ## genaux ## uidgid ## s, \
_hurd_id.genaux.uidgid ## s, \
_hurd_id.genaux.n ## uidgid ## s, \
genaux ## uidgid ## s, \
n ## genaux ## uidgid ## s)
err = MAKE (gen, uid);
if (!err)
MAKE (aux, uid);
if (!err)
MAKE (gen, gid);
if (!err)
MAKE (aux, gid);
#undef MAKE
__mutex_unlock (&_hurd_id.lock);
HURD_CRITICAL_END;
/* Create the new auth port */
if (!err)
err = __USEPORT (AUTH,
__auth_makeauth (port,
&addauth, MACH_MSG_TYPE_MOVE_SEND, 1,
newgenuids, nnewgenuids,
newauxuids, nnewauxuids,
newgengids, nnewgengids,
newauxgids, nnewauxgids,
&newauth));
#define freeup(array, len) \
if (array) \
vm_deallocate (mach_task_self (), (vm_address_t) array, \
len * sizeof (uid_t));
freeup (genuids, ngenuids);
freeup (auxuids, nauxuids);
freeup (gengids, ngengids);
freeup (auxgids, nauxgids);
freeup (newgenuids, nnewgenuids);
freeup (newauxuids, nnewauxuids);
freeup (newgengids, nnewgengids);
freeup (newauxgids, nnewauxgids);
#undef freeup
if (err)
return err;
/* And install it. */
err = __setauth (newauth);
__mach_port_deallocate (__mach_task_self (), newauth);
if (err)

View File

@ -1194,7 +1194,7 @@ _hurdsig_init (void)
err = __thread_create (__mach_task_self (), &_hurd_msgport_thread);
assert_perror (err);
stacksize = __vm_page_size * 4; /* Small stack for signal thread. */
stacksize = __vm_page_size * 8; /* Small stack for signal thread. */
err = __mach_setup_thread (__mach_task_self (), _hurd_msgport_thread,
_hurd_msgport_receive,
(vm_address_t *) &__hurd_sigthread_stack_base,

View File

@ -44,7 +44,7 @@ routines := ntohl ntohs htonl htons \
rcmd rexec ruserpass \
getnetgrent_r getnetgrent \
getaliasent_r getaliasent getaliasname getaliasname_r \
in6_addr getnameinfo
in6_addr getnameinfo if_index
# No warnings about losing BSD code.
CFLAGS-rcmd.c = -w

View File

@ -114,9 +114,9 @@ charmap_read (const char *filename)
if (fscanf (fp, " <code_set_name> %as", &name) == 1)
break;
do
fgets (junk, sizeof junk, fp);
while (strchr (junk, '\n') == NULL);
while (fgets (junk, sizeof junk, fp) != NULL
&& strchr (junk, '\n') == NULL)
continue;
}
fclose (fp);

View File

@ -504,9 +504,9 @@ write_charmaps (void)
if (fscanf (fp, " <code_set_name> %as", &name) == 1)
break;
do
fgets (junk, sizeof junk, fp);
while (strchr (junk, '\n') == NULL);
while (fgets (junk, sizeof junk, fp) != NULL
&& strchr (junk, '\n') == NULL)
continue;
}
fclose (fp);

View File

@ -1,5 +1,5 @@
/* obstack.c - subroutines used implicitly by object stack macros
Copyright (C) 1988,89,90,91,92,93,94,96 Free Software Foundation, Inc.
Copyright (C) 1988,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
This file is part of the GNU C Library. Its master source is NOT part of
the C library, however. The master source lives in /gd/gnu/lib.
@ -19,6 +19,10 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "obstack.h"
/* NOTE BEFORE MODIFYING THIS FILE: This version number must be
@ -85,7 +89,7 @@ void (*obstack_alloc_failed_handler) () = print_and_abort;
#endif
/* Exit value used when `print_and_abort' is used. */
#if defined (__STDC__) && __STDC__
#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifndef EXIT_FAILURE

View File

@ -455,8 +455,8 @@ value are selected.
Finally the entries in the @var{namelist} are sorted using the user
supplied function @var{cmp}. The arguments of the @var{cmp} function
are of type @code{struct dirent **}. I.e., one cannot directly use the
@code{strcmp} or @code{strcoll} function; see the function
@code{alphasort} below.
@code{strcmp} or @code{strcoll} function; see the functions
@code{alphasort} and @code{versionsort} below.
The return value of the function gives the number of entries placed in
@var{namelist}. If it is @code{-1} an error occurred and the global
@ -465,7 +465,7 @@ variable @code{errno} contains more information on the error.
As said above the fourth argument to the @code{scandir} function must be
a pointer to a sorting function. For the convenience of the programmer
the GNU C library contains an implementation of a function which is very
the GNU C library contains implementations of functions which are very
helpful for this purpose.
@deftypefun int alphasort (const void *@var{a}, const void *@var{b})
@ -478,6 +478,11 @@ Return value of is less than, equal to, or greater than zero depending
on the order of the two entries @var{a} and @var{b}.
@end deftypefun
@deftypefun int versionsort (const void *@var{a}, const void *@var{b})
The @code{versionsort} function is like @code{alphasort}, excepted that it
uses the @code{strverscmp} function internally.
@end deftypefun
@node Simple Directory Lister Mark II
@subsection Simple Program to List a Directory, Mark II

View File

@ -608,6 +608,56 @@ strncmp ("hello, world", "hello, stupid world!!!", 5)
@result{} 0 /* @r{The initial 5 characters are the same.} */
@end smallexample
@comment string.h
@comment GNU
@deftypefun int strverscmp (const char *@var{s1}, const char *@var{s2})
The @code{strverscmp} function compares the string @var{s1} against
@var{s2}, considering them as holding indices/version numbers. Return
value follows the same conventions as found in the @code{strverscmp}
function. In fact, if @var{s1} and @var{s2} contain no digits,
@code{strverscmp} behaves like @code{strcmp}.
Basically, we compare strings normaly (character by character), until
we find a digit in each string - then we enter a special comparison
mode, where each sequence of digit is taken as a whole. If we reach the
end of these two parts without noticing a difference, we return to the
standard comparison mode. There are two types of numeric parts:
"integral" and "fractionnal" (these laters begins with a '0'). The types
of the numeric parts affect the way we sort them:
@itemize @bullet
@item
integral/integral: we compare values as you would expect.
@item
fractionnal/integral: the fractionnal part is less than the integral one.
Again, no surprise.
@item
fractionnal/fractionnal: the things become a bit more complex.
if the common prefix contains only leading zeroes, the longest part is less
than the other one; else the comparison behaves normaly.
@end itemize
@smallexample
strverscmp ("no digit", "no digit")
@result{} 0 /* @r{same behaviour as strverscmp.} */
strverscmp ("item#99", "item#100")
@result{} <0 /* @r{same prefix, but 99 < 100.} */
strverscmp ("alpha1", "alpha001")
@result{} >0 /* @r{fractionnal part inferior to integral one.} */
strverscmp ("part1_f012", "part1_f01")
@result{} >0 /* @r{two fractionnal parts.} */
strverscmp ("foo.009", "foo.0")
@result{} <0 /* @r{idem, but with leading zeroes only.} */
@end smallexample
This function is especially usefull when dealing with filename sorting,
because filenames frequently hold indices/version numbers.
@code{strverscmp} is a GNU extension.
@end deftypefun
@comment string.h
@comment BSD
@deftypefun int bcmp (const void *@var{a1}, const void *@var{a2}, size_t @var{size})

View File

@ -1,5 +1,5 @@
%% TeX macros to handle Texinfo files.
%% $Id: texinfo.tex,v 2.198 1997/05/07 15:16:03 drepper Exp $
%% $Id: texinfo.tex,v 2.199 1997/05/20 11:11:48 drepper Exp $
% Copyright (C) 1985, 86, 88, 90, 91, 92, 93,
% 94, 95, 96, 97 Free Software Foundation, Inc.
@ -36,7 +36,7 @@
% This automatically updates the version number based on RCS.
\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
\deftexinfoversion$Revision: 2.198 $
\deftexinfoversion$Revision: 2.199 $
\message{Loading texinfo package [Version \texinfoversion]:}
% If in a .fmt file, print the version number
@ -1271,8 +1271,6 @@ where each line of input produces a line of output.}
\def\ctrl #1{{\tt \rawbackslash \hat}#1}
\let\file=\samp
\let\url=\samp % perhaps include a hypertex \special eventually
\def\email#1{$\langle${\tt #1}$\rangle$}
% @code is a modification of @t,
% which makes spaces the same size as normal in the surrounding text.
@ -1325,7 +1323,7 @@ where each line of input produces a line of output.}
\def\realdash{-}
\def\codedash{-\discretionary{}{}{}}
\def\codeunder{\normalunderscore\discretionary{}{}{}}
\def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}}
\def\codex #1{\tclose{#1}\endgroup}
%\let\exp=\tclose %Was temporary
@ -1339,6 +1337,12 @@ where each line of input produces a line of output.}
\else{\tclose{\ttsl\look}}\fi
\else{\tclose{\ttsl\look}}\fi}
% @url, @email. Quotes do not seem necessary.
\let\url=\code % perhaps include a hypertex \special eventually
% rms does not like the angle brackets --karl, 17may97.
%\def\email#1{$\langle${\tt #1}$\rangle$}
\let\email=\code
% Check if we are currently using a typewriter font. Since all the
% Computer Modern typewriter fonts have zero interword stretch (and
% shrink), and it is reasonable to expect all typewriter fonts to have
@ -3417,8 +3421,8 @@ width0pt\relax} \fi
\let\.=\ptexdot
\let\*=\ptexstar
\let\dots=\ptexdots
\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}
\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}
\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
\def\@{@}%
\let\bullet=\ptexbullet
\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext

View File

@ -67,7 +67,8 @@ distribute += $(long-m-yes:=.c)
# These functions are in libc instead of libm because __printf_fp
# calls them, so any program using printf will need them linked in,
# and we don't want to have to link every program with -lm.
calls = s_isinf s_isnan s_finite s_copysign s_modf s_scalbn s_frexp s_ldexp
calls = s_isinf s_isnan s_finite s_copysign s_modf s_scalbn s_frexp s_ldexp \
s_signbit
routines = $(calls) $(calls:=f) $(long-c-$(long-double-fcts))
long-c-yes = $(calls:=l)
distribute += $(long-c-yes:=.c)

View File

@ -71,7 +71,7 @@ extern void fegetexceptflag __P ((fexcept_t *__flagp, int __excepts));
/* Raise the supported exceptions represented by EXCEPTS. */
extern void feraiseexcept __P ((int __excepts));
/* Set complete status for exceptions inidicated by EXCEPTS according to
/* Set complete status for exceptions indicated by EXCEPTS according to
the representation in the object pointed to by FLAGP. */
extern void fesetexceptflag __P ((__const fexcept_t *__flagp, int __excepts));

View File

@ -37,6 +37,7 @@
#define FLOOR APPEND(floor, FLOAT_NAME_EXT)
#define FABS APPEND(fabs, FLOAT_NAME_EXT)
#define LOG10 APPEND(log10, FLOAT_NAME_EXT)
#define EXP APPEND(exp, FLOAT_NAME_EXT)
int
@ -54,9 +55,12 @@ APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len)
return -1;
}
*sign = value < 0.0;
if (*sign)
value = - value;
if (isfinite (value))
{
*sign = signbit (value) != 0;
if (*sign)
value = -value;
}
n = snprintf (buf, len, "%.*" FLOAT_FMT_FLAG "f", ndigit, value);
if (n < 0)
@ -66,16 +70,29 @@ APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len)
while (i < n && isdigit (buf[i]))
++i;
*decpt = i;
do
++i;
while (! isdigit (buf[i]));
memmove (&buf[i - *decpt], buf, n - (i - *decpt));
if (i == 0)
{
/* Value is Inf or NaN. */
*sign = 0;
return 0;
}
if (i < n)
{
do
++i;
while (i < n && !isdigit (buf[i]));
memmove (&buf[*decpt], &buf[i], n - i);
buf[n - (i - *decpt)] = 0;
}
return 0;
}
#define weak_extern2(name) weak_extern (name)
weak_extern2 (FLOOR) weak_extern2 (LOG10) weak_extern2 (FABS)
weak_extern2 (EXP)
int
APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, buf, len)
@ -84,24 +101,55 @@ APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, buf, len)
char *buf;
size_t len;
{
FLOAT_TYPE (*log10_function) (FLOAT_TYPE) = &LOG10;
int exponent = 0;
if (log10_function)
if (isfinite (value) && value != 0.0)
{
/* Use the reasonable code if -lm is included. */
ndigit -= (int) FLOOR (LOG10 (FABS (value)));
if (ndigit < 0)
ndigit = 0;
}
else
{
/* Slow code that doesn't require -lm functions. */
FLOAT_TYPE d;
for (d = value < 0.0 ? - value : value;
ndigit > 0 && d >= 10.0;
d *= 0.1)
--ndigit;
FLOAT_TYPE (*log10_function) (FLOAT_TYPE) = &LOG10;
if (log10_function)
{
/* Use the reasonable code if -lm is included. */
FLOAT_TYPE dexponent;
dexponent = FLOOR (LOG10 (FABS (value)));
value *= EXP (dexponent * -M_LN10);
exponent = (int) dexponent;
}
else
{
/* Slow code that doesn't require -lm functions. */
FLOAT_TYPE d;
if (value < 0.0)
d = -value;
else
d = value;
if (d < 1.0)
{
do
{
d *= 10.0;
exponent--;
}
while (d < 1.0);
}
else if (d >= 10.0)
{
do
{
d *= 0.1;
exponent++;
}
while (d >= 10.0);
}
if (value < 0.0)
value = -d;
else
value = d;
}
}
return APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len);
if (APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit - 1, decpt, sign, buf, len))
return -1;
*decpt += exponent;
return 0;
}

View File

@ -90,47 +90,47 @@ _nss_nisplus_parse_spent (nis_result *result, struct spwd *sp,
if (cp == NULL)
return 0;
*cp++ = '\0';
sp->sp_lstchg = atoi (line);
sp->sp_lstchg = atol (line);
line = cp;
cp = strchr (line, ':');
if (cp == NULL)
return 0;
*cp++ = '\0';
sp->sp_min = atoi(line);
sp->sp_min = atol(line);
line = cp;
cp = strchr (line, ':');
if (cp == NULL)
return 0;
*cp++ = '\0';
sp->sp_max = atoi(line);
sp->sp_max = atol(line);
line = cp;
cp = strchr (line, ':');
if (cp == NULL)
return 0;
*cp++ = '\0';
sp->sp_warn = atoi(line);
sp->sp_warn = atol(line);
line = cp;
cp = strchr (line, ':');
if (cp == NULL)
return 0;
*cp++ = '\0';
sp->sp_inact = atoi(line);
sp->sp_inact = atol(line);
line = cp;
cp = strchr (line, ':');
if (cp == NULL)
return 0;
*cp++ = '\0';
sp->sp_expire = atoi(line);
sp->sp_expire = atol(line);
line = cp;
if (line == NULL)
return 0;
sp->sp_flag = atoi(line);
sp->sp_flag = atol(line);
return 1;
}

791
po/sv.po

File diff suppressed because it is too large Load Diff

View File

@ -1568,7 +1568,7 @@ static reg_errcode_t compile_range _RE_ARGS ((const char **p_ptr,
MSC and drop MAX_BUF_SIZE a bit. Otherwise you may end up
reallocating to 0 bytes. Such thing is not going to work too well.
You have been warned!! */
#ifdef _MSC_VER
#if defined(_MSC_VER) && !defined(WIN32)
/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes.
The REALLOC define eliminates a flurry of conversion warnings,
but is not required. */

View File

@ -400,7 +400,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
linebuflen -= n;
/* Get canonical name. */
n = strlen (tbuf) + 1; /* For the \0. */
if (n > buflen)
if ((size_t) n > buflen)
{
++had_error;
continue;
@ -423,7 +423,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
cp += n;
/* Get canonical name. */
n = strlen (tbuf) + 1; /* For the \0. */
if (n > buflen)
if ((size_t) n > buflen)
{
++had_error;
continue;

View File

@ -336,7 +336,7 @@ __printf_fp (FILE *fp,
if (special)
{
int width = info->prec > info->width ? info->prec : info->width;
int width = info->width;
if (is_neg || info->showsign || info->space)
--width;

View File

@ -189,7 +189,7 @@ __printf_fphex (FILE *fp,
if (special)
{
int width = info->prec > info->width ? info->prec : info->width;
int width = info->width;
if (negative || info->showsign || info->space)
--width;

View File

@ -24,7 +24,7 @@ subdir := string
headers := string.h strings.h memory.h endian.h bytesex.h \
argz.h envz.h
routines := strcat strchr strcmp strcoll strcpy strcspn \
routines := strcat strchr strcmp strcoll strcpy strcspn strverscmp \
strdup strndup \
strerror _strerror strerror_r strlen strnlen \
strncat strncmp strncpy \
@ -40,7 +40,8 @@ routines := strcat strchr strcmp strcoll strcpy strcspn \
envz basename \
strcoll_l strxfrm_l
tests := tester testcopy test-ffs tst-strlen stratcliff
tests := tester testcopy test-ffs tst-strlen stratcliff \
tst-svc
distribute := memcopy.h pagecopy.h
@ -50,3 +51,6 @@ tester-ENV = LANGUAGE=C
CFLAGS-tester.c = -fno-builtin
CFLAGS-tst-strlen.c = -fno-builtin
CFLAGS-stratcliff.c = -fno-builtin
tests: $(objpfx)tst-svc.out
cmp tst-svc.expect $(objpfx)tst-svc.out

View File

@ -17,10 +17,15 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <string.h>
char *
basename (const char *filename)
basename (filename)
const char *filename;
{
char *p = strrchr (filename, '/');
return p ? p + 1 : (char *) filename;

View File

@ -241,6 +241,9 @@ extern char *strsep __P ((char **__stringp, __const char *__delim));
#endif
#ifdef __USE_GNU
/* Compare S1 and S2 as strings holding name & indices/version numbers. */
extern int strverscmp __P ((__const char *__s1, __const char *__s2));
/* Return a string describing the meaning of the signal number in SIG. */
extern char *strsignal __P ((int __sig));

111
string/strverscmp.c Normal file
View File

@ -0,0 +1,111 @@
/* Compare strings while treating digits characters numerically.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jean-François Bignolles <bignolle@ecoledoc.ibp.fr>, 1997.
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 <string.h>
#include <ctype.h>
/* states: S_N: normal, S_I: comparing integral part, S_F: comparing
Fractionnal parts, S_Z: idem but with leading Zeroes only */
#define S_N 0x0
#define S_I 0x4
#define S_F 0x8
#define S_Z 0xC
/* result_type: CMP: return diff; LEN: compare using len_diff/diff */
#define CMP 2
#define LEN 3
/* Compare S1 and S2 as strings holding indices/version numbers,
returning less than, equal to or greater than zero if S1 is less than,
equal to or greater than S2 (for more info, see the texinfo doc).
*/
int
strverscmp (s1, s2)
const char *s1;
const char *s2;
{
const unsigned char *p1 = (const unsigned char *) s1;
const unsigned char *p2 = (const unsigned char *) s2;
unsigned char c1, c2;
int state;
int diff;
/* Symbol(s) 0 [1-9] others (padding)
Transition (10) 0 (01) d (00) x (11) - */
static const unsigned int next_state[] =
{
/* state x d 0 - */
/* S_N */ S_N, S_I, S_Z, S_N,
/* S_I */ S_N, S_I, S_I, S_I,
/* S_F */ S_N, S_F, S_F, S_F,
/* S_Z */ S_N, S_F, S_Z, S_Z
};
static const int result_type[] =
{
/* state x/x x/d x/0 x/- d/x d/d d/0 d/-
0/x 0/d 0/0 0/- -/x -/d -/0 -/- */
/* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
/* S_I */ CMP, -1, -1, CMP, +1, LEN, LEN, CMP,
+1, LEN, LEN, CMP, CMP, CMP, CMP, CMP,
/* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
/* S_Z */ CMP, +1, +1, CMP, -1, CMP, CMP, CMP,
-1, CMP, CMP, CMP
};
if (p1 == p2)
return 0;
c1 = *p1++;
c2 = *p2++;
/* Hint: '0' is a digit too. */
state = S_N | (c1 == '0') + (isdigit (c1) != 0);
while ((diff = c1 - c2) == 0 && c1 != '\0')
{
state = next_state[state];
c1 = *p1++;
c2 = *p2++;
state |= (c1 == '0') + (isdigit (c1) != 0);
}
state = result_type[state << 2 | ((c2 == '0') + (isdigit (c2) != 0))];
switch (state)
{
case CMP:
return diff;
case LEN:
while (isdigit (*p1++))
if (!isdigit (*p2++))
return 1;
return isdigit (*p2) ? -1 : diff;
default:
return state;
}
}

View File

@ -1,3 +1,6 @@
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <ansidecl.h>
#include <errno.h>
#include <stdio.h>
@ -28,6 +31,7 @@ DEFUN(check, (thing, number), int thing AND int number)
}
/* Complain if first two args don't strcmp as equal. */
void equal(CONST char *a, CONST char *b, int number);
void
DEFUN(equal, (a, b, number), CONST char *a AND CONST char *b AND int number)
{
@ -54,6 +58,41 @@ DEFUN(main, (argc, argv), int argc AND char **argv)
check(strcmp("a\203", "a") > 0, 8); /* Tricky if char signed. */
check(strcmp("a\203", "a\003") > 0, 9);
{
char buf1[0x40], buf2[0x40];
int i, j;
for (i=0; i < 0x10; i++)
for (j = 0; j < 0x10; j++)
{
int k;
for (k = 0; k < 0x3f; k++)
{
buf1[j] = '0' ^ (k & 4);
buf2[j] = '4' ^ (k & 4);
}
buf1[i] = buf1[0x3f] = 0;
buf2[j] = buf2[0x3f] = 0;
for (k = 0; k < 0xf; k++)
{
int cnum = 0x10+0x10*k+0x100*j+0x1000*i;
check(strcmp(buf1+i,buf2+j) == 0, cnum);
buf1[i+k] = 'A' + i + k;
buf1[i+k+1] = 0;
check(strcmp(buf1+i,buf2+j) > 0, cnum+1);
check(strcmp(buf2+j,buf1+i) < 0, cnum+2);
buf2[j+k] = 'B' + i + k;
buf2[j+k+1] = 0;
check(strcmp(buf1+i,buf2+j) < 0, cnum+3);
check(strcmp(buf2+j,buf1+i) > 0, cnum+4);
buf2[j+k] = 'A' + i + k;
buf1[i] = 'A' + i + 0x80;
check(strcmp(buf1+i,buf2+j) > 0, cnum+5);
check(strcmp(buf2+j,buf1+i) < 0, cnum+6);
buf1[i] = 'A' + i;
}
}
}
/* Test strcpy next because we need it to set up other tests. */
it = "strcpy";
check(strcpy(one, "abcd") == one, 1); /* Returned value. */
@ -672,6 +711,43 @@ DEFUN(main, (argc, argv), int argc AND char **argv)
(void) memset(one+2, 010045, 1);
equal(one, "ax\045xe", 6); /* Unsigned char convert. */
/* Test for more complex versions of memset, for all alignments and
lengths up to 256. This test takes a little while, perhaps it should
be made weaker? */
{
char data[512];
int i;
int j;
int k;
int c;
for (i = 0; i < 512; i++)
data[i] = 'x';
for (c = 0; c <= 'y'; c += 'y') /* check for memset(,0,) and
memset(,'y',) */
for (j = 0; j < 256; j++)
for (i = 0; i < 256; i++)
{
memset(data+i,c,j);
for (k = 0; k < i; k++)
if (data[k] != 'x')
goto fail;
for (k = i; k < i+j; k++)
{
if (data[k] != c)
goto fail;
data[k] = 'x';
}
for (k = i+j; k < 512; k++)
if (data[k] != 'x')
goto fail;
continue;
fail:
check(0,7+i+j*256+(c != 0)*256*256);
}
}
/* bcopy - much like memcpy.
Berklix manual is silent about overlap, so don't test it. */
it = "bcopy";

View File

@ -34,7 +34,7 @@ main(int argc, char *argv[])
return 1;
}
}
}
}
}
return 0;
}

45
string/tst-svc.c Normal file
View File

@ -0,0 +1,45 @@
/* Test for strverscmp() */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_STRINGS 256
#define MAX_LINE_SIZE 32
int
compare (const void *p1, const void *p2)
{
return strverscmp (*((char **) p1), *((char **) p2));
}
int
main (int argc, char *argv[])
{
char line[MAX_LINE_SIZE + 1];
char *str[MAX_STRINGS];
int count = 0;
int i, n;
while (count < MAX_STRINGS && fgets (line, MAX_LINE_SIZE, stdin) != NULL)
{
n = strlen (line) - 1;
if (line[n] == '\n')
line[n] = '\0';
str[count] = strdup (line);
if (str[count] == NULL)
exit (EXIT_FAILURE);
++count;
}
qsort (str, count, sizeof (char *), compare);
for (i = 0; i < count; ++i)
puts (str[i]);
exit (EXIT_SUCCESS);
}

26
string/tst-svc.expect Normal file
View File

@ -0,0 +1,26 @@
000
001
00
00a
01
01a
0
0a
20
21
22
212
foo
foo-0.4
foo-0.4a
foo-0.4b
foo-0.5
foo-0.10.5
foo-3.01
foo-3.0
foo-3.0.0
foo-3.0.1
foo-3.2
foo-3.10
foo00
foo0

26
string/tst-svc.input Normal file
View File

@ -0,0 +1,26 @@
0a
00
0
01
001
01a
00a
000
20
212
21
22
foo0
foo00
foo-0.4
foo-3.0
foo
foo-3.0.0
foo-3.0.1
foo-0.5
foo-0.4b
foo-3.10
foo-3.2
foo-3.01
foo-0.4a
foo-0.10.5

View File

@ -46,6 +46,7 @@ static char sccsid[] = "@(#)authunix_prot.c 1.15 87/08/11 Copyr 1984 Sun Micro";
/*
* XDR for unix authentication parameters.
* Unfortunately, none of these can be declared const.
*/
bool_t
xdr_authunix_parms (XDR * xdrs, struct authunix_parms *p)

View File

@ -370,7 +370,7 @@ clnt_broadcast (prog, vers, proc, xargs, argsp, xresults, resultsp, eachresult)
stat = RPC_CANTRECV;
goto done_broad;
}
if (inlen < sizeof (u_long))
if ((size_t) inlen < sizeof (u_long))
goto recv_again;
/*
* see if reply transaction id matches sent id.

View File

@ -1,7 +1,7 @@
/****** rpc_clntout.c ******/
void write_stubs(void);
void printarglist(proc_list *proc,
void printarglist(proc_list *proc,
const char *addargname, const char *addargtype);
/****** rpc_cout.c ******/
@ -15,9 +15,9 @@ void emit_single_in_line(declaration *decl, int flag, relation rel);
void print_datadef(definition *def);
void print_funcdef(definition *def);
void pxdrfuncdecl(const char *name, int pointerp);
void pprocdef(proc_list *proc, version_list *vp,
void pprocdef(proc_list *proc, version_list *vp,
const char *addargtype, int server_p, int mode);
void pdeclaration(const char *name, declaration *dec, int tab,
void pdeclaration(const char *name, declaration *dec, int tab,
const char *separator);
/****** rpc_main.c ******/
@ -36,7 +36,7 @@ void write_sample_clnt_main(void);
/* see rpc_scan.h */
/****** rpc_svcout.c ******/
int nullproc(proc_list *proc);
int nullproc(const proc_list *proc);
void write_svc_aux(int nomain);
void write_msg_out(void);

View File

@ -46,6 +46,10 @@
#define _RPC_AUTH_UNIX_H 1
#include <features.h>
#include <sys/types.h>
#include <rpc/types.h>
#include <rpc/auth.h>
#include <rpc/xdr.h>
__BEGIN_DECLS

View File

@ -38,6 +38,9 @@
#define _RPC_CLNT_H 1
#include <features.h>
#include <sys/types.h>
#include <rpc/types.h>
#include <rpc/auth.h>
__BEGIN_DECLS
@ -130,13 +133,13 @@ struct CLIENT {
AUTH *cl_auth; /* authenticator */
struct clnt_ops {
enum clnt_stat (*cl_call) __P ((CLIENT *, u_long, xdrproc_t,
caddr_t, xdrproc_t,
caddr_t, struct timeval));
caddr_t, xdrproc_t,
caddr_t, struct timeval));
/* call remote procedure */
void (*cl_abort) __P ((void)); /* abort a call */
void (*cl_geterr) __P ((CLIENT *, struct rpc_err *));
void (*cl_geterr) __P ((CLIENT *, struct rpc_err *));
/* get specific error code */
bool_t (*cl_freeres) __P ((CLIENT *, xdrproc_t, caddr_t));
bool_t (*cl_freeres) __P ((CLIENT *, xdrproc_t, caddr_t));
/* frees results */
void (*cl_destroy) __P ((CLIENT *)); /* destroy this structure */
bool_t (*cl_control) __P ((CLIENT *, int, char *));
@ -270,7 +273,7 @@ struct CLIENT {
* u_long prog;
* u_long vers;
*/
extern CLIENT *clntraw_create __P ((__const u_long __prog,
extern CLIENT *clntraw_create __P ((__const u_long __prog,
__const u_long __vers));
@ -283,7 +286,7 @@ extern CLIENT *clntraw_create __P ((__const u_long __prog,
* u_ong vers; -- version number
* char *prot; -- protocol
*/
extern CLIENT *clnt_create __P ((__const char *__host, __const u_long __prog,
extern CLIENT *clnt_create __P ((__const char *__host, __const u_long __prog,
__const u_long __vers, __const char *__prot));
@ -334,7 +337,7 @@ extern CLIENT *clntudp_bufcreate __P ((struct sockaddr_in *__raddr,
int *__sockp, u_int __sendsz,
u_int __recvsz));
extern int callrpc __P ((__const char *__host, __const u_long __prognum,
extern int callrpc __P ((__const char *__host, __const u_long __prognum,
__const u_long __versnum, __const u_long __procnum,
__const xdrproc_t __inproc, __const char *__in,
__const xdrproc_t __outproc, char *__out));
@ -354,9 +357,9 @@ extern void clnt_perrno __P ((enum clnt_stat __num)); /* stderr */
/*
* Print an English error message, given the client error code
*/
extern void clnt_perror __P ((CLIENT *__clnt, __const char *__msg));
extern void clnt_perror __P ((CLIENT *__clnt, __const char *__msg));
/* stderr */
extern char *clnt_sperror __P ((CLIENT *__clnt, __const char *__msg));
extern char *clnt_sperror __P ((CLIENT *__clnt, __const char *__msg));
/* string */
/*

View File

@ -38,6 +38,8 @@
#ifndef _RPC_PMAP_CLNT_H
#define _RPC_PMAP_CLNT_H 1
#include <features.h>
#include <rpc/types.h>
#include <rpc/xdr.h>
__BEGIN_DECLS
@ -70,23 +72,23 @@ extern bool_t pmap_set __P ((__const u_long __program, __const u_long __vers,
extern bool_t pmap_unset __P ((__const u_long __program, __const u_long __vers));
extern struct pmaplist *pmap_getmaps __P ((struct sockaddr_in *__address));
extern enum clnt_stat pmap_rmtcall __P ((struct sockaddr_in *__addr,
__const u_long __prog,
__const u_long __prog,
__const u_long __vers,
__const u_long __proc,
__const u_long __proc,
xdrproc_t __xdrargs,
caddr_t __argsp, xdrproc_t __xdrres,
caddr_t __resp, struct timeval __tout,
u_long *__port_ptr));
extern enum clnt_stat clnt_broadcast __P ((__const u_long __prog,
extern enum clnt_stat clnt_broadcast __P ((__const u_long __prog,
__const u_long __vers,
__const u_long __proc,
__const u_long __proc,
xdrproc_t __xargs,
caddr_t __argsp,
xdrproc_t __xresults,
caddr_t __resultsp,
resultproc_t __eachresult));
extern u_short pmap_getport __P ((struct sockaddr_in *__address,
__const u_long __program,
__const u_long __program,
__const u_long __version,
u_int __protocol));

View File

@ -39,7 +39,9 @@
#define _RPC_PMAP_RMT_H 1
#include <features.h>
#include <sys/types.h>
#include <rpc/types.h>
#include <rpc/xdr.h>
__BEGIN_DECLS

View File

@ -33,6 +33,7 @@
#define _RPC_MSG_H 1
#include <sys/cdefs.h>
#include <rpc/xdr.h>
#include <rpc/clnt.h>
/*

View File

@ -39,6 +39,8 @@
#define __XDR_HEADER__
#include <features.h>
#include <sys/types.h>
#include <rpc/types.h>
/* We need FILE. */
#include <stdio.h>
@ -91,8 +93,17 @@ enum xdr_op
* This is the number of bytes per unit of external data.
*/
#define BYTES_PER_XDR_UNIT (4)
/*
* This only works if the above is a power of 2. But it's defined to be
* 4 by the appropriate RFCs. So it will work. And it's normally quicker
* than the old routine.
*/
#if 1
#define RNDUP(x) (((x) + BYTES_PER_XDR_UNIT - 1) & ~(BYTES_PER_XDR_UNIT - 1))
#else /* this is the old routine */
#define RNDUP(x) ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \
* BYTES_PER_XDR_UNIT)
#endif
/*
* The XDR handle.
@ -108,7 +119,7 @@ struct XDR
{
bool_t (*x_getlong) __P ((XDR * __xdrs, long *__lp));
/* get a long from underlying stream */
bool_t (*x_putlong) __P ((XDR * __xdrs, long *__lp));
bool_t (*x_putlong) __P ((XDR * __xdrs, __const long *__lp));
/* put a long to " */
bool_t (*x_getbytes) __P ((XDR * __xdrs, caddr_t __addr, u_int __len));
/* get some bytes from " */
@ -243,6 +254,9 @@ struct xdr_discrim
/*
* These are the "generic" xdr routines.
* None of these can have const applied because it's not possible to
* know whether the call is a read or a write to the passed parameter
* also, the XDR structure is always updated by some of these calls.
*/
extern bool_t xdr_void __P ((void));
extern bool_t xdr_int __P ((XDR * __xdrs, int *__ip));
@ -294,8 +308,8 @@ extern bool_t xdr_netobj __P ((XDR * __xdrs, struct netobj * __np));
*/
/* XDR using memory buffers */
extern void xdrmem_create __P ((XDR * __xdrs, caddr_t __addr, u_int __size,
enum xdr_op __op));
extern void xdrmem_create __P ((XDR * __xdrs, __const caddr_t __addr,
u_int __size, enum xdr_op __op));
/* XDR using stdio library */
extern void xdrstdio_create __P ((XDR * __xdrs, FILE * __file,

View File

@ -45,10 +45,10 @@ char cout_rcsid[] =
#include "proto.h"
static void emit_enum(definition *def);
static void emit_program(definition *def);
static void emit_union(definition *def);
static void emit_program(const definition *def);
static void emit_union(const definition *def);
static void emit_struct(definition *def);
static void emit_typedef(definition *def);
static void emit_typedef(const definition *def);
static int findtype(const definition *def, const char *type);
static int undefined(const char *type);
static void print_generic_header(const char *procname, int pointerp);
@ -59,8 +59,8 @@ static void print_ifclose(int indent);
static void print_ifstat(int indent, const char *prefix, const char *type,
relation rel, const char *amax,
const char *objname, const char *name);
static void print_stat(int indent, declaration *dec);
static void print_header(definition *def);
static void print_stat(int indent, const declaration *dec);
static void print_header(const definition *def);
static void print_trailer(void);
static char *upcase(const char *str);
@ -77,15 +77,16 @@ emit(definition *def)
emit_program(def);
return;
}
if(def->def_kind == DEF_TYPEDEF)
if (def->def_kind == DEF_TYPEDEF)
{
/* now we need to handle declarations like
struct typedef foo foo;
since we don't want this to be expanded into 2 calls to xdr_foo */
struct typedef foo foo;
since we don't want this to be expanded
into 2 calls to xdr_foo */
if(strcmp(def->def.ty.old_type,def->def_name)==0)
return;
};
if (strcmp(def->def.ty.old_type,def->def_name)==0)
return;
};
print_header(def);
switch (def->def_kind) {
@ -102,7 +103,8 @@ emit(definition *def)
emit_typedef(def);
break;
default:
/* can't happen */
/* can't happen */
break;
}
print_trailer();
}
@ -110,7 +112,6 @@ emit(definition *def)
static int
findtype(const definition *def, const char *type)
{
if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {
return (0);
} else {
@ -122,10 +123,7 @@ static int
undefined(const char *type)
{
definition *def;
def = (definition *) FINDVAL(defined, type, findtype);
return (def == NULL);
}
@ -153,33 +151,25 @@ print_generic_header(const char *procname, int pointerp)
}
static void
print_header(definition *def)
print_header(const definition *def)
{
print_generic_header(def->def_name,
def->def_kind != DEF_TYPEDEF ||
!isvectordef(def->def.ty.old_type,
def->def.ty.rel));
/*
decl_list *dl;
bas_type *ptr;
int i;
*/
print_generic_header( def->def_name,
def->def_kind != DEF_TYPEDEF ||
!isvectordef(def->def.ty.old_type, def->def.ty.rel));
/* Now add Inline support */
if(inlineflag == 0 )
return;
/*May cause lint to complain. but ... */
f_print(fout, "\t register long *buf;\n\n");
/* Now add Inline support */
if(inlineflag == 0 )
return;
/*May cause lint to complain. but ... */
f_print(fout, "\t register long *buf;\n\n");
}
static void
print_prog_header(proc_list *plist)
print_prog_header(const proc_list *plist)
{
print_generic_header( plist->args.argname, 1 );
print_generic_header(plist->args.argname, 1 );
}
static void
@ -308,7 +298,7 @@ emit_enum(definition *def)
}
static void
emit_program(definition *def)
emit_program(const definition *def)
{
decl_list *dl;
version_list *vlist;
@ -327,7 +317,7 @@ emit_program(definition *def)
}
static void
emit_union(definition *def)
emit_union(const definition *def)
{
declaration *dflt;
case_list *cl;
@ -393,6 +383,8 @@ emit_union(definition *def)
f_print(fout, "\t}\n");
}
/* this may be const. i haven't traced this one through yet. */
static void
emit_struct(definition *def)
{
@ -446,9 +438,6 @@ emit_struct(definition *def)
return;
};
flag=PUT;
for(j=0; j<2; j++){
@ -605,7 +594,7 @@ emit_struct(definition *def)
static void
emit_typedef(definition *def)
emit_typedef(const definition *def)
{
const char *prefix = def->def.ty.old_prefix;
const char *type = def->def.ty.old_type;
@ -617,7 +606,7 @@ emit_typedef(definition *def)
}
static void
print_stat(int indent, declaration *dec)
print_stat(int indent, const declaration *dec)
{
const char *prefix = dec->prefix;
const char *type = dec->type;

View File

@ -31,7 +31,7 @@
/* @(#)rpc_parse.h 1.3 90/08/29 (C) 1987 SMI */
/*
* rpc_parse.h, Definitions for the RPCL parser
* rpc_parse.h, Definitions for the RPCL parser
*/
enum defkind {
@ -50,7 +50,7 @@ enum relation {
REL_VECTOR, /* fixed length array */
REL_ARRAY, /* variable length array */
REL_POINTER, /* pointer */
REL_ALIAS, /* simple */
REL_ALIAS /* simple */
};
typedef enum relation relation;
@ -113,7 +113,7 @@ struct arg_list {
const char *argname; /* name of struct for arg*/
decl_list *decls;
};
typedef struct arg_list arg_list;
struct proc_list {

View File

@ -51,10 +51,10 @@ static const char ROUTINE[] = "local";
char _errbuf[256]; /* For all messages */
static void internal_proctype (proc_list * plist);
static void internal_proctype (const proc_list * plist);
static void p_xdrfunc (const char *rname, const char *typename);
static void write_real_program (definition * def);
static void write_program (definition * def, const char *storage);
static void write_real_program (const definition * def);
static void write_program (const definition * def, const char *storage);
static void printerr (const char *err, const char *transp);
static void printif (const char *proc, const char *transp,
const char *prefix, const char *arg);
@ -78,7 +78,7 @@ p_xdrfunc (const char *rname, const char *typename)
}
void
internal_proctype (proc_list * plist)
internal_proctype (const proc_list * plist)
{
f_print (fout, "static ");
ptype (plist->res_prefix, plist->res_type, 1);
@ -321,7 +321,7 @@ write_programs (const char *storage)
Unpacks single user argument of printmsg_1 to call-by-value format
expected by printmsg_1. */
static void
write_real_program (definition * def)
write_real_program (const definition * def)
{
version_list *vp;
proc_list *proc;
@ -388,7 +388,7 @@ write_real_program (definition * def)
}
static void
write_program (definition * def, const char *storage)
write_program (const definition * def, const char *storage)
{
version_list *vp;
proc_list *proc;
@ -566,7 +566,7 @@ printif (const char *proc, const char *transp, const char *prefix,
}
int
nullproc (proc_list * proc)
nullproc (const proc_list * proc)
{
for (; proc != NULL; proc = proc->next)
{

View File

@ -93,10 +93,6 @@ xdr_int (xdrs, ip)
int *ip;
{
#ifdef lint
(void) (xdr_short (xdrs, (short *) ip));
return (xdr_long (xdrs, (long *) ip));
#else
#if INT_MAX < LONG_MAX
long l;
@ -123,7 +119,6 @@ xdr_int (xdrs, ip)
#else
#error unexpected integer sizes in_xdr_int()
#endif
#endif
}
/*
@ -134,10 +129,6 @@ xdr_u_int (xdrs, up)
XDR *xdrs;
u_int *up;
{
#ifdef lint
(void) (xdr_short (xdrs, (short *) up));
return (xdr_u_long (xdrs, (u_long *) up));
#else
#if UINT_MAX < ULONG_MAX
u_long l;
@ -164,7 +155,6 @@ xdr_u_int (xdrs, up)
#else
#error unexpected integer sizes in_xdr_u_int()
#endif
#endif
}
/*
@ -349,7 +339,6 @@ xdr_enum (xdrs, ep)
XDR *xdrs;
enum_t *ep;
{
#ifndef lint
enum sizecheck
{
SIZEVAL
@ -392,10 +381,6 @@ xdr_enum (xdrs, ep)
{
return FALSE;
}
#else /* lint */
(void) (xdr_short (xdrs, (short *) ep));
return xdr_long (xdrs, (long *) ep);
#endif /* lint */
}
/*

View File

@ -87,8 +87,8 @@ static struct sgl_limits {
bool_t
xdr_float(xdrs, fp)
register XDR *xdrs;
register float *fp;
XDR *xdrs;
float *fp;
{
#ifdef vax
struct ieee_single is;
@ -207,8 +207,8 @@ static struct dbl_limits {
bool_t
xdr_double(xdrs, dp)
register XDR *xdrs;
double *dp;
XDR *xdrs;
double *dp;
{
#ifdef vax
struct ieee_double id;

View File

@ -47,13 +47,13 @@ static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";
#include <rpc/rpc.h>
static bool_t xdrmem_getlong (XDR *, long *);
static bool_t xdrmem_putlong (XDR *, long *);
static bool_t xdrmem_putlong (XDR *, const long *);
static bool_t xdrmem_getbytes (XDR *, caddr_t, u_int);
static bool_t xdrmem_putbytes (XDR *, caddr_t, u_int);
static u_int xdrmem_getpos (XDR *);
static bool_t xdrmem_putbytes (XDR *, const caddr_t, u_int);
static u_int xdrmem_getpos (const XDR *);
static bool_t xdrmem_setpos (XDR *, u_int);
static long *xdrmem_inline (XDR *, int);
static void xdrmem_destroy (XDR *);
static void xdrmem_destroy (const XDR *);
static const struct xdr_ops xdrmem_ops =
{
@ -74,7 +74,7 @@ static const struct xdr_ops xdrmem_ops =
void
xdrmem_create (xdrs, addr, size, op)
XDR *xdrs;
caddr_t addr;
const caddr_t addr;
u_int size;
enum xdr_op op;
{
@ -85,11 +85,21 @@ xdrmem_create (xdrs, addr, size, op)
xdrs->x_handy = size;
}
/*
* Nothing needs to be done for the memory case. The argument is clearly
* const.
*/
static void
xdrmem_destroy (XDR *xdrs)
xdrmem_destroy (const XDR *xdrs)
{
}
/*
* Gets the next word from the memory referenced by xdrs and places it
* in the long pointed to by lp. It then increments the private word to
* point at the next element. Neither object pointed to is const
*/
static bool_t
xdrmem_getlong (xdrs, lp)
XDR *xdrs;
@ -103,10 +113,15 @@ xdrmem_getlong (xdrs, lp)
return TRUE;
}
/*
* Puts the long pointed to by lp in the memory referenced by xdrs. It
* then increments the private word to point at the next element. The
* long pointed at is const
*/
static bool_t
xdrmem_putlong (xdrs, lp)
XDR *xdrs;
long *lp;
const long *lp;
{
if ((xdrs->x_handy -= 4) < 0)
@ -116,6 +131,12 @@ xdrmem_putlong (xdrs, lp)
return TRUE;
}
/*
* Gets an unaligned number of bytes from the xdrs structure and writes them
* to the address passed in addr. Be very careful when calling this routine
* as it could leave the xdrs pointing to an unaligned structure which is not
* a good idea. None of the things pointed to are const.
*/
static bool_t
xdrmem_getbytes (xdrs, addr, len)
XDR *xdrs;
@ -130,10 +151,14 @@ xdrmem_getbytes (xdrs, addr, len)
return TRUE;
}
/*
* The complementary function to the above. The same warnings apply about
* unaligned data. The source address is const.
*/
static bool_t
xdrmem_putbytes (xdrs, addr, len)
XDR *xdrs;
caddr_t addr;
const caddr_t addr;
u_int len;
{
@ -144,14 +169,21 @@ xdrmem_putbytes (xdrs, addr, len)
return TRUE;
}
/*
* Not sure what this one does. But it clearly doesn't modify the contents
* of xdrs. **FIXME** does this not assume u_int == u_long?
*/
static u_int
xdrmem_getpos (xdrs)
XDR *xdrs;
const XDR *xdrs;
{
return (u_long) xdrs->x_private - (u_long) xdrs->x_base;
}
/*
* xdrs modified
*/
static bool_t
xdrmem_setpos (xdrs, pos)
XDR *xdrs;
@ -167,6 +199,9 @@ xdrmem_setpos (xdrs, pos)
return TRUE;
}
/*
* xdrs modified
*/
static long *
xdrmem_inline (xdrs, len)
XDR *xdrs;

View File

@ -54,9 +54,9 @@ static char sccsid[] = "@(#)xdr_rec.c 1.21 87/08/11 Copyr 1984 Sun Micro";
#include <rpc/rpc.h>
static bool_t xdrrec_getlong (XDR *, long *);
static bool_t xdrrec_putlong (XDR *, long *);
static bool_t xdrrec_putlong (XDR *, const long *);
static bool_t xdrrec_getbytes (XDR *, caddr_t, u_int);
static bool_t xdrrec_putbytes (XDR *, caddr_t, u_int);
static bool_t xdrrec_putbytes (XDR *, const caddr_t, u_int);
static u_int xdrrec_getpos (XDR *);
static bool_t xdrrec_setpos (XDR *, u_int);
static long *xdrrec_inline (XDR *, int);
@ -221,7 +221,7 @@ xdrrec_getlong (xdrs, lp)
static bool_t
xdrrec_putlong (xdrs, lp)
XDR *xdrs;
long *lp;
const long *lp;
{
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
int32_t *dest_lp = (int32_t *) rstrm->out_finger;
@ -276,7 +276,7 @@ xdrrec_getbytes (xdrs, addr, len)
static bool_t
xdrrec_putbytes (xdrs, addr, len)
XDR *xdrs;
caddr_t addr;
const caddr_t addr;
u_int len;
{
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;

View File

@ -46,9 +46,9 @@ static char sccsid[] = "@(#)xdr_stdio.c 1.16 87/08/11 Copyr 1984 Sun Micro";
#include <rpc/xdr.h>
static bool_t xdrstdio_getlong (XDR *, long *);
static bool_t xdrstdio_putlong (XDR *, long *);
static bool_t xdrstdio_putlong (XDR *, const long *);
static bool_t xdrstdio_getbytes (XDR *, caddr_t, u_int);
static bool_t xdrstdio_putbytes (XDR *, caddr_t, u_int);
static bool_t xdrstdio_putbytes (XDR *, const caddr_t, u_int);
static u_int xdrstdio_getpos (XDR *);
static bool_t xdrstdio_setpos (XDR *, u_int);
static long *xdrstdio_inline (XDR *, int);
@ -114,7 +114,7 @@ xdrstdio_getlong (xdrs, lp)
}
static bool_t
xdrstdio_putlong (XDR *xdrs, long *lp)
xdrstdio_putlong (XDR *xdrs, const long *lp)
{
long mycopy = htonl (*lp);
@ -127,7 +127,7 @@ xdrstdio_putlong (XDR *xdrs, long *lp)
static bool_t
xdrstdio_getbytes (xdrs, addr, len)
XDR *xdrs;
caddr_t addr;
const caddr_t addr;
u_int len;
{
@ -137,7 +137,7 @@ xdrstdio_getbytes (xdrs, addr, len)
}
static bool_t
xdrstdio_putbytes (XDR *xdrs, caddr_t addr, u_int len)
xdrstdio_putbytes (XDR *xdrs, const caddr_t addr, u_int len)
{
if ((len != 0) && (fwrite (addr, (int) len, 1, (FILE *) xdrs->x_private) != 1))
return FALSE;

View File

@ -42,6 +42,8 @@
#define _RPC_AUTH_H 1
#include <features.h>
#include <sys/types.h>
#include <rpc/types.h>
#include <rpc/xdr.h>
__BEGIN_DECLS
@ -99,7 +101,7 @@ struct AUTH {
struct auth_ops {
void (*ah_nextverf) __P ((AUTH *));
int (*ah_marshal) __P ((AUTH *, XDR *)); /* nextverf & serialize */
int (*ah_validate) __P ((AUTH *, struct opaque_auth *));
int (*ah_validate) __P ((AUTH *, struct opaque_auth *));
/* validate verifier */
int (*ah_refresh) __P ((AUTH *)); /* refresh credentials */
void (*ah_destroy) __P ((AUTH *)); /* destroy this structure */
@ -163,7 +165,7 @@ extern AUTH *authunix_create __P ((char *__machname, __uid_t __uid,
__gid_t *__aup_gids));
extern AUTH *authunix_create_default __P ((void));
extern AUTH *authnone_create __P ((void));
extern AUTH *authdes_create __P ((char *__servername, u_int __window,
extern AUTH *authdes_create __P ((char *__servername, u_int __window,
struct sockaddr *__syncaddr,
des_block *__ckey));

View File

@ -460,7 +460,7 @@ __finite (double __x)
{
register int __result;
__asm__ __volatile__
("orl $x0x800fffff, %0\n\t"
("orl $0x800fffff, %0\n\t"
"incl %0\n\t"
"shrl $31, %0"
: "=q" (__result) : "0" (((int *) &__x)[1]));

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
/* Copyright (C) 1994, 1995, 1996, 1997 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
@ -16,7 +16,6 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <ansidecl.h>
#include <stddef.h>
#include <errno.h>
#include <sys/time.h>
@ -310,9 +309,8 @@ setitimer_locked (const struct itimerval *new, struct itimerval *old,
set *OLD to the old value of timer WHICH.
Returns 0 on success, -1 on errors. */
int
DEFUN(__setitimer, (which, new, old),
enum __itimer_which which AND
struct itimerval *new AND struct itimerval *old)
__setitimer (enum __itimer_which which, const struct itimerval *new,
struct itimerval *old)
{
void *crit;

1
sysdeps/powerpc/Dist Normal file
View File

@ -0,0 +1 @@
fenv_libc.h

3
sysdeps/powerpc/Makefile Normal file
View File

@ -0,0 +1,3 @@
ifeq ($(subdir),math)
libm-support += fenv_const
endif

View File

@ -22,46 +22,46 @@
#include <jmp_buf.h>
ENTRY (__longjmp)
lwz 1,(JB_GPR1*4)(3)
lwz 2,(JB_GPR2*4)(3)
lwz 0,(JB_LR*4)(3)
lwz 14,((JB_GPRS+0)*4)(3)
lfd 14,((JB_FPRS+0*2)*4)(3)
lwz 15,((JB_GPRS+1)*4)(3)
lfd 15,((JB_FPRS+1*2)*4)(3)
lwz 16,((JB_GPRS+2)*4)(3)
lfd 16,((JB_FPRS+2*2)*4)(3)
lwz 17,((JB_GPRS+3)*4)(3)
lfd 17,((JB_FPRS+3*2)*4)(3)
lwz 18,((JB_GPRS+4)*4)(3)
lfd 18,((JB_FPRS+4*2)*4)(3)
lwz 19,((JB_GPRS+5)*4)(3)
lfd 19,((JB_FPRS+5*2)*4)(3)
lwz 20,((JB_GPRS+6)*4)(3)
lfd 20,((JB_FPRS+6*2)*4)(3)
mtlr 0
lwz 21,((JB_GPRS+7)*4)(3)
lfd 21,((JB_FPRS+7*2)*4)(3)
lwz 22,((JB_GPRS+8)*4)(3)
lfd 22,((JB_FPRS+8*2)*4)(3)
lwz 23,((JB_GPRS+9)*4)(3)
lfd 23,((JB_FPRS+9*2)*4)(3)
lwz 24,((JB_GPRS+10)*4)(3)
lfd 24,((JB_FPRS+10*2)*4)(3)
lwz 25,((JB_GPRS+11)*4)(3)
lfd 25,((JB_FPRS+11*2)*4)(3)
lwz 26,((JB_GPRS+12)*4)(3)
lfd 26,((JB_FPRS+12*2)*4)(3)
lwz 27,((JB_GPRS+13)*4)(3)
lfd 27,((JB_FPRS+13*2)*4)(3)
lwz 28,((JB_GPRS+14)*4)(3)
lfd 28,((JB_FPRS+14*2)*4)(3)
lwz 29,((JB_GPRS+15)*4)(3)
lfd 29,((JB_FPRS+15*2)*4)(3)
lwz 30,((JB_GPRS+16)*4)(3)
lfd 30,((JB_FPRS+16*2)*4)(3)
lwz 31,((JB_GPRS+17)*4)(3)
lfd 31,((JB_FPRS+17*2)*4)(3)
mr 3,4
lwz %r1,(JB_GPR1*4)(%r3)
lwz %r2,(JB_GPR2*4)(%r3)
lwz %r0,(JB_LR*4)(%r3)
lwz %r14,((JB_GPRS+0)*4)(%r3)
lfd %f14,((JB_FPRS+0*2)*4)(%r3)
lwz %r15,((JB_GPRS+1)*4)(%r3)
lfd %f15,((JB_FPRS+1*2)*4)(%r3)
lwz %r16,((JB_GPRS+2)*4)(%r3)
lfd %f16,((JB_FPRS+2*2)*4)(%r3)
lwz %r17,((JB_GPRS+3)*4)(%r3)
lfd %f17,((JB_FPRS+3*2)*4)(%r3)
lwz %r18,((JB_GPRS+4)*4)(%r3)
lfd %f18,((JB_FPRS+4*2)*4)(%r3)
lwz %r19,((JB_GPRS+5)*4)(%r3)
lfd %f19,((JB_FPRS+5*2)*4)(%r3)
lwz %r20,((JB_GPRS+6)*4)(%r3)
lfd %f20,((JB_FPRS+6*2)*4)(%r3)
mtlr %r0
lwz %r21,((JB_GPRS+7)*4)(%r3)
lfd %f21,((JB_FPRS+7*2)*4)(%r3)
lwz %r22,((JB_GPRS+8)*4)(%r3)
lfd %f22,((JB_FPRS+8*2)*4)(%r3)
lwz %r23,((JB_GPRS+9)*4)(%r3)
lfd %f23,((JB_FPRS+9*2)*4)(%r3)
lwz %r24,((JB_GPRS+10)*4)(%r3)
lfd %f24,((JB_FPRS+10*2)*4)(%r3)
lwz %r25,((JB_GPRS+11)*4)(%r3)
lfd %f25,((JB_FPRS+11*2)*4)(%r3)
lwz %r26,((JB_GPRS+12)*4)(%r3)
lfd %f26,((JB_FPRS+12*2)*4)(%r3)
lwz %r27,((JB_GPRS+13)*4)(%r3)
lfd %f27,((JB_FPRS+13*2)*4)(%r3)
lwz %r28,((JB_GPRS+14)*4)(%r3)
lfd %f28,((JB_FPRS+14*2)*4)(%r3)
lwz %r29,((JB_GPRS+15)*4)(%r3)
lfd %f29,((JB_FPRS+15*2)*4)(%r3)
lwz %r30,((JB_GPRS+16)*4)(%r3)
lfd %f30,((JB_FPRS+16*2)*4)(%r3)
lwz %r31,((JB_GPRS+17)*4)(%r3)
lfd %f31,((JB_FPRS+17*2)*4)(%r3)
mr %r3,%r4
blr
END (__longjmp)

View File

@ -64,25 +64,6 @@ fabs (double __x)
return __value;
}
/* Optimized versions for some non-standardized functions. */
#ifdef __USE_MISC
__MATH_INLINE double hypot (double __x, double __y);
__MATH_INLINE double
hypot (double __x, double __y)
{
return sqrt (__x * __x + __y * __y);
}
__MATH_INLINE double __sgn (double __x);
__MATH_INLINE double
sgn (double __x)
{
return (__x == 0.0 ? 0.0 : (__x > 0.0 ? 1.0 : -1.0));
}
#endif /* __USE_MISC */
#endif /* __NO_MATH_INLINES */
#endif /* __GNUC__ */

View File

@ -24,7 +24,7 @@
#include <sysdep.h>
ENTRY (_setjmp)
li 4,0 /* Set second argument to 0. */
li %r4,0 /* Set second argument to 0. */
#ifdef PIC
b __sigsetjmp@plt
#else

View File

@ -24,7 +24,7 @@
#include <sysdep.h>
ENTRY (__setjmp)
li 4,1 /* Set second argument to 1. */
li %r4,1 /* Set second argument to 1. */
#ifdef PIC
b __sigsetjmp@plt
#else

View File

@ -17,6 +17,9 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef dl_machine_h
#define dl_machine_h
#define ELF_MACHINE_NAME "powerpc"
#include <assert.h>
@ -134,318 +137,13 @@ elf_machine_load_address (void)
/* So now work out the difference between where the branch actually points,
and the offset of that location in memory from the start of the file. */
return (Elf32_Addr)branchaddr - *got +
(*branchaddr & 0x3fffffc |
(int)(*branchaddr << 6 & 0x80000000) >> 6);
return ((Elf32_Addr)branchaddr - *got
+ (*branchaddr & 0x3fffffc
| (int)(*branchaddr << 6 & 0x80000000) >> 6));
}
#define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info) /* nothing */
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
LOADADDR is the load address of the object; INFO is an array indexed
by DT_* of the .dynamic section info. */
#ifdef RESOLVE
static inline void
elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
const Elf32_Sym *sym, const struct r_found_version *version)
{
const Elf32_Sym *const refsym = sym;
Elf32_Addr *const reloc_addr = (Elf32_Addr *)(map->l_addr + reloc->r_offset);
Elf32_Word loadbase, finaladdr;
const int rinfo = ELF32_R_TYPE (reloc->r_info);
if (rinfo == R_PPC_NONE)
return;
assert (sym != NULL);
if (ELF32_ST_TYPE (sym->st_info) == STT_SECTION ||
rinfo == R_PPC_RELATIVE)
{
/* Has already been relocated. */
loadbase = map->l_addr;
finaladdr = loadbase + reloc->r_addend;
}
else
{
int flags;
/* We never want to use a PLT entry as the destination of a
reloc, when what is being relocated is a branch. This is
partly for efficiency, but mostly so we avoid loops. */
if (rinfo == R_PPC_REL24 ||
rinfo == R_PPC_ADDR24 ||
rinfo == R_PPC_JMP_SLOT)
flags = DL_LOOKUP_NOPLT;
else if (rinfo == R_PPC_COPY)
flags = DL_LOOKUP_NOEXEC;
else
flags = 0;
loadbase = (Elf32_Word) (char *) (RESOLVE (&sym, version, flags));
if (sym == NULL)
{
/* Weak symbol that wasn't actually defined anywhere. */
assert(loadbase == 0);
finaladdr = reloc->r_addend;
}
else
finaladdr = (loadbase + (Elf32_Word) (char *) sym->st_value
+ reloc->r_addend);
}
/* This is an if/else if chain because GCC 2.7.2.[012] turns case
statements into non-PIC table lookups. When a later version
comes out that fixes this, this should be changed. */
if (rinfo == R_PPC_UADDR32 ||
rinfo == R_PPC_GLOB_DAT ||
rinfo == R_PPC_ADDR32 ||
rinfo == R_PPC_RELATIVE)
{
*reloc_addr = finaladdr;
}
else if (rinfo == R_PPC_ADDR16_LO)
{
*(Elf32_Half*) reloc_addr = finaladdr;
}
else if (rinfo == R_PPC_ADDR16_HI)
{
*(Elf32_Half*) reloc_addr = finaladdr >> 16;
}
else if (rinfo == R_PPC_ADDR16_HA)
{
*(Elf32_Half*) reloc_addr = (finaladdr + 0x8000) >> 16;
}
#ifndef RTLD_BOOTSTRAP
else if (rinfo == R_PPC_REL24)
{
Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
if (delta << 6 >> 6 != delta)
_dl_signal_error (0, map->l_name,
"R_PPC_REL24 relocation out of range");
*reloc_addr = *reloc_addr & 0xfc000003 | delta & 0x3fffffc;
}
else if (rinfo == R_PPC_ADDR24)
{
if (finaladdr << 6 >> 6 != finaladdr)
_dl_signal_error (0, map->l_name,
"R_PPC_ADDR24 relocation out of range");
*reloc_addr = *reloc_addr & 0xfc000003 | finaladdr & 0x3fffffc;
}
else if (rinfo == R_PPC_COPY)
{
if (sym->st_size != refsym->st_size)
{
const char *strtab;
strtab = ((void *) map->l_addr
+ map->l_info[DT_STRTAB]->d_un.d_ptr);
_dl_sysdep_error ("Symbol `", strtab + refsym->st_name,
"' has different size in shared object, "
"consider re-linking\n", NULL);
}
memcpy (reloc_addr, (char *) finaladdr, MIN (sym->st_size,
refsym->st_size));
}
#endif
else if (rinfo == R_PPC_REL32)
{
*reloc_addr = finaladdr - (Elf32_Word) (char *) reloc_addr;
}
else if (rinfo == R_PPC_JMP_SLOT)
{
Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
if (delta << 6 >> 6 == delta)
*reloc_addr = OPCODE_B (delta);
else if (finaladdr <= 0x01fffffc || finaladdr >= 0xfe000000)
*reloc_addr = OPCODE_BA (finaladdr);
else
{
Elf32_Word *plt;
Elf32_Word index;
plt = (Elf32_Word *)((char *)map->l_addr
+ map->l_info[DT_PLTGOT]->d_un.d_val);
index = (reloc_addr - plt - PLT_INITIAL_ENTRY_WORDS)/2;
if (index >= PLT_DOUBLE_SIZE)
{
/* Slots greater than or equal to 2^13 have 4 words available
instead of two. */
reloc_addr[0] = OPCODE_LI (11, finaladdr);
reloc_addr[1] = OPCODE_ADDIS (11, 11, finaladdr + 0x8000 >> 16);
reloc_addr[2] = OPCODE_MTCTR (11);
reloc_addr[3] = OPCODE_BCTR ();
}
else
{
Elf32_Word num_plt_entries;
num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
/ sizeof(Elf32_Rela));
reloc_addr[0] = OPCODE_LI (11, index*4);
reloc_addr[1] =
OPCODE_B (-(4*(index*2
+ 1
- PLT_LONGBRANCH_ENTRY_WORDS
+ PLT_INITIAL_ENTRY_WORDS)));
plt[index+PLT_DATA_START_WORDS (num_plt_entries)] = finaladdr;
}
}
MODIFIED_CODE (reloc_addr);
}
else
assert (! "unexpected dynamic reloc type");
if (rinfo == R_PPC_ADDR16_LO ||
rinfo == R_PPC_ADDR16_HI ||
rinfo == R_PPC_ADDR16_HA ||
rinfo == R_PPC_REL24 ||
rinfo == R_PPC_ADDR24)
MODIFIED_CODE_NOQUEUE (reloc_addr);
}
#define ELF_MACHINE_NO_REL 1
#endif
/* Nonzero iff TYPE describes relocation of a PLT entry, so
PLT entries should not be allowed to define the value. */
#define elf_machine_pltrel_p(type) ((type) == R_PPC_JMP_SLOT)
/* Set up the loaded object described by L so its unrelocated PLT
entries will jump to the on-demand fixup code in dl-runtime.c.
Also install a small trampoline to be used by entries that have
been relocated to an address too far away for a single branch. */
/* A PLT entry does one of three things:
(i) Jumps to the actual routine. Such entries are set up above, in
elf_machine_rela.
(ii) Jumps to the actual routine via glue at the start of the PLT.
We do this by putting the address of the routine in space
allocated at the end of the PLT, and when the PLT entry is
called we load the offset of that word (from the start of the
space) into r11, then call the glue, which loads the word and
branches to that address. These entries are set up in
elf_machine_rela, but the glue is set up here.
(iii) Loads the index of this PLT entry (we count the double-size
entries as one entry for this purpose) into r11, then
branches to code at the start of the PLT. This code then
calls `fixup', in dl-runtime.c, via the glue in the macro
ELF_MACHINE_RUNTIME_TRAMPOLINE, which resets the PLT entry to
be one of the above two types. These entries are set up here. */
static inline void
elf_machine_runtime_setup (struct link_map *map, int lazy)
{
if (map->l_info[DT_JMPREL])
{
int i;
/* Fill in the PLT. Its initial contents are directed to a
function earlier in the PLT which arranges for the dynamic
linker to be called back. */
Elf32_Word *plt = (Elf32_Word *) ((char *) map->l_addr
+ map->l_info[DT_PLTGOT]->d_un.d_val);
Elf32_Word num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
/ sizeof (Elf32_Rela));
Elf32_Word rel_offset_words = PLT_DATA_START_WORDS (num_plt_entries);
extern void _dl_runtime_resolve (void);
Elf32_Word size_modified;
if (lazy)
for (i = 0; i < num_plt_entries; i++)
{
Elf32_Word offset = PLT_ENTRY_START_WORDS (i);
if (i >= PLT_DOUBLE_SIZE)
{
plt[offset ] = OPCODE_LI (11, i * 4);
plt[offset+1] = OPCODE_ADDIS (11, 11, (i * 4 + 0x8000) >> 16);
plt[offset+2] = OPCODE_B (-(4 * (offset + 2)));
}
else
{
plt[offset ] = OPCODE_LI (11, i * 4);
plt[offset+1] = OPCODE_B (-(4 * (offset + 1)));
}
}
/* Multiply index of entry by 3 (in r11). */
plt[0] = OPCODE_SLWI (12, 11, 1);
plt[1] = OPCODE_ADD (11, 12, 11);
if ((Elf32_Word) (char *) _dl_runtime_resolve <= 0x01fffffc ||
(Elf32_Word) (char *) _dl_runtime_resolve >= 0xfe000000)
{
/* Load address of link map in r12. */
plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) map);
plt[3] = OPCODE_ADDIS (12, 12, (((Elf32_Word) (char *) map
+ 0x8000) >> 16));
/* Call _dl_runtime_resolve. */
plt[4] = OPCODE_BA ((Elf32_Word) (char *) _dl_runtime_resolve);
}
else
{
/* Get address of _dl_runtime_resolve in CTR. */
plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) _dl_runtime_resolve);
plt[3] = OPCODE_ADDIS (12, 12, ((((Elf32_Word) (char *)
_dl_runtime_resolve)
+ 0x8000) >> 16));
plt[4] = OPCODE_MTCTR (12);
/* Load address of link map in r12. */
plt[5] = OPCODE_LI (12, (Elf32_Word) (char *) map);
plt[6] = OPCODE_ADDIS (12, 12, (((Elf32_Word) (char *) map
+ 0x8000) >> 16));
/* Call _dl_runtime_resolve. */
plt[7] = OPCODE_BCTR ();
}
/* Convert the index in r11 into an actual address, and get the
word at that address. */
plt[PLT_LONGBRANCH_ENTRY_WORDS] =
OPCODE_ADDIS (11, 11, (((Elf32_Word) (char*) (plt + rel_offset_words)
+ 0x8000) >> 16));
plt[PLT_LONGBRANCH_ENTRY_WORDS+1] =
OPCODE_LWZ (11, (Elf32_Word) (char*) (plt+rel_offset_words), 11);
/* Call the procedure at that address. */
plt[PLT_LONGBRANCH_ENTRY_WORDS+2] = OPCODE_MTCTR (11);
plt[PLT_LONGBRANCH_ENTRY_WORDS+3] = OPCODE_BCTR ();
/* Now, we've modified code (quite a lot of code, possibly). We
need to write the changes from the data cache to a
second-level unified cache, then make sure that stale data in
the instruction cache is removed. (In a multiprocessor
system, the effect is more complex.)
Assumes the cache line size is at least 32 bytes, or at least
that dcbst and icbi apply to 32-byte lines. At present, all
PowerPC processors have line sizes of exactly 32 bytes. */
size_modified = lazy ? rel_offset_words : PLT_INITIAL_ENTRY_WORDS;
for (i = 0; i < size_modified; i+=8)
PPC_DCBST (plt + i);
PPC_SYNC;
for (i = 0; i < size_modified; i+=8)
PPC_ICBI (plt + i);
PPC_ISYNC;
}
}
static inline void
elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
{
assert (ELF32_R_TYPE (reloc->r_info) == R_PPC_JMP_SLOT);
/* elf_machine_runtime_setup handles this. */
}
/* The PLT uses Elf32_Rela relocs. */
#define elf_machine_relplt elf_machine_rela
@ -617,7 +315,7 @@ _start:
information here about the way memory is mapped. */
#define ELF_PREFERRED_ADDRESS_DATA \
static ElfW(Addr) _dl_preferred_address = 1;
static ElfW(Addr) _dl_preferred_address = 1
#define ELF_PREFERRED_ADDRESS(loader, maplength, mapstartpref) \
( { \
@ -645,4 +343,326 @@ static ElfW(Addr) _dl_preferred_address = 1;
_dl_preferred_address = mapstart; \
} )
/* We require the address of the PLT entry returned from fixup, not
the first word of the PLT entry. */
#define ELF_FIXUP_RETURNS_ADDRESS 1
/* Nonzero iff TYPE should not be allowed to resolve to one of
the main executable's symbols, as for a COPY reloc. */
#define elf_machine_lookup_noexec_p(type) ((type) == R_PPC_COPY)
/* Nonzero iff TYPE describes relocation of a PLT entry, so
PLT entries should not be allowed to define the value. */
/* We never want to use a PLT entry as the destination of a
reloc, when what is being relocated is a branch. This is
partly for efficiency, but mostly so we avoid loops. */
#define elf_machine_lookup_noplt_p(type) ((type) == R_PPC_REL24 || \
(type) == R_PPC_ADDR24 || \
(type) == R_PPC_JMP_SLOT)
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
#define ELF_MACHINE_RELOC_NOPLT R_PPC_JMP_SLOT
/* Nonzero iff TYPE describes relocation of a PLT entry, so
PLT entries should not be allowed to define the value. */
#define elf_machine_pltrel_p(type) ((type) == R_PPC_JMP_SLOT)
/* Set up the loaded object described by L so its unrelocated PLT
entries will jump to the on-demand fixup code in dl-runtime.c.
Also install a small trampoline to be used by entries that have
been relocated to an address too far away for a single branch. */
/* A PLT entry does one of three things:
(i) Jumps to the actual routine. Such entries are set up above, in
elf_machine_rela.
(ii) Jumps to the actual routine via glue at the start of the PLT.
We do this by putting the address of the routine in space
allocated at the end of the PLT, and when the PLT entry is
called we load the offset of that word (from the start of the
space) into r11, then call the glue, which loads the word and
branches to that address. These entries are set up in
elf_machine_rela, but the glue is set up here.
(iii) Loads the index of this PLT entry (we count the double-size
entries as one entry for this purpose) into r11, then
branches to code at the start of the PLT. This code then
calls `fixup', in dl-runtime.c, via the glue in the macro
ELF_MACHINE_RUNTIME_TRAMPOLINE, which resets the PLT entry to
be one of the above two types. These entries are set up here. */
static inline void
elf_machine_runtime_setup (struct link_map *map, int lazy)
{
if (map->l_info[DT_JMPREL])
{
int i;
/* Fill in the PLT. Its initial contents are directed to a
function earlier in the PLT which arranges for the dynamic
linker to be called back. */
Elf32_Word *plt = (Elf32_Word *) ((char *) map->l_addr
+ map->l_info[DT_PLTGOT]->d_un.d_val);
Elf32_Word num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
/ sizeof (Elf32_Rela));
Elf32_Word rel_offset_words = PLT_DATA_START_WORDS (num_plt_entries);
extern void _dl_runtime_resolve (void);
Elf32_Word size_modified;
if (lazy)
for (i = 0; i < num_plt_entries; i++)
{
Elf32_Word offset = PLT_ENTRY_START_WORDS (i);
if (i >= PLT_DOUBLE_SIZE)
{
plt[offset ] = OPCODE_LI (11, i * 4);
plt[offset+1] = OPCODE_ADDIS (11, 11, (i * 4 + 0x8000) >> 16);
plt[offset+2] = OPCODE_B (-(4 * (offset + 2)));
}
else
{
plt[offset ] = OPCODE_LI (11, i * 4);
plt[offset+1] = OPCODE_B (-(4 * (offset + 1)));
}
}
/* Multiply index of entry by 3 (in r11). */
plt[0] = OPCODE_SLWI (12, 11, 1);
plt[1] = OPCODE_ADD (11, 12, 11);
if ((Elf32_Word) (char *) _dl_runtime_resolve <= 0x01fffffc ||
(Elf32_Word) (char *) _dl_runtime_resolve >= 0xfe000000)
{
/* Load address of link map in r12. */
plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) map);
plt[3] = OPCODE_ADDIS (12, 12, (((Elf32_Word) (char *) map
+ 0x8000) >> 16));
/* Call _dl_runtime_resolve. */
plt[4] = OPCODE_BA ((Elf32_Word) (char *) _dl_runtime_resolve);
}
else
{
/* Get address of _dl_runtime_resolve in CTR. */
plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) _dl_runtime_resolve);
plt[3] = OPCODE_ADDIS (12, 12, ((((Elf32_Word) (char *)
_dl_runtime_resolve)
+ 0x8000) >> 16));
plt[4] = OPCODE_MTCTR (12);
/* Load address of link map in r12. */
plt[5] = OPCODE_LI (12, (Elf32_Word) (char *) map);
plt[6] = OPCODE_ADDIS (12, 12, (((Elf32_Word) (char *) map
+ 0x8000) >> 16));
/* Call _dl_runtime_resolve. */
plt[7] = OPCODE_BCTR ();
}
/* Convert the index in r11 into an actual address, and get the
word at that address. */
plt[PLT_LONGBRANCH_ENTRY_WORDS] =
OPCODE_ADDIS (11, 11, (((Elf32_Word) (char*) (plt + rel_offset_words)
+ 0x8000) >> 16));
plt[PLT_LONGBRANCH_ENTRY_WORDS+1] =
OPCODE_LWZ (11, (Elf32_Word) (char*) (plt+rel_offset_words), 11);
/* Call the procedure at that address. */
plt[PLT_LONGBRANCH_ENTRY_WORDS+2] = OPCODE_MTCTR (11);
plt[PLT_LONGBRANCH_ENTRY_WORDS+3] = OPCODE_BCTR ();
/* Now, we've modified code (quite a lot of code, possibly). We
need to write the changes from the data cache to a
second-level unified cache, then make sure that stale data in
the instruction cache is removed. (In a multiprocessor
system, the effect is more complex.)
Assumes the cache line size is at least 32 bytes, or at least
that dcbst and icbi apply to 32-byte lines. At present, all
PowerPC processors have line sizes of exactly 32 bytes. */
size_modified = lazy ? rel_offset_words : PLT_INITIAL_ENTRY_WORDS;
for (i = 0; i < size_modified; i+=8)
PPC_DCBST (plt + i);
PPC_SYNC;
for (i = 0; i < size_modified; i+=8)
PPC_ICBI (plt + i);
PPC_ISYNC;
}
}
static inline void
elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
{
assert (ELF32_R_TYPE (reloc->r_info) == R_PPC_JMP_SLOT);
/* elf_machine_runtime_setup handles this. */
}
#endif /* dl_machine_h */
#ifdef RESOLVE
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
LOADADDR is the load address of the object; INFO is an array indexed
by DT_* of the .dynamic section info. */
static inline void
elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
const Elf32_Sym *sym, const struct r_found_version *version)
{
const Elf32_Sym *const refsym = sym;
Elf32_Addr *const reloc_addr = (Elf32_Addr *)(map->l_addr + reloc->r_offset);
Elf32_Word loadbase, finaladdr;
const int rinfo = ELF32_R_TYPE (reloc->r_info);
if (rinfo == R_PPC_NONE)
return;
assert (sym != NULL);
/* The condition on the next two lines is a hack around a bug in Solaris
tools on Sparc. It's not clear whether it should really be here at all,
but if not the binutils need to be changed. */
if ((sym->st_shndx != SHN_UNDEF
&& ELF32_ST_BIND (sym->st_info) == STB_LOCAL)
|| rinfo == R_PPC_RELATIVE)
{
/* Has already been relocated. */
loadbase = map->l_addr;
finaladdr = loadbase + reloc->r_addend;
}
else
{
loadbase = (Elf32_Word) (char *) (RESOLVE (&sym, version,
ELF32_R_TYPE(reloc->r_info)));
if (sym == NULL)
{
/* Weak symbol that wasn't actually defined anywhere. */
assert(loadbase == 0);
finaladdr = reloc->r_addend;
}
else
finaladdr = (loadbase + (Elf32_Word) (char *) sym->st_value
+ reloc->r_addend);
}
/* This is an if/else if chain because GCC 2.7.2.[012] turns case
statements into non-PIC table lookups. When a later version
comes out that fixes this, this should be changed. */
if (rinfo == R_PPC_UADDR32 ||
rinfo == R_PPC_GLOB_DAT ||
rinfo == R_PPC_ADDR32 ||
rinfo == R_PPC_RELATIVE)
{
*reloc_addr = finaladdr;
}
else if (rinfo == R_PPC_ADDR16_LO)
{
*(Elf32_Half*) reloc_addr = finaladdr;
}
else if (rinfo == R_PPC_ADDR16_HI)
{
*(Elf32_Half*) reloc_addr = finaladdr >> 16;
}
else if (rinfo == R_PPC_ADDR16_HA)
{
*(Elf32_Half*) reloc_addr = (finaladdr + 0x8000) >> 16;
}
#ifndef RTLD_BOOTSTRAP
else if (rinfo == R_PPC_REL24)
{
Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
if (delta << 6 >> 6 != delta)
{
_dl_signal_error(0, map->l_name,
"R_PPC_REL24 relocation out of range");
}
*reloc_addr = *reloc_addr & 0xfc000003 | delta & 0x3fffffc;
}
else if (rinfo == R_PPC_ADDR24)
{
if (finaladdr << 6 >> 6 != finaladdr)
{
_dl_signal_error(0, map->l_name,
"R_PPC_ADDR24 relocation out of range");
}
*reloc_addr = *reloc_addr & 0xfc000003 | finaladdr & 0x3fffffc;
}
else if (rinfo == R_PPC_COPY)
{
if (sym->st_size != refsym->st_size)
{
const char *strtab;
strtab = ((void *) map->l_addr
+ map->l_info[DT_STRTAB]->d_un.d_ptr);
_dl_sysdep_error ("Symbol `", strtab + refsym->st_name,
"' has different size in shared object, "
"consider re-linking\n", NULL);
}
memcpy (reloc_addr, (char *) finaladdr, MIN (sym->st_size,
refsym->st_size));
}
#endif
else if (rinfo == R_PPC_REL32)
{
*reloc_addr = finaladdr - (Elf32_Word) (char *) reloc_addr;
}
else if (rinfo == R_PPC_JMP_SLOT)
{
Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
if (delta << 6 >> 6 == delta)
*reloc_addr = OPCODE_B (delta);
else if (finaladdr <= 0x01fffffc || finaladdr >= 0xfe000000)
*reloc_addr = OPCODE_BA (finaladdr);
else
{
Elf32_Word *plt;
Elf32_Word index;
plt = (Elf32_Word *)((char *)map->l_addr
+ map->l_info[DT_PLTGOT]->d_un.d_val);
index = (reloc_addr - plt - PLT_INITIAL_ENTRY_WORDS)/2;
if (index >= PLT_DOUBLE_SIZE)
{
/* Slots greater than or equal to 2^13 have 4 words available
instead of two. */
reloc_addr[0] = OPCODE_LI (11, finaladdr);
reloc_addr[1] = OPCODE_ADDIS (11, 11, finaladdr + 0x8000 >> 16);
reloc_addr[2] = OPCODE_MTCTR (11);
reloc_addr[3] = OPCODE_BCTR ();
}
else
{
Elf32_Word num_plt_entries;
num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
/ sizeof(Elf32_Rela));
reloc_addr[0] = OPCODE_LI (11, index*4);
reloc_addr[1] =
OPCODE_B (-(4*(index*2
+ 1
- PLT_LONGBRANCH_ENTRY_WORDS
+ PLT_INITIAL_ENTRY_WORDS)));
plt[index+PLT_DATA_START_WORDS (num_plt_entries)] = finaladdr;
}
}
MODIFIED_CODE (reloc_addr);
}
else
assert (! "unexpected dynamic reloc type");
if (rinfo == R_PPC_ADDR16_LO ||
rinfo == R_PPC_ADDR16_HI ||
rinfo == R_PPC_ADDR16_HA ||
rinfo == R_PPC_REL24 ||
rinfo == R_PPC_ADDR24)
MODIFIED_CODE_NOQUEUE (reloc_addr);
}
#define ELF_MACHINE_NO_REL 1
#endif

View File

@ -0,0 +1,35 @@
/* Clear given exceptions in current floating-point environment.
Copyright (C) 1997 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 <fenv_libc.h>
void
feclearexcept (int excepts)
{
fenv_union_t u;
/* Get the current state. */
u.fenv = fegetenv_register ();
/* Clear the relevant bits. */
u.l[1] = u.l[1] & ~FE_to_sticky (excepts);
/* Put the new state in effect. */
fesetenv_register (u.fenv);
}

View File

@ -0,0 +1,26 @@
/* Store current floating-point environment.
Copyright (C) 1997 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 <fenv_libc.h>
void
fegetenv (fenv_t *envp)
{
*envp = fegetenv_register ();
}

View File

@ -0,0 +1,31 @@
/* Return current rounding direction.
Copyright (C) 1997 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 <fenv_libc.h>
int
fegetround (void)
{
fenv_union_t u;
u.fenv = fegetenv_register ();
/* The rounding mode is bits 30 and 31 of the FPSCR. */
return u.l[1] & 3;
}

View File

@ -0,0 +1,38 @@
/* Store current floating-point environment and clear exceptions.
Copyright (C) 1997 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 <fenv_libc.h>
int
feholdexcept (fenv_t *envp)
{
fenv_union_t u;
/* Get the current state. */
u.fenv = *envp = fegetenv_register ();
/* Clear everything except for the rounding mode and non-IEEE arithmetic
flag. */
u.l[1] = u.l[1] & 7;
/* Put the new state in effect. */
fesetenv_register (u.fenv);
return 1;
}

View File

@ -0,0 +1,29 @@
/* Constants for fenv_bits.h.
Copyright (C) 1997 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. */
/* We want to specify the bit pattern of the __fe_*_env constants, so
pretend they're really `long long' instead of `double'. */
/* If the default argument is used we use this value. */
const unsigned long long __fe_dfl_env __attribute__ ((aligned (8))) =
0xfff8000000000000ULL;
/* Floating-point environment where none of the exceptions are masked. */
const unsigned long long __fe_nomask_env __attribute__ ((aligned (8))) =
0xfff80000000000f8ULL;

View File

@ -0,0 +1,57 @@
/* Internal libc stuff for floating point environment routines.
Copyright (C) 1997 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. */
#ifndef _FENV_LIBC_H
#define _FENV_LIBC_H 1
#include <fenv.h>
/* Transform a logical or of the FE_* bits to a bit pattern for the
appropriate sticky bits in the FPSCR. */
#define FE_to_sticky(excepts) \
(-(excepts & FE_INVALID) & FE_ALL_INVALID \
| (excepts) & (FE_ALL_EXCEPT & ~FE_INVALID | FE_ALL_INVALID))
/* The sticky bits in the FPSCR indicating exceptions have occurred. */
#define FPSCR_STICKY_BITS ((FE_ALL_EXCEPT | FE_ALL_INVALID) & ~FE_INVALID)
/* Equivalent to fegetenv, but returns a fenv_t instead of taking a
pointer. */
#define fegetenv_register() \
({ fenv_t env; asm ("mffs %0" : "=f" (env)); env; })
/* Equivalent to fesetenv, but takes a fenv_t instead of a pointer. */
#define fesetenv_register(env) \
({ double d = (env); asm ("mtfsf 0xff,%0" : : "f" (d)); })
/* This very handy macro:
- Sets the rounding mode to 'round to nearest';
- Sets the processor into IEEE mode; and
- Prevents exceptions from being raised for inexact results.
These things happen to be exactly what you need for typical elementary
functions. */
#define relax_fenv_state() asm ("mtfsfi 7,0")
typedef union
{
fenv_t fenv;
unsigned int l[2];
} fenv_union_t;
#endif /* fenv_libc.h */

130
sysdeps/powerpc/fenvbits.h Normal file
View File

@ -0,0 +1,130 @@
/* Copyright (C) 1997 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. */
/* This file should never be included directly. */
#ifndef _FENVBITS_H
#define _FENVBITS_H 1
/* Define bits representing the exception. We use the bit positions of
the appropriate bits in the FPSCR... */
enum
{
FE_INEXACT = 1 << 31-6,
#define FE_INEXACT FE_INEXACT
FE_DIVBYZERO = 1 << 31-5,
#define FE_DIVBYZERO FE_DIVBYZERO
FE_UNDERFLOW = 1 << 31-4,
#define FE_UNDERFLOW FE_UNDERFLOW
FE_OVERFLOW = 1 << 31-3,
#define FE_OVERFLOW FE_OVERFLOW
/* ... except for FE_INVALID, for which we use bit 31. FE_INVALID
actually corresponds to bits 7 through 12 and 21 through 23
in the FPSCR, but we can't use that because the current draft
says that it must be a power of 2. Instead we use bit 24 which
is the enable bit for all the FE_INVALID exceptions. */
FE_INVALID = 1 << 31-24,
#define FE_INVALID FE_INVALID
#ifdef __USE_GNU
/* Breakdown of the FE_INVALID bits. Setting FE_INVALID on an
input to a routine is equivalent to setting all of these bits;
FE_INVALID will be set on output from a routine iff one of
these bits is set. Note, though, that you can't disable or
enable these exceptions individually. */
/* Operation with SNaN. */
FE_INVALID_SNAN = 1 << 31-7,
#define FE_INVALID_SNAN FE_INVALID_SNAN
/* Inf - Inf */
FE_INVALID_ISI = 1 << 31-8,
#define FE_INVALID_ISI FE_INVALID_ISI
/* Inf / Inf */
FE_INVALID_IDI = 1 << 31-9,
#define FE_INVALID_IDI FE_INVALID_IDI
/* 0 / 0 */
FE_INVALID_ZDZ = 1 << 31-10,
#define FE_INVALID_ZDZ FE_INVALID_ZDZ
/* Inf * 0 */
FE_INVALID_IMZ = 1 << 31-11,
#define FE_INVALID_IMZ FE_INVALID_IMZ
/* Comparison with NaN or SNaN. */
FE_INVALID_COMPARE = 1 << 31-12,
#define FE_INVALID_COMPARE FE_INVALID_COMPARE
/* Invalid operation flag for software (not set by hardware). */
FE_INVALID_SOFTWARE = 1 << 31-21,
#define FE_INVALID_SOFTWARE FE_INVALID_SOFTWARE
/* Square root of negative number (including -Inf). */
FE_INVALID_SQRT = 1 << 31-22,
#define FE_INVALID_SQRT FE_INVALID_SQRT
/* Conversion-to-integer of a NaN or a number too large or too small. */
FE_INVALID_INTEGER_CONVERSION = 1 << 31-23,
#define FE_INVALID_INTEGER_CONVERSION FE_INVALID_INTEGER_CONVERSION
#define __FE_ALL_INVALID \
(FE_INVALID_SNAN | FE_INVALID_ISI | FE_INVALID_IDI | FE_INVALID_ZDZ \
| FE_INVALID_IMZ | FE_INVALID_COMPARE | FE_INVALID_SOFTWARE \
| FE_INVALID_SQRT | FE_INVALID_INTEGER_CONVERSION)
#endif
};
#define FE_ALL_EXCEPT \
(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
/* PowerPC chips support all of the four defined rounding modes. We
use the bit pattern in the FPSCR as the values for the
appropriate macros. */
enum
{
FE_TONEAREST = 0,
#define FE_TONEAREST FE_TONEAREST
FE_TOWARDSZERO = 1,
#define FE_TOWARDSZERO FE_TOWARDSZERO
FE_UPWARD = 2,
#define FE_UPWARD FE_UPWARD
FE_DOWNWARD = 3,
#define FE_DOWNWARD FE_DOWNWARD
};
/* Type representing exception flags. */
typedef unsigned int fexcept_t;
/* Type representing floating-point environment. We leave it as 'double'
for efficiency reasons (rather than writing it to a 32-bit integer). */
typedef double fenv_t;
/* If the default argument is used we use this value. */
extern const fenv_t __fe_dfl_env;
#define FE_DFL_ENV (&__fe_dfl_env);
#ifdef __USE_GNU
/* Floating-point environment where none of the exceptions are masked. */
extern const fenv_t __fe_nomask_env;
# define FE_NOMASK_ENV (&__fe_nomask_env);
#endif
#endif /* fenvbits.h */

View File

@ -0,0 +1,26 @@
/* Install given floating-point environment.
Copyright (C) 1997 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 <fenv_libc.h>
void
fesetenv (const fenv_t *envp)
{
fesetenv_register (*envp);
}

View File

@ -0,0 +1,41 @@
/* Set current rounding direction.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
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 <fenv_libc.h>
int
fesetround (int round)
{
fenv_union_t u;
if ((unsigned int) round > 3)
return 0;
/* Get the current state. */
u.fenv = fegetenv_register ();
/* Set the relevant bits. */
u.l[1] = u.l[1] & ~3 | round & 3;
/* Put the new state in effect. */
fesetenv_register (u.fenv);
return 1;
}

View File

@ -0,0 +1,37 @@
/* Install given floating-point environment and raise exceptions.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
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 <fenv_libc.h>
void
feupdateenv (const fenv_t *envp)
{
fenv_union_t old, new;
/* Save the currently set exceptions. */
new.fenv = *envp;
old.fenv = fegetenv_register ();
/* Copy the set exceptions from `old' to `new'. */
new.l[1] = new.l[1] & 0xE00000FF | old.l[1] & 0x1FFFFF00;
/* Atomically enable and raise (if appropriate) exceptions set in `new'. */
fesetenv_register (new.fenv);
}

View File

@ -18,11 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <bstring.h>
#undef ffs
#ifdef __GNUC__
#include <string.h>
int
ffs (int x)
@ -32,7 +28,3 @@ ffs (int x)
asm ("cntlzw %0,%1" : "=r" (cnt) : "r" (x & -x));
return 32 - cnt;
}
#else
#include <sysdeps/generic/ffs.c>
#endif

View File

@ -0,0 +1,33 @@
/* Store current representation for exceptions.
Copyright (C) 1997 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 <fenv_libc.h>
void
fegetexceptflag (fexcept_t *flagp, int excepts)
{
fenv_union_t u;
unsigned int flag;
/* Get the current state. */
u.fenv = fegetenv_register ();
/* Return that portion that corresponds to the requested exceptions. */
*flagp = flag = u.l[1] & FPSCR_STICKY_BITS & FE_to_sticky (excepts);
}

View File

@ -34,20 +34,16 @@
#define _FPU_MASK_UM 0x20 /* underflow */
#define _FPU_MASK_XM 0x08 /* inexact */
#define _FPU_MASK_IM 0x80 /* invalid operation */
#define _FPU_MASK_VXCVI 0x100 /* invalid operation for integer convert */
#define _FPU_MASK_VXSQRT 0x200 /* invalid operation for square root */
#define _FPU_MASK_VXSOFT 0x400 /* invalid operation raised by software */
#define _FPU_RESERVED 0xfffff800 /* These bits are reserved are not changed. */
#define _FPU_RESERVED 0xffffff00 /* These bits are reserved are not changed. */
/* The fdlibm code requires no interrupts for exceptions. Don't
change the rounding mode, it would break long double I/O! */
/* The fdlibm code requires no interrupts for exceptions. */
#define _FPU_DEFAULT 0x00000000 /* Default value. */
/* IEEE: same as above, but (some) exceptions;
we leave the 'inexact' exception off.
*/
#define _FPU_IEEE 0x000003f0
#define _FPU_IEEE 0x000000f0
/* Type of the control word. */
typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
@ -59,7 +55,7 @@ typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
tmp[1]; } )
#define _FPU_SETCW(cw) { \
fpu_control_t tmp[2] __attribute__ ((__aligned__(8))); \
tmp[0] = 0xFFF80000; /* arbitrary, more-or-less */ \
tmp[0] = 0xFFF80000; /* More-or-less arbitrary; this is a QNaN. */ \
tmp[1] = cw; \
__asm__ ("lfd 0,%0; mtfsf 255,0" : : "m" (*tmp) : "fr0"); \
}

View File

@ -0,0 +1,44 @@
/* Raise given exceptions.
Copyright (C) 1997 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 <fenv_libc.h>
void
feraiseexcept (int excepts)
{
fenv_union_t u;
/* Raise exceptions represented by EXCEPTS. It is the responsibility of
the OS to ensure that if multiple exceptions occur they are fed back
to this process in the proper way; this can happen in hardware,
anyway (in particular, inexact with overflow or underflow). */
/* Get the current state. */
u.fenv = fegetenv_register ();
/* Add the exceptions */
u.l[1] = (u.l[1]
| excepts & __FPSCR_STICKY_BITS
/* Turn FE_INVALID into FE_INVALID_SOFTWARE. */
| excepts << (31 - 21) - (31 - 24) & __FE_INVALID_SOFTWARE);
/* Store the new status word (along with the rest of the environment),
triggering any appropriate exceptions. */
fesetenv_register (u.fenv);
}

View File

@ -0,0 +1,37 @@
/* Set floating-point environment exception handling.
Copyright (C) 1997 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 <fenv_libc.h>
void
fesetexceptflag (const fexcept_t *flagp, int excepts)
{
fenv_union_t u;
/* Get the current state. */
u.fenv = fegetenv_register ();
/* Replace the exception status */
u.l[1] = u.l[1] & FPSCR_STICKY_BITS | *flagp & FE_to_sticky (excepts);
/* Store the new status word (along with the rest of the environment).
This may cause floating-point exceptions if the restored state
requests it. */
fesetenv_register (u.fenv);
}

View File

@ -0,0 +1,38 @@
/* Test exception in current environment.
Copyright (C) 1997 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 <fenv_libc.h>
int
fetestexcept (int excepts)
{
fenv_union_t u;
int flags;
/* Get the current state. */
u.fenv = fegetenv_register ();
/* Find the bits that indicate exceptions have occurred. */
flags = u.l[1] & FPSCR_STICKY_BITS;
/* Set the FE_INVALID bit if any of the FE_INVALID_* bits are set. */
flags |= ((u.l[1] & FE_ALL_INVALID) != 0) << 31-24;
return flags & excepts;
}

View File

@ -0,0 +1,72 @@
/* Copyright (C) 1997 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. */
#ifndef _MATHBITS_H
#define _MATHBITS_H 1
/* FIXME! This file describes properties of the compiler, not the machine;
it should not be part of libc!
FIXME! This file does not deal with the -fshort-double option of
gcc! */
#ifdef __GNUC__
#if __STDC__ == 1
/* In GNU or ANSI mode, gcc leaves `float' expressions as-is, I think. */
typedef float float_t; /* `float' expressions are evaluated as
`float'. */
typedef double double_t; /* `double' expressions are evaluated as
`double'. */
/* Signal that types stay as they were declared. */
#define FLT_EVAL_METHOD 0
/* Define `INFINITY' as value of type `float_t'. */
#define INFINITY HUGE_VALF
#else
/* For `gcc -traditional', `float' expressions are evaluated as `double'. */
typedef double float_t; /* `float' expressions are evaluated as
`double'. */
typedef double double_t; /* `double' expressions are evaluated as
`double'. */
/* Signal that both types are `double'. */
#define FLT_EVAL_METHOD 1
/* Define `INFINITY' as value of type `float_t'. */
#define INFINITY HUGE_VAL
#endif
#else
/* Wild guess at types for float_t and double_t. */
typedef double float_t;
typedef double double_t;
/* Strange compiler, we don't know how it works. */
#define FLT_EVAL_METHOD -1
/* Define `INFINITY' as value of type `float_t'. */
#define INFINITY HUGE_VAL
#endif
#endif /* mathbits.h */

View File

@ -22,46 +22,46 @@
#include <jmp_buf.h>
ENTRY (__sigsetjmp)
stw 1,(JB_GPR1*4)(3)
mflr 0
stw 2,(JB_GPR2*4)(3)
stw 14,((JB_GPRS+0)*4)(3)
stfd 14,((JB_FPRS+0*2)*4)(3)
stw 0,(JB_LR*4)(3)
stw 15,((JB_GPRS+1)*4)(3)
stfd 15,((JB_FPRS+1*2)*4)(3)
stw 16,((JB_GPRS+2)*4)(3)
stfd 16,((JB_FPRS+2*2)*4)(3)
stw 17,((JB_GPRS+3)*4)(3)
stfd 17,((JB_FPRS+3*2)*4)(3)
stw 18,((JB_GPRS+4)*4)(3)
stfd 18,((JB_FPRS+4*2)*4)(3)
stw 19,((JB_GPRS+5)*4)(3)
stfd 19,((JB_FPRS+5*2)*4)(3)
stw 20,((JB_GPRS+6)*4)(3)
stfd 20,((JB_FPRS+6*2)*4)(3)
stw 21,((JB_GPRS+7)*4)(3)
stfd 21,((JB_FPRS+7*2)*4)(3)
stw 22,((JB_GPRS+8)*4)(3)
stfd 22,((JB_FPRS+8*2)*4)(3)
stw 23,((JB_GPRS+9)*4)(3)
stfd 23,((JB_FPRS+9*2)*4)(3)
stw 24,((JB_GPRS+10)*4)(3)
stfd 24,((JB_FPRS+10*2)*4)(3)
stw 25,((JB_GPRS+11)*4)(3)
stfd 25,((JB_FPRS+11*2)*4)(3)
stw 26,((JB_GPRS+12)*4)(3)
stfd 26,((JB_FPRS+12*2)*4)(3)
stw 27,((JB_GPRS+13)*4)(3)
stfd 27,((JB_FPRS+13*2)*4)(3)
stw 28,((JB_GPRS+14)*4)(3)
stfd 28,((JB_FPRS+14*2)*4)(3)
stw 29,((JB_GPRS+15)*4)(3)
stfd 29,((JB_FPRS+15*2)*4)(3)
stw 30,((JB_GPRS+16)*4)(3)
stfd 30,((JB_FPRS+16*2)*4)(3)
stw 31,((JB_GPRS+17)*4)(3)
stfd 31,((JB_FPRS+17*2)*4)(3)
stw %r1,(JB_GPR1*4)(3)
mflr %r0
stw %r2,(JB_GPR2*4)(3)
stw %r14,((JB_GPRS+0)*4)(3)
stfd %f14,((JB_FPRS+0*2)*4)(3)
stw %r0,(JB_LR*4)(3)
stw %r15,((JB_GPRS+1)*4)(3)
stfd %f15,((JB_FPRS+1*2)*4)(3)
stw %r16,((JB_GPRS+2)*4)(3)
stfd %f16,((JB_FPRS+2*2)*4)(3)
stw %r17,((JB_GPRS+3)*4)(3)
stfd %f17,((JB_FPRS+3*2)*4)(3)
stw %r18,((JB_GPRS+4)*4)(3)
stfd %f18,((JB_FPRS+4*2)*4)(3)
stw %r19,((JB_GPRS+5)*4)(3)
stfd %f19,((JB_FPRS+5*2)*4)(3)
stw %r20,((JB_GPRS+6)*4)(3)
stfd %f20,((JB_FPRS+6*2)*4)(3)
stw %r21,((JB_GPRS+7)*4)(3)
stfd %f21,((JB_FPRS+7*2)*4)(3)
stw %r22,((JB_GPRS+8)*4)(3)
stfd %f22,((JB_FPRS+8*2)*4)(3)
stw %r23,((JB_GPRS+9)*4)(3)
stfd %f23,((JB_FPRS+9*2)*4)(3)
stw %r24,((JB_GPRS+10)*4)(3)
stfd %f24,((JB_FPRS+10*2)*4)(3)
stw %r25,((JB_GPRS+11)*4)(3)
stfd %f25,((JB_FPRS+11*2)*4)(3)
stw %r26,((JB_GPRS+12)*4)(3)
stfd %f26,((JB_FPRS+12*2)*4)(3)
stw %r27,((JB_GPRS+13)*4)(3)
stfd %f27,((JB_FPRS+13*2)*4)(3)
stw %r28,((JB_GPRS+14)*4)(3)
stfd %f28,((JB_FPRS+14*2)*4)(3)
stw %r29,((JB_GPRS+15)*4)(3)
stfd %f29,((JB_FPRS+15*2)*4)(3)
stw %r30,((JB_GPRS+16)*4)(3)
stfd %f30,((JB_FPRS+16*2)*4)(3)
stw %r31,((JB_GPRS+17)*4)(3)
stfd %f31,((JB_FPRS+17*2)*4)(3)
#ifdef PIC
b __sigjmp_save@plt
#else

View File

@ -68,78 +68,78 @@
# them, the others we must save.
.section ".text"
.align 3
.align 2
.globl strlen
.type strlen,@function
strlen:
# On entry, r3 points to the string, and it's left that way.
# We use r6 to store 0x01010101, and r7 to store 0x7f7f7f7f.
# We use r6 to store 0xfefefeff, and r7 to store 0x7f7f7f7f.
# r4 is used to keep the current index into the string; r5 holds
# the number of padding bits we prepend to the string to make it
# start at a word boundary. r8 holds the 'current' word.
# r9-12 are temporaries. r0 is used as a temporary and for discarded
# results.
clrrwi 4,3,2
lis 6,0xfeff
lis 7,0x7f7f
rlwinm 10,3,0,29,29
lwz 8,0(4)
addi 7,7,0x7f7f
rlwinm 5,3,3,27,28
cmpwi 1,10,0
li 9,-1
clrrwi %r4,%r3,2
lis %r6,0xfeff
lis %r7,0x7f7f
rlwinm %r10,%r3,0,29,29
lwz %r8,0(%r4)
addi %r7,%r7,0x7f7f
rlwinm %r5,%r3,3,27,28
cmpwi %cr1,%r10,0
li %r9,-1
# That's the setup done, now do the first pair of words.
# We make an exception and use method (2) on the first two words, to reduce
# overhead.
srw 9,9,5
and 0,7,8
or 10,7,8
add 0,0,7
nor 0,10,0
and. 8,0,9
bne done0
srw %r9,%r9,%r5
and %r0,%r7,%r8
or %r10,%r7,%r8
add %r0,%r0,%r7
nor %r0,%r10,%r0
and. %r8,%r0,%r9
bne done0
# Handle second word of pair. Put addi between branches to avoid hurting
# branch prediction.
addi 6,6,0xfffffeff
bne 1,loop
lwzu 8,4(4)
and 0,7,8
or 10,7,8
add 0,0,7
nor. 0,10,0
bne done0
addi %r6,%r6,0xfffffeff
bne %cr1,loop
lwzu %r8,4(%r4)
and %r0,%r7,%r8
or %r10,%r7,%r8
add %r0,%r0,%r7
nor. %r8,%r10,%r0
bne done0
# The loop.
loop: lwz %r8,4(%r4)
lwzu %r9,8(%r4)
add %r0,%r6,%r8
nor %r10,%r7,%r8
and. %r0,%r0,%r10
add %r11,%r6,%r9
nor %r12,%r7,%r9
bne done1
and. %r0,%r11,%r12
beq loop
loop: lwz 8,4(4)
lwzu 9,8(4)
add 0,6,8
nor 10,7,8
and. 0,0,10
add 11,6,9
nor 12,7,9
bne done1
and. 0,11,12
beq loop
and 0,7,9
or 10,7,9
b done2
done1: addi 4,4,-4
and 0,7,9
or 10,7,9
done2: add 0,0,7
nor 0,10,0
and %r0,%r7,%r9
add %r0,%r0,%r7
andc %r8,%r12,%r0
b done0
done1: and %r0,%r7,%r8
subi %r4,%r4,4
add %r0,%r0,%r7
andc %r8,%r10,%r0
# When we get to here, r4 points to the first word in the string that
# contains a zero byte, and the most significant set bit in r8 is in that
# byte.
done0: cntlzw 11,8
subf 0,3,4
srwi 11,11,3
add 3,0,11
done0: cntlzw %r11,%r8
subf %r0,%r3,%r4
srwi %r11,%r11,3
add %r3,%r0,%r11
blr
0:
.size strlen,0b-strlen

View File

@ -19,7 +19,7 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <bstring.h>
#include <string.h>
#undef ffs

View File

@ -25,6 +25,7 @@ ENTRY (__sigsetjmp)
/* 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. */
ta ST_FLUSH_WINDOWS
#ifdef PIC
mov %o7,%g1
2:

View File

@ -0,0 +1,49 @@
/* Copyright (C) 1991, 1994, 1996, 1997 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
/* This file defines the `errno' constants for standalone ARM machines.
These constants are essentially arbitrary. */
#if !defined(__Emath_defined) && (defined(_ERRNO_H) || defined(__need_Emath))
#undef __need_Emath
#define __Emath_defined 1
#define EDOM 1
#define ERANGE 2
#endif
#ifdef _ERRNO_H
#define ENOSYS 3
#define EINVAL 4
#define ESPIPE 5
#define EBADF 6
#define ENOMEM 7
#define EACCES 8
#define ENFILE 9
#define EMFILE 10
#define ENAMETOOLONG 11 /* File name too long */
#define ELOOP 12 /* Too many symbolic links encountered */
#define ENOMSG 13 /* No message of desired type */
#define E2BIG 14 /* Arg list too long */
#define EINTR 15
#define EILSEQ 16
#define ENOEXEC 17
#define ENOENT 18
#endif
#define __set_errno(val) errno = (val)

View File

@ -28,7 +28,7 @@ Cambridge, MA 02139, USA. */
The miscellaneous Unix `readdir' implementations read directory data
into a buffer and fill in a `struct dirent' copy in the `DIR' object. */
typedef struct
struct __dirstream
{
int __fd; /* File descriptor. */
@ -38,6 +38,6 @@ typedef struct
size_t __size; /* Total valid data in the block. */
struct dirent __entry; /* Returned by `readdir'. */
} DIR;
};
#endif /* dirstream.h */

View File

@ -20,4 +20,4 @@
struct dirent
{
char d_name[1]; /* Variable length. */
}
};

View File

@ -23,7 +23,7 @@
int
dirfd (dirp)
FILE *dirp;
DIR *dirp;
{
__set_errno (ENOSYS);
return -1;

36
sysdeps/stub/if_index.c Normal file
View File

@ -0,0 +1,36 @@
/* Copyright (C) 1997 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
unsigned int if_nametoindex(const char *ifname)
{
return 0;
}
char *if_indextoname(unsigned int ifindex, char *ifname)
{
return NULL;
}
void if_freenameindex(struct if_nameindex *ifn)
{
}
struct if_nameindex *if_nameindex(void)
{
return NULL;
}

View File

@ -24,7 +24,7 @@ Cambridge, MA 02139, USA. */
/* Seek to position POS in DIRP. */
void
seekdir (dirp, pos)
DIR *dirp
DIR *dirp;
off_t pos;
{
if (dirp == NULL)

View File

@ -1,20 +1,20 @@
/* Copyright (C) 1991, 1994, 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
/* Copyright (C) 1991, 1994, 1995, 1996, 1997 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 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.
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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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 <stddef.h>
#include <errno.h>
@ -26,7 +26,7 @@ Cambridge, MA 02139, USA. */
int
__setitimer (which, new, old)
enum __itimer_which which;
struct itimerval *new;
const struct itimerval *new;
struct itimerval *old;
{
if (new == NULL)

View File

@ -26,7 +26,7 @@ int
__sigaction (sig, act, oact)
int sig;
const struct sigaction *act;
struct sigaction *OACT;
struct sigaction *oact;
{
if (sig <= 0 || sig >= NSIG)
{

View File

@ -6,3 +6,5 @@
the installed headers on the system. */
#include <limits.h>
#define MAXSYMLINKS 1

View File

@ -164,10 +164,10 @@ __sysconf (name)
case _SC_SEMAPHORES:
case _SC_SHARED_MEMORY_OBJECTS:
case _SC_AIO_LIST_MAX:
case _SC_AIO_LISTIO_MAX:
case _SC_AIO_MAX:
case _SC_AIO_PRIO_DELTA_MAX:
case _SC_DELAYTIME_MAX:
case _SC_DELAYTIMER_MAX:
case _SC_MQ_OPEN_MAX:
case _SC_MQ_PRIO_MAX:
case _SC_VERSION:

View File

@ -26,7 +26,7 @@
Return the generated filename or NULL if one could not
be generated, putting the length of the string in *LENPTR. */
char *
__stdio_gen_tempname (buf, bufsize, dir, pfx, dir_search, lenptr)
__stdio_gen_tempname (buf, bufsize, dir, pfx, dir_search, lenptr, streamptr)
char *buf;
size_t bufsize;
const char *dir;

View File

@ -18,6 +18,7 @@ Cambridge, MA 02139, USA. */
#include <errno.h>
#include <stdio.h>
#include <stdarg.h>
/* Write formatted output to file descriptor D according to the format string
FORMAT, using the argument list in ARG. */
@ -25,38 +26,7 @@ int
vdprintf (int d, const char *format, va_list arg)
{
__set_errno (ENOSYS);
return NULL;
}
stub_warning (vdprintf)
/* Copyright (C) 1997 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <errno.h>
#include <stdio.h>
/* Write formatted output to file descriptor D according to the format string
FORMAT, using the argument list in ARG. */
int
vdprintf (int d, const char *format, va_list arg)
{
__set_errno (ENOSYS);
return NULL;
return 0;
}
stub_warning (vdprintf)

33
sysdeps/unix/arm/fork.S Normal file
View File

@ -0,0 +1,33 @@
/* Copyright (C) 1991, 1992, 1994, 1995, 1997 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <sysdep.h>
/* ARM version. */
SYSCALL__ (fork, 0)
/* R1 is now 0 for the parent and 1 for the child. Decrement it to
make it -1 (all bits set) for the parent, and 0 (no bits set)
for the child. Then AND it with R0, so the parent gets
R0&-1==R0, and the child gets R0&0==0. */
sub r1, r1, $1
and r0, r0, r1
RETINSTR(mov, pc, r14)
PSEUDO_END(fork)
weak_alias (__fork, fork)

View File

@ -19,3 +19,8 @@ Cambridge, MA 02139, USA. */
#include <sysdeps/unix/sysdep.h>
#include <sysdeps/arm/sysdep.h>
/* Some definitions to allow the assembler in sysdeps/unix/*.S to build
without needing ARM-specific versions of all the files. */
#define ret RETINSTR(mov, pc, r14)
#define MOVE(a,b) mov b,a

View File

@ -0,0 +1,33 @@
/* Copyright (C) 1996, 1997 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. */
/* clone() is even more special than fork() as it mucks with stacks
and invokes a function in the right context after its all over. */
#include <sysdep.h>
#define _ERRNO_H 1
#include <errnos.h>
/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
.text
ENTRY(__clone)
/* Somebody needs to write this. */
PSEUDO_END (__clone)
weak_alias (__clone, clone)

Some files were not shown because too many files have changed in this diff Show More