mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-19 13:40:59 +08:00
Update.
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:
parent
43b0e40f85
commit
1f205a479b
.cvsignoreBUGSChangeLogFAQ
dirent
elf
gnu-versions.hhurd
inet
locale/programs
malloc
manual
math
misc
nis/nss_nisplus
po
posix
resolv/nss_dns
stdio-common
string
sunrpc
authuxprot.cpmap_rmt.cproto.h
rpc
rpc_cout.crpc_parse.hrpc_svcout.cxdr.cxdr_float.cxdr_mem.cxdr_rec.cxdr_stdio.csysdeps
generic/rpc
i386/fpu
mach/hurd
powerpc
DistMakefile__longjmp.S__math.hbsd-_setjmp.Sbsd-setjmp.Sdl-machine.hfclrexcpt.cfegetenv.cfegetround.cfeholdexcpt.cfenv_const.cfenv_libc.hfenvbits.hfesetenv.cfesetround.cfeupdateenv.cffs.cfgetexcptflg.cfpu_control.hfraiseexcpt.cfsetexcptflg.cftestexcept.cmathbits.hsetjmp.Sstrlen.s
rs6000
sparc
standalone
stub
unix
@ -21,3 +21,5 @@ crypt
|
||||
linuxthreads
|
||||
localedata
|
||||
secure_rpc
|
||||
|
||||
aio
|
||||
|
5
BUGS
5
BUGS
@ -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
222
ChangeLog
@ -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
13
FAQ
@ -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:
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
27
dirent/versionsort.c
Normal 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);
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
@ -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."
|
||||
|
@ -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
|
||||
|
123
hurd/hurdauth.c
123
hurd/hurdauth.c
@ -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)
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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})
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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. */
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
111
string/strverscmp.c
Normal 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;
|
||||
}
|
||||
}
|
@ -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";
|
||||
|
@ -34,7 +34,7 @@ main(int argc, char *argv[])
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
45
string/tst-svc.c
Normal file
45
string/tst-svc.c
Normal 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
26
string/tst-svc.expect
Normal 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
26
string/tst-svc.input
Normal 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
|
@ -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)
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 */
|
||||
|
||||
/*
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -33,6 +33,7 @@
|
||||
#define _RPC_MSG_H 1
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
#include <rpc/xdr.h>
|
||||
#include <rpc/clnt.h>
|
||||
|
||||
/*
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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)
|
||||
{
|
||||
|
15
sunrpc/xdr.c
15
sunrpc/xdr.c
@ -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 */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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]));
|
||||
|
@ -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
1
sysdeps/powerpc/Dist
Normal file
@ -0,0 +1 @@
|
||||
fenv_libc.h
|
3
sysdeps/powerpc/Makefile
Normal file
3
sysdeps/powerpc/Makefile
Normal file
@ -0,0 +1,3 @@
|
||||
ifeq ($(subdir),math)
|
||||
libm-support += fenv_const
|
||||
endif
|
@ -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)
|
||||
|
@ -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__ */
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
35
sysdeps/powerpc/fclrexcpt.c
Normal file
35
sysdeps/powerpc/fclrexcpt.c
Normal 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);
|
||||
}
|
26
sysdeps/powerpc/fegetenv.c
Normal file
26
sysdeps/powerpc/fegetenv.c
Normal 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 ();
|
||||
}
|
31
sysdeps/powerpc/fegetround.c
Normal file
31
sysdeps/powerpc/fegetround.c
Normal 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;
|
||||
}
|
38
sysdeps/powerpc/feholdexcpt.c
Normal file
38
sysdeps/powerpc/feholdexcpt.c
Normal 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;
|
||||
}
|
29
sysdeps/powerpc/fenv_const.c
Normal file
29
sysdeps/powerpc/fenv_const.c
Normal 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;
|
57
sysdeps/powerpc/fenv_libc.h
Normal file
57
sysdeps/powerpc/fenv_libc.h
Normal 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
130
sysdeps/powerpc/fenvbits.h
Normal 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 */
|
26
sysdeps/powerpc/fesetenv.c
Normal file
26
sysdeps/powerpc/fesetenv.c
Normal 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);
|
||||
}
|
41
sysdeps/powerpc/fesetround.c
Normal file
41
sysdeps/powerpc/fesetround.c
Normal 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;
|
||||
}
|
37
sysdeps/powerpc/feupdateenv.c
Normal file
37
sysdeps/powerpc/feupdateenv.c
Normal 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);
|
||||
}
|
@ -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
|
||||
|
33
sysdeps/powerpc/fgetexcptflg.c
Normal file
33
sysdeps/powerpc/fgetexcptflg.c
Normal 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);
|
||||
}
|
@ -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"); \
|
||||
}
|
||||
|
44
sysdeps/powerpc/fraiseexcpt.c
Normal file
44
sysdeps/powerpc/fraiseexcpt.c
Normal 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);
|
||||
}
|
37
sysdeps/powerpc/fsetexcptflg.c
Normal file
37
sysdeps/powerpc/fsetexcptflg.c
Normal 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);
|
||||
}
|
38
sysdeps/powerpc/ftestexcept.c
Normal file
38
sysdeps/powerpc/ftestexcept.c
Normal 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;
|
||||
}
|
72
sysdeps/powerpc/mathbits.h
Normal file
72
sysdeps/powerpc/mathbits.h
Normal 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 */
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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:
|
||||
|
49
sysdeps/standalone/arm/errnos.h
Normal file
49
sysdeps/standalone/arm/errnos.h
Normal 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)
|
@ -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 */
|
||||
|
@ -20,4 +20,4 @@
|
||||
struct dirent
|
||||
{
|
||||
char d_name[1]; /* Variable length. */
|
||||
}
|
||||
};
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
int
|
||||
dirfd (dirp)
|
||||
FILE *dirp;
|
||||
DIR *dirp;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
|
36
sysdeps/stub/if_index.c
Normal file
36
sysdeps/stub/if_index.c
Normal 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;
|
||||
}
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -6,3 +6,5 @@
|
||||
the installed headers on the system. */
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#define MAXSYMLINKS 1
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
|
@ -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
33
sysdeps/unix/arm/fork.S
Normal 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)
|
@ -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
|
||||
|
33
sysdeps/unix/sysv/linux/arm/clone.S
Normal file
33
sysdeps/unix/sysv/linux/arm/clone.S
Normal 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
Loading…
x
Reference in New Issue
Block a user