diff options
44 files changed, 2063 insertions, 475 deletions
@@ -1,3 +1,113 @@ +2008-02-21 Alan Modra <amodra@bigpond.net.au> + + * sysdeps/powerpc/powerpc64/dl-machine.h (elf_machine_type_class): + Always set ELF_RTYPE_CLASS_PLT. + (elf_machine_lookup_noexec_p, elf_machine_lookup_noplt_p): Delete. + +2008-04-03 Steven Munroe <sjmunroe@us.ibm.com> + + * sysdeps/powerpc/powerpc32/power4/hp-timing.c: New file. + * sysdeps/powerpc/powerpc32/power4/hp-timing.h: New file. + * sysdeps/powerpc/powerpc64/hp-timing.h [_ARCH_PWR4] (HP_TIMING_NOW): + For ISA 2.01 and later replace mftb with mfspr 268. + +2008-02-19 Steven Munroe <sjmunroe@us.ibm.com> + + [BZ #5768] + * sysdeps/powerpc/fpu/Makefile (libm-tests): Add test-powerpc-snan. + * sysdeps/powerpc/fpu/test-powerpc-snan.c: New file. + +2008-02-18 Steven Munroe <sjmunroe@us.ibm.com> + + [BZ #5768] + * sysdeps/powerpc/powerpc32/fpu/s_isnan.S: New file. + * sysdeps/powerpc/powerpc32/fpu/s_isnan.c: Removed. + * sysdeps/powerpc/powerpc64/fpu/s_isnan.S: New file. + * sysdeps/powerpc/powerpc64/fpu/s_isnan.c: Removed. + +2008-04-10 Jakub Jelinek <jakub@redhat.com> + + * stdlib/tst-makecontext.c (othervar): New variable. + (cf): Test sign extending the argument to long. + +2008-03-03 Steven Munroe <sjmunroe@us.ibm.com> + + * sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S: New file. + * sysdeps/powerpc/powerpc32/power5/fpu/s_isnanf.S: New file. + * sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S: New file. + * sysdeps/powerpc/powerpc32/power6/fpu/s_isnanf.S: New file. + * sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S: New file. + * sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S: New file. + * sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S: New file. + +2008-02-22 Alan Modra <amodra@bigpond.net.au> + + * elf/Makefile (tests): Substitute tests-vis-yes here. + (tests-vis-yes): Delete. + (modules-name, modules-vis-yes): Similarly. + +2008-02-12 Pete Eberlein <eberlein@us.ibm.com> + + [BZ #4407] + * sysdeps/ieee754/ldbl-128/e_lgammal_r.c (__ieee754_lgammal_r): + Preserve sign in signgamp when x is zero. + +2007-10-26 Steven Munroe <sjmunroe@us.ibm.com> + + * sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt.S: New File. + * sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt.c: Removed. + * sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf.S: New File. + * sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf.c: Removed. + * sysdeps/powerpc/powerpc32/power5/fpu/w_sqrt.S: New File. + * sysdeps/powerpc/powerpc32/power5/fpu/w_sqrtf.S: New File. + +2008-04-09 Ulrich Drepper <drepper@redhat.com> + + [BZ #4314] + * sysdeps/i386/i686/memcpy.S: Optimize copying of equally aligned + buffers. + + [BZ #5209] + * sysdeps/unix/sysv/syscalls.list: The times syscall doesn't have + a reserved error value. + + * stdlib/tst-makecontext.c: Change parameter to cf to negative + value to check for correct sign extension. + + [BZ #5436] + * sysdeps/unix/sysv/linux/x86_64/makecontext.c (__makecontext): + Copy 64-bit parameter values even though this is not required in + the standard. + + * sysdeps/unix/sysv/linux/x86_64/vfork.S (__vfork): Record return + PC save. + +2008-02-14 Daniel Jacobowitz <dan@codesourcery.com> + + * sysdeps/unix/sysv/linux/i386/vfork.S (__vfork): Record return + PC save. + +2008-04-09 Jakub Jelinek <jakub@redhat.com> + + * nss_files/files-XXX.c (_nss_files_getXXent_r): Restore saved errno. + +2008-04-09 Ulrich Drepper <drepper@redhat.com> + + [BZ #5998] + * libio/iofwrite.c (_IO_fwrite): Return correct count if flushing + in line-buffered stream failed. + * libio/iofwrite_u.c (fwrite_unlocked): Likewise. + +2008-04-08 Ulrich Drepper <drepper@redhat.com> + + [BZ #6024] + * scripts/abi-versions.awk: If the version specified by + --enable-oldest-abi is older than the first version for this + architecture, use the default version. + + * locale/programs/ld-collate.c (collate_read): Ignore script lines + as well when ignoring the whole category. + 2008-04-07 Ulrich Drepper <drepper@redhat.com> [BZ #6042] @@ -1,5 +1,5 @@ -GNU C Library NEWS -- history of user-visible changes. 2007-12-12 -Copyright (C) 1992-2006, 2007 Free Software Foundation, Inc. +GNU C Library NEWS -- history of user-visible changes. 2008-4-9 +Copyright (C) 1992-2007, 2008 Free Software Foundation, Inc. See the end for copying conditions. Please send GNU C library bug reports via <http://sources.redhat.com/bugzilla/> @@ -10,6 +10,33 @@ Version 2.8 * New locales: bo_CN, bo_IN. * New encoding: HP-ROMAN9, HP-GREEK8, HP-THAI8, HP-TURKISH8. + +* Sorting rules for some Indian languages (Devanagari and Gujarati). + Implemented by Pravin Satpute. + +* IPV6 addresses in /etc/resolv.conf can now have a scope ID + +* nscd caches now all timeouts for DNS entries + Implemented by Ulrich Drepper. + +* nscd is more efficient and wakes up less often. + Implemented by Ulrich Drepper. + +* More checking functions: asprintf, dprintf, obstack_printf, vasprintf, + vdprintf, and obstack_vprintf. + Implemented by Jakub Jelinek. + +* Faster memset for x86-64. + Implemented by Harsha Jagasia and H.J. Lu. + +* Faster memcpy on x86. + Implemented by Ulrich Drepper. + +* ARG_MAX is not anymore constant on Linux. Use sysconf(_SC_ARG_MAX). + Implemented by Ulrich Drepper. + +* Faster sqrt and sqrtf implemention for some PPC variants. + Implemented by Stephen Munroe. Version 2.7 diff --git a/elf/Makefile b/elf/Makefile index 2dd2424b28..861485dcd1 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -159,7 +159,7 @@ tests += $(tests-static) endif ifeq (yes,$(build-shared)) tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ - constload1 order $(tests-vis-$(have-protected)) noload filter unload \ + constload1 order vismain noload filter unload \ reldep reldep2 reldep3 reldep4 nodelete nodelete2 \ nodlopen nodlopen2 neededtest neededtest2 \ neededtest3 neededtest4 unload2 lateglobal initfirst global \ @@ -175,7 +175,6 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ tst-stackguard1 tst-addr1 tst-thrlock # reldep9 test-srcs = tst-pathopt -tests-vis-yes = vismain tests-execstack-yes = tst-execstack tst-execstack-needed tst-execstack-prog endif ifeq (yesyes,$(have-fpie)$(build-shared)) @@ -184,7 +183,7 @@ endif tests: $(objpfx)tst-leaks1-mem modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ testobj1_1 failobj constload2 constload3 unloadmod \ - dep1 dep2 dep3 dep4 $(modules-vis-$(have-protected)) \ + dep1 dep2 dep3 dep4 vismod1 vismod2 vismod3 \ nodelmod1 nodelmod2 nodelmod3 nodelmod4 \ nodel2mod1 nodel2mod2 nodel2mod3 \ nodlopenmod nodlopenmod2 filtmod1 filtmod2 \ @@ -220,7 +219,6 @@ endif ifeq (yesyes,$(have-fpie)$(build-shared)) modules-names += tst-piemod1 endif -modules-vis-yes = vismod1 vismod2 vismod3 modules-execstack-yes = tst-execstack-mod extra-test-objs += $(addsuffix .os,$(strip $(modules-names))) # We need this variable to be sure the test modules get the right CPPFLAGS. @@ -855,9 +853,9 @@ endif $(objpfx)check-localplt.out: $(objpfx)check-localplt \ $(common-objpfx)libc.so \ - $(common-objpfx)math/libm.so $(thread-dso) \ - $(common-objpfx)rt/librt.so \ - $(common-objpfx)dlfcn/libdl.so \ + $(common-objpfx)math/libm.so $(thread-dso) \ + $(common-objpfx)rt/librt.so \ + $(common-objpfx)dlfcn/libdl.so \ $(check-data) $(dir $<)$(notdir $<) $(filter-out $< $(check-data),$^) | \ LC_ALL=C sort | \ diff --git a/fedora/branch.mk b/fedora/branch.mk index fc38cf831b..227fdf5885 100644 --- a/fedora/branch.mk +++ b/fedora/branch.mk @@ -3,5 +3,5 @@ glibc-branch := fedora glibc-base := HEAD DIST_BRANCH := devel COLLECTION := dist-f8 -fedora-sync-date := 2008-04-08 07:06 UTC -fedora-sync-tag := fedora-glibc-20080408T0706 +fedora-sync-date := 2008-04-10 19:07 UTC +fedora-sync-tag := fedora-glibc-20080410T1907 diff --git a/fedora/glibc.spec.in b/fedora/glibc.spec.in index 0ce02e16ea..76fbfb2690 100644 --- a/fedora/glibc.spec.in +++ b/fedora/glibc.spec.in @@ -281,8 +281,8 @@ GCC="gcc -m64" GXX="g++ -m64" %endif -#BuildFlags="$BuildFlags -DNDEBUG=1 -fasynchronous-unwind-tables" -BuildFlags="$BuildFlags -fasynchronous-unwind-tables" +BuildFlags="$BuildFlags -DNDEBUG=1 -fasynchronous-unwind-tables" +#BuildFlags="$BuildFlags -fasynchronous-unwind-tables" EnableKernel="--enable-kernel=%{enablekernel}" echo "$GCC" > Gcc AddOns=`echo */configure | sed -e 's!/configure!!g;s!\(linuxthreads\|nptl\|rtkaio\|powerpc-cpu\)\( \|$\)!!g;s! \+$!!;s! !,!g;s!^!,!;/^,\*$/d'` @@ -976,6 +976,14 @@ rm -f *.filelist* %endif %changelog +* Thu Apr 10 2008 Jakub Jelinek <jakub@redhat.com> 2.7.90-15 +- update to trunk + - misc fixes (BZ#4314, BZ#4407, BZ#5209, BZ#5436, BZ#5768, BZ#5998, + BZ#6024) +- restart sshd in %post when upstart is used - it doesn't have + /dev/initctl (#441763) +- disable assert checking again + * Tue Apr 8 2008 Jakub Jelinek <jakub@redhat.com> 2.7.90-14 - update to trunk - misc fixes (BZ#5443, BZ#5475, BZ#5478, BZ#5939, BZ#5979, BZ#5995, diff --git a/fedora/glibc_post_upgrade.c b/fedora/glibc_post_upgrade.c index d73096cdec..4358b90a76 100644 --- a/fedora/glibc_post_upgrade.c +++ b/fedora/glibc_post_upgrade.c @@ -167,8 +167,11 @@ main (void) "--nostdlib", iconv_dir); } - /* Check if telinit is available and the init fifo as well. */ - if (access ("/sbin/telinit", X_OK) || access ("/dev/initctl", F_OK)) + /* Check if telinit is available and either SysVInit fifo, + or upstart telinit. */ + if (access ("/sbin/telinit", X_OK) + || (access ("/dev/initctl", F_OK) + && access ("/sbin/initctl", X_OK))) _exit (0); /* Check if we are not inside of some chroot, because we'd just timeout and leave /etc/initrunlvl. */ diff --git a/libio/iofwrite.c b/libio/iofwrite.c index 1f4331cc83..fb91d6f776 100644 --- a/libio/iofwrite.c +++ b/libio/iofwrite.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1996, 1997, 1998, 1999, 2000, 2002, 2003 +/* Copyright (C) 1993, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2008 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -44,7 +44,11 @@ _IO_fwrite (buf, size, count, fp) if (_IO_vtable_offset (fp) != 0 || _IO_fwide (fp, -1) == -1) written = _IO_sputn (fp, (const char *) buf, request); _IO_release_lock (fp); - if (written == request) + /* We have written all of the input in case the return value indicates + this or EOF is returned. The latter is a special case where we + simply did not manage to flush the buffer. But the data is in the + buffer and therefore written as far as fwrite is concerned. */ + if (written == request || written == EOF) return count; else return written / size; diff --git a/libio/iofwrite_u.c b/libio/iofwrite_u.c index 738cc5b28f..d27c02ac31 100644 --- a/libio/iofwrite_u.c +++ b/libio/iofwrite_u.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1996-2000, 2002 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1996-2000, 2002, 2008 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 @@ -45,7 +45,11 @@ fwrite_unlocked (buf, size, count, fp) if (_IO_fwide (fp, -1) == -1) { written = _IO_sputn (fp, (const char *) buf, request); - if (written == request) + /* We have written all of the input in case the return value indicates + this or EOF is returned. The latter is a special case where we + simply did not manage to flush the buffer. But the data is in the + buffer and therefore written as far as fwrite is concerned. */ + if (written == request || written == EOF) return count; } diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c index f72516c87b..7af3b8aa92 100644 --- a/locale/programs/ld-collate.c +++ b/locale/programs/ld-collate.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2003, 2005, 2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1995-2003, 2005-2007, 2008 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -3195,6 +3195,14 @@ error while adding equivalent collating symbol")); break; case tok_script: + /* Ignore the rest of the line if we don't need the input of + this line. */ + if (ignore_content) + { + lr_ignore_rest (ldfile, 0); + break; + } + /* We get told about the scripts we know. */ arg = lr_token (ldfile, charmap, result, repertoire, verbose); if (arg->tok != tok_bsymbol) diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 5fda52a60d..63b0eab9c3 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,8 @@ +2007-11-26 Daniel Jacobowitz <dan@codesourcery.com> + + * pthread_create.c: Require pthread_mutex_trylock and + pthread_key_delete for libgcc. + 2008-04-08 Jakub Jelinek <jakub@redhat.com> [BZ #6020] diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index e08b76a9b8..5fcc72cfbc 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. +/* Copyright (C) 2002-2007, 2008 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -598,11 +598,13 @@ compat_symbol (libpthread, __pthread_create_2_0, pthread_create, /* If pthread_create is present, libgcc_eh.a and libsupc++.a expects some other POSIX thread functions to be present as well. */ PTHREAD_STATIC_FN_REQUIRE (pthread_mutex_lock) +PTHREAD_STATIC_FN_REQUIRE (pthread_mutex_trylock) PTHREAD_STATIC_FN_REQUIRE (pthread_mutex_unlock) PTHREAD_STATIC_FN_REQUIRE (pthread_once) PTHREAD_STATIC_FN_REQUIRE (pthread_cancel) PTHREAD_STATIC_FN_REQUIRE (pthread_key_create) +PTHREAD_STATIC_FN_REQUIRE (pthread_key_delete) PTHREAD_STATIC_FN_REQUIRE (pthread_setspecific) PTHREAD_STATIC_FN_REQUIRE (pthread_getspecific) diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c index 426007e1ad..852b58a7e5 100644 --- a/nss/nss_files/files-XXX.c +++ b/nss/nss_files/files-XXX.c @@ -259,7 +259,7 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer, status = internal_setent (0); - __set_errno (errno); + __set_errno (save_errno); if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0) { diff --git a/po/libc.pot b/po/libc.pot index 2919793be4..a4ae24fd1f 100644 --- a/po/libc.pot +++ b/po/libc.pot @@ -5,8 +5,8 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: libc 2.6.90\n" -"POT-Creation-Date: 2007-10-15 21:18-0700\n" +"Project-Id-Version: libc 2.7.90\n" +"POT-Creation-Date: 2008-04-09 08:07-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -129,7 +129,7 @@ msgid "" "[OUTPUT-FILE [INPUT-FILE]...]" msgstr "" -#: catgets/gencat.c:232 debug/pcprofiledump.c:204 iconv/iconv_prog.c:411 +#: catgets/gencat.c:232 debug/pcprofiledump.c:204 iconv/iconv_prog.c:408 #: iconv/iconvconfig.c:380 locale/programs/localedef.c:371 #: login/programs/pt_chown.c:88 malloc/memusagestat.c:526 nss/makedb.c:231 msgid "" @@ -138,7 +138,7 @@ msgid "" msgstr "" #: catgets/gencat.c:246 debug/xtrace.sh:64 elf/ldconfig.c:296 -#: elf/ldd.bash.in:39 elf/sprof.c:355 iconv/iconv_prog.c:426 +#: elf/ldd.bash.in:39 elf/sprof.c:355 iconv/iconv_prog.c:423 #: iconv/iconvconfig.c:395 locale/programs/locale.c:275 #: locale/programs/localedef.c:387 login/programs/pt_chown.c:59 #: malloc/memusage.sh:71 nscd/nscd.c:406 nss/getent.c:83 nss/makedb.c:245 @@ -151,7 +151,7 @@ msgid "" msgstr "" #: catgets/gencat.c:251 debug/xtrace.sh:68 elf/ldconfig.c:301 elf/sprof.c:361 -#: iconv/iconv_prog.c:431 iconv/iconvconfig.c:400 locale/programs/locale.c:280 +#: iconv/iconv_prog.c:428 iconv/iconvconfig.c:400 locale/programs/locale.c:280 #: locale/programs/localedef.c:392 malloc/memusage.sh:75 nscd/nscd.c:411 #: nss/getent.c:88 nss/makedb.c:250 posix/getconf.c:1017 #, c-format @@ -162,7 +162,7 @@ msgstr "" msgid "*standard input*" msgstr "" -#: catgets/gencat.c:288 iconv/iconv_charmap.c:158 iconv/iconv_prog.c:298 +#: catgets/gencat.c:288 iconv/iconv_charmap.c:170 iconv/iconv_prog.c:294 #: nss/makedb.c:170 #, c-format msgid "cannot open input file `%s'" @@ -351,7 +351,7 @@ msgstr "" msgid ", OS ABI: %s %d.%d.%d" msgstr "" -#: elf/cache.c:134 elf/ldconfig.c:1270 +#: elf/cache.c:134 elf/ldconfig.c:1269 #, c-format msgid "Can't open cache file %s\n" msgstr "" @@ -395,7 +395,7 @@ msgstr "" msgid "cannot create scope list" msgstr "" -#: elf/dl-close.c:724 +#: elf/dl-close.c:725 msgid "shared object not open" msgstr "" @@ -626,29 +626,29 @@ msgstr "" msgid "invalid target namespace in dlmopen()" msgstr "" -#: elf/dl-reloc.c:54 +#: elf/dl-reloc.c:56 msgid "cannot allocate memory in static TLS block" msgstr "" -#: elf/dl-reloc.c:196 +#: elf/dl-reloc.c:198 msgid "cannot make segment writable for relocation" msgstr "" -#: elf/dl-reloc.c:277 +#: elf/dl-reloc.c:281 #, c-format msgid "%s: no PLTREL found in object %s\n" msgstr "" -#: elf/dl-reloc.c:288 +#: elf/dl-reloc.c:292 #, c-format msgid "%s: out of memory to store relocation results for %s\n" msgstr "" -#: elf/dl-reloc.c:304 +#: elf/dl-reloc.c:308 msgid "cannot restore segment prot after reloc" msgstr "" -#: elf/dl-reloc.c:329 +#: elf/dl-reloc.c:333 msgid "cannot apply additional memory protection after relocation" msgstr "" @@ -656,11 +656,11 @@ msgstr "" msgid "RTLD_NEXT used in code not dynamically loaded" msgstr "" -#: elf/dl-sysdep.c:469 elf/dl-sysdep.c:481 +#: elf/dl-sysdep.c:475 elf/dl-sysdep.c:487 msgid "cannot create capability list" msgstr "" -#: elf/dl-tls.c:825 +#: elf/dl-tls.c:848 msgid "cannot create TLS data structures" msgstr "" @@ -873,17 +873,17 @@ msgstr "" msgid "%s:%u: cannot read directory %s" msgstr "" -#: elf/ldconfig.c:1223 +#: elf/ldconfig.c:1222 #, c-format msgid "relative path `%s' used to build cache" msgstr "" -#: elf/ldconfig.c:1249 +#: elf/ldconfig.c:1248 #, c-format msgid "Can't chdir to /" msgstr "" -#: elf/ldconfig.c:1291 +#: elf/ldconfig.c:1290 #, c-format msgid "Can't open cache file directory %s\n" msgstr "" @@ -1120,28 +1120,33 @@ msgstr "" msgid "cannot allocate symbol data" msgstr "" -#: iconv/iconv_charmap.c:176 iconv/iconv_prog.c:316 +#: iconv/iconv_charmap.c:142 iconv/iconv_prog.c:446 +#, c-format +msgid "cannot open output file" +msgstr "" + +#: iconv/iconv_charmap.c:188 iconv/iconv_prog.c:312 #, c-format msgid "error while closing input `%s'" msgstr "" -#: iconv/iconv_charmap.c:450 +#: iconv/iconv_charmap.c:462 #, c-format msgid "illegal input sequence at position %Zd" msgstr "" -#: iconv/iconv_charmap.c:469 iconv/iconv_prog.c:526 +#: iconv/iconv_charmap.c:481 iconv/iconv_prog.c:537 #, c-format msgid "incomplete character or shift sequence at end of buffer" msgstr "" -#: iconv/iconv_charmap.c:514 iconv/iconv_charmap.c:550 iconv/iconv_prog.c:569 -#: iconv/iconv_prog.c:605 +#: iconv/iconv_charmap.c:526 iconv/iconv_charmap.c:562 iconv/iconv_prog.c:580 +#: iconv/iconv_prog.c:616 #, c-format msgid "error while reading the input" msgstr "" -#: iconv/iconv_charmap.c:532 iconv/iconv_prog.c:587 +#: iconv/iconv_charmap.c:544 iconv/iconv_prog.c:598 #, c-format msgid "unable to allocate buffer for input" msgstr "" @@ -1194,62 +1199,57 @@ msgstr "" msgid "[FILE...]" msgstr "" -#: iconv/iconv_prog.c:200 -#, c-format -msgid "cannot open output file" -msgstr "" - -#: iconv/iconv_prog.c:242 +#: iconv/iconv_prog.c:234 #, c-format msgid "conversions from `%s' and to `%s' are not supported" msgstr "" -#: iconv/iconv_prog.c:247 +#: iconv/iconv_prog.c:239 #, c-format msgid "conversion from `%s' is not supported" msgstr "" -#: iconv/iconv_prog.c:254 +#: iconv/iconv_prog.c:246 #, c-format msgid "conversion to `%s' is not supported" msgstr "" -#: iconv/iconv_prog.c:258 +#: iconv/iconv_prog.c:250 #, c-format msgid "conversion from `%s' to `%s' is not supported" msgstr "" -#: iconv/iconv_prog.c:268 +#: iconv/iconv_prog.c:260 #, c-format msgid "failed to start conversion processing" msgstr "" -#: iconv/iconv_prog.c:362 +#: iconv/iconv_prog.c:358 #, c-format msgid "error while closing output file" msgstr "" -#: iconv/iconv_prog.c:471 iconv/iconv_prog.c:497 +#: iconv/iconv_prog.c:456 #, c-format msgid "conversion stopped due to problem in writing the output" msgstr "" -#: iconv/iconv_prog.c:522 +#: iconv/iconv_prog.c:533 #, c-format msgid "illegal input sequence at position %ld" msgstr "" -#: iconv/iconv_prog.c:530 +#: iconv/iconv_prog.c:541 #, c-format msgid "internal error (illegal descriptor)" msgstr "" -#: iconv/iconv_prog.c:533 +#: iconv/iconv_prog.c:544 #, c-format msgid "unknown iconv() error %d" msgstr "" -#: iconv/iconv_prog.c:779 +#: iconv/iconv_prog.c:790 msgid "" "The following list contain all the coded character sets known. This does\n" "not necessarily mean that all combinations of these names can be used for\n" @@ -1483,7 +1483,7 @@ msgid "no symbolic name given for end of range" msgstr "" #: locale/programs/charmap.c:610 locale/programs/ld-address.c:600 -#: locale/programs/ld-collate.c:2767 locale/programs/ld-collate.c:3924 +#: locale/programs/ld-collate.c:2767 locale/programs/ld-collate.c:3928 #: locale/programs/ld-ctype.c:2232 locale/programs/ld-ctype.c:2984 #: locale/programs/ld-identification.c:452 #: locale/programs/ld-measurement.c:238 locale/programs/ld-messages.c:332 @@ -1510,7 +1510,7 @@ msgid "%s: error in state machine" msgstr "" #: locale/programs/charmap.c:850 locale/programs/ld-address.c:616 -#: locale/programs/ld-collate.c:2764 locale/programs/ld-collate.c:4115 +#: locale/programs/ld-collate.c:2764 locale/programs/ld-collate.c:4121 #: locale/programs/ld-ctype.c:2229 locale/programs/ld-ctype.c:3001 #: locale/programs/ld-identification.c:468 #: locale/programs/ld-measurement.c:254 locale/programs/ld-messages.c:348 @@ -1534,7 +1534,7 @@ msgid "" "same: %d vs %d" msgstr "" -#: locale/programs/charmap.c:993 locale/programs/ld-collate.c:3047 +#: locale/programs/charmap.c:993 locale/programs/ld-collate.c:3045 #: locale/programs/repertoire.c:419 msgid "invalid names for character range" msgstr "" @@ -1643,7 +1643,7 @@ msgstr "" msgid "%s: unknown character in field `%s'" msgstr "" -#: locale/programs/ld-address.c:597 locale/programs/ld-collate.c:3922 +#: locale/programs/ld-address.c:597 locale/programs/ld-collate.c:3926 #: locale/programs/ld-ctype.c:2981 locale/programs/ld-identification.c:449 #: locale/programs/ld-measurement.c:235 locale/programs/ld-messages.c:330 #: locale/programs/ld-monetary.c:941 locale/programs/ld-name.c:305 @@ -1656,7 +1656,7 @@ msgstr "" #: locale/programs/ld-address.c:607 locale/programs/ld-collate.c:542 #: locale/programs/ld-collate.c:594 locale/programs/ld-collate.c:890 #: locale/programs/ld-collate.c:903 locale/programs/ld-collate.c:2733 -#: locale/programs/ld-collate.c:2754 locale/programs/ld-collate.c:4105 +#: locale/programs/ld-collate.c:2754 locale/programs/ld-collate.c:4111 #: locale/programs/ld-ctype.c:1960 locale/programs/ld-ctype.c:2219 #: locale/programs/ld-ctype.c:2806 locale/programs/ld-ctype.c:2992 #: locale/programs/ld-identification.c:459 @@ -1763,7 +1763,7 @@ msgstr "" msgid "`%s' and `%.*s' are not valid names for symbolic range" msgstr "" -#: locale/programs/ld-collate.c:1369 locale/programs/ld-collate.c:3858 +#: locale/programs/ld-collate.c:1369 locale/programs/ld-collate.c:3862 #, c-format msgid "%s: order for `%.*s' already defined at %s:%Zu" msgstr "" @@ -1804,7 +1804,7 @@ msgstr "" msgid "too many errors; giving up" msgstr "" -#: locale/programs/ld-collate.c:2659 locale/programs/ld-collate.c:4044 +#: locale/programs/ld-collate.c:2659 locale/programs/ld-collate.c:4050 #, c-format msgid "%s: nested conditionals not supported" msgstr "" @@ -1824,112 +1824,112 @@ msgstr "" msgid "%s: duplicate declaration of section `%s'" msgstr "" -#: locale/programs/ld-collate.c:3027 +#: locale/programs/ld-collate.c:3025 #, c-format msgid "%s: unknown character in collating symbol name" msgstr "" -#: locale/programs/ld-collate.c:3159 +#: locale/programs/ld-collate.c:3155 #, c-format msgid "%s: unknown character in equivalent definition name" msgstr "" -#: locale/programs/ld-collate.c:3172 +#: locale/programs/ld-collate.c:3168 #, c-format msgid "%s: unknown character in equivalent definition value" msgstr "" -#: locale/programs/ld-collate.c:3182 +#: locale/programs/ld-collate.c:3178 #, c-format msgid "%s: unknown symbol `%s' in equivalent definition" msgstr "" -#: locale/programs/ld-collate.c:3191 +#: locale/programs/ld-collate.c:3187 msgid "error while adding equivalent collating symbol" msgstr "" -#: locale/programs/ld-collate.c:3221 +#: locale/programs/ld-collate.c:3225 #, c-format msgid "duplicate definition of script `%s'" msgstr "" -#: locale/programs/ld-collate.c:3269 +#: locale/programs/ld-collate.c:3273 #, c-format msgid "%s: unknown section name `%.*s'" msgstr "" -#: locale/programs/ld-collate.c:3298 +#: locale/programs/ld-collate.c:3302 #, c-format msgid "%s: multiple order definitions for section `%s'" msgstr "" -#: locale/programs/ld-collate.c:3326 +#: locale/programs/ld-collate.c:3330 #, c-format msgid "%s: invalid number of sorting rules" msgstr "" -#: locale/programs/ld-collate.c:3353 +#: locale/programs/ld-collate.c:3357 #, c-format msgid "%s: multiple order definitions for unnamed section" msgstr "" -#: locale/programs/ld-collate.c:3407 locale/programs/ld-collate.c:3537 -#: locale/programs/ld-collate.c:3900 +#: locale/programs/ld-collate.c:3411 locale/programs/ld-collate.c:3541 +#: locale/programs/ld-collate.c:3904 #, c-format msgid "%s: missing `order_end' keyword" msgstr "" -#: locale/programs/ld-collate.c:3470 +#: locale/programs/ld-collate.c:3474 #, c-format msgid "%s: order for collating symbol %.*s not yet defined" msgstr "" -#: locale/programs/ld-collate.c:3488 +#: locale/programs/ld-collate.c:3492 #, c-format msgid "%s: order for collating element %.*s not yet defined" msgstr "" -#: locale/programs/ld-collate.c:3499 +#: locale/programs/ld-collate.c:3503 #, c-format msgid "%s: cannot reorder after %.*s: symbol not known" msgstr "" -#: locale/programs/ld-collate.c:3551 locale/programs/ld-collate.c:3912 +#: locale/programs/ld-collate.c:3555 locale/programs/ld-collate.c:3916 #, c-format msgid "%s: missing `reorder-end' keyword" msgstr "" -#: locale/programs/ld-collate.c:3585 locale/programs/ld-collate.c:3783 +#: locale/programs/ld-collate.c:3589 locale/programs/ld-collate.c:3787 #, c-format msgid "%s: section `%.*s' not known" msgstr "" -#: locale/programs/ld-collate.c:3650 +#: locale/programs/ld-collate.c:3654 #, c-format msgid "%s: bad symbol <%.*s>" msgstr "" -#: locale/programs/ld-collate.c:3846 +#: locale/programs/ld-collate.c:3850 #, c-format msgid "%s: cannot have `%s' as end of ellipsis range" msgstr "" -#: locale/programs/ld-collate.c:3896 +#: locale/programs/ld-collate.c:3900 #, c-format msgid "%s: empty category description not allowed" msgstr "" -#: locale/programs/ld-collate.c:3915 +#: locale/programs/ld-collate.c:3919 #, c-format msgid "%s: missing `reorder-sections-end' keyword" msgstr "" -#: locale/programs/ld-collate.c:4077 +#: locale/programs/ld-collate.c:4083 #, c-format msgid "%s: '%s' without matching 'ifdef' or 'ifndef'" msgstr "" -#: locale/programs/ld-collate.c:4095 +#: locale/programs/ld-collate.c:4101 #, c-format msgid "%s: 'endif' without matching 'ifdef' or 'ifndef'" msgstr "" @@ -2260,7 +2260,7 @@ msgstr "" msgid "%s: starting date is invalid in string %Zd in `era' field" msgstr "" -#: locale/programs/ld-time.c:407 +#: locale/programs/ld-time.c:407 locale/programs/ld-time.c:435 #, c-format msgid "%s: invalid stopping date in string %Zd in `era' field" msgstr "" @@ -2270,11 +2270,6 @@ msgstr "" msgid "%s: garbage at end of stopping date in string %Zd in `era' field" msgstr "" -#: locale/programs/ld-time.c:435 -#, c-format -msgid "%s: stopping date is invalid in string %Zd in `era' field" -msgstr "" - #: locale/programs/ld-time.c:444 #, c-format msgid "%s: missing era name in string %Zd in `era' field" @@ -2686,7 +2681,7 @@ msgid "cannot create output file `%s' for category `%s'" msgstr "" #: locale/programs/locfile.c:782 -msgid "expect string argument for `copy'" +msgid "expecting string argument for `copy'" msgstr "" #: locale/programs/locfile.c:786 @@ -3503,251 +3498,265 @@ msgstr "" msgid "yp_update: cannot get server address\n" msgstr "" -#: nscd/aicache.c:77 nscd/hstcache.c:468 +#: nscd/aicache.c:77 nscd/hstcache.c:473 #, c-format msgid "Haven't found \"%s\" in hosts cache!" msgstr "" -#: nscd/aicache.c:79 nscd/hstcache.c:470 +#: nscd/aicache.c:79 nscd/hstcache.c:475 #, c-format msgid "Reloading \"%s\" in hosts cache!" msgstr "" -#: nscd/cache.c:146 +#: nscd/cache.c:150 #, c-format msgid "add new entry \"%s\" of type %s for %s to cache%s" msgstr "" -#: nscd/cache.c:148 +#: nscd/cache.c:152 msgid " (first)" msgstr "" -#: nscd/cache.c:256 nscd/connections.c:810 +#: nscd/cache.c:263 nscd/connections.c:811 #, c-format msgid "cannot stat() file `%s': %s" msgstr "" -#: nscd/cache.c:285 +#: nscd/cache.c:305 #, c-format msgid "pruning %s cache; time %ld" msgstr "" -#: nscd/cache.c:312 +#: nscd/cache.c:334 #, c-format msgid "considering %s entry \"%s\", timeout %<PRIu64>" msgstr "" -#: nscd/connections.c:521 nscd/connections.c:533 nscd/connections.c:545 -#: nscd/connections.c:564 +#: nscd/connections.c:527 #, c-format msgid "invalid persistent database file \"%s\": %s" msgstr "" #: nscd/connections.c:535 +msgid "uninitialized header" +msgstr "" + +#: nscd/connections.c:540 msgid "header size does not match" msgstr "" -#: nscd/connections.c:547 +#: nscd/connections.c:550 msgid "file size does not match" msgstr "" -#: nscd/connections.c:566 +#: nscd/connections.c:567 msgid "verification failed" msgstr "" -#: nscd/connections.c:580 +#: nscd/connections.c:581 #, c-format msgid "" "suggested size of table for database %s larger than the persistent " "database's table" msgstr "" -#: nscd/connections.c:591 nscd/connections.c:673 +#: nscd/connections.c:592 nscd/connections.c:674 #, c-format msgid "cannot create read-only descriptor for \"%s\"; no mmap" msgstr "" -#: nscd/connections.c:652 +#: nscd/connections.c:653 #, c-format msgid "" "database for %s corrupted or simultaneously used; remove %s manually if " "necessary and restart" msgstr "" -#: nscd/connections.c:659 +#: nscd/connections.c:660 #, c-format msgid "cannot create %s; no persistent database used" msgstr "" -#: nscd/connections.c:662 +#: nscd/connections.c:663 #, c-format msgid "cannot create %s; no sharing possible" msgstr "" -#: nscd/connections.c:733 +#: nscd/connections.c:734 #, c-format msgid "cannot write to database file %s: %s" msgstr "" -#: nscd/connections.c:772 +#: nscd/connections.c:773 #, c-format msgid "cannot set socket to close on exec: %s; disabling paranoia mode" msgstr "" -#: nscd/connections.c:823 +#: nscd/connections.c:824 #, c-format msgid "cannot open socket: %s" msgstr "" -#: nscd/connections.c:840 +#: nscd/connections.c:841 #, c-format msgid "cannot change socket to nonblocking mode: %s" msgstr "" -#: nscd/connections.c:848 +#: nscd/connections.c:849 #, c-format msgid "cannot set socket to close on exec: %s" msgstr "" -#: nscd/connections.c:859 +#: nscd/connections.c:860 #, c-format msgid "cannot enable socket to accept connections: %s" msgstr "" -#: nscd/connections.c:955 +#: nscd/connections.c:960 #, c-format msgid "provide access to FD %d, for %s" msgstr "" -#: nscd/connections.c:967 +#: nscd/connections.c:972 #, c-format msgid "cannot handle old request version %d; current version is %d" msgstr "" -#: nscd/connections.c:1009 nscd/connections.c:1062 +#: nscd/connections.c:982 +msgid "request not handled due to missing permission" +msgstr "" + +#: nscd/connections.c:1018 nscd/connections.c:1071 #, c-format msgid "cannot write result: %s" msgstr "" -#: nscd/connections.c:1145 +#: nscd/connections.c:1154 #, c-format msgid "error getting caller's id: %s" msgstr "" -#: nscd/connections.c:1204 +#: nscd/connections.c:1213 #, c-format msgid "cannot open /proc/self/cmdline: %s; disabling paranoia mode" msgstr "" -#: nscd/connections.c:1218 +#: nscd/connections.c:1227 #, c-format msgid "cannot read /proc/self/cmdline: %s; disabling paranoia mode" msgstr "" -#: nscd/connections.c:1258 +#: nscd/connections.c:1267 #, c-format msgid "cannot change to old UID: %s; disabling paranoia mode" msgstr "" -#: nscd/connections.c:1268 +#: nscd/connections.c:1277 #, c-format msgid "cannot change to old GID: %s; disabling paranoia mode" msgstr "" -#: nscd/connections.c:1281 +#: nscd/connections.c:1290 #, c-format msgid "cannot change to old working directory: %s; disabling paranoia mode" msgstr "" -#: nscd/connections.c:1310 +#: nscd/connections.c:1319 #, c-format msgid "re-exec failed: %s; disabling paranoia mode" msgstr "" -#: nscd/connections.c:1319 +#: nscd/connections.c:1328 #, c-format msgid "cannot change current working directory to \"/\": %s" msgstr "" -#: nscd/connections.c:1437 +#: nscd/connections.c:1471 #, c-format msgid "short read while reading request: %s" msgstr "" -#: nscd/connections.c:1468 +#: nscd/connections.c:1502 #, c-format msgid "key length in request too long: %d" msgstr "" -#: nscd/connections.c:1481 +#: nscd/connections.c:1515 #, c-format msgid "short read while reading request key: %s" msgstr "" -#: nscd/connections.c:1490 +#: nscd/connections.c:1524 #, c-format msgid "handle_request: request received (Version = %d) from PID %ld" msgstr "" -#: nscd/connections.c:1495 +#: nscd/connections.c:1529 #, c-format msgid "handle_request: request received (Version = %d)" msgstr "" -#: nscd/connections.c:1856 -#, c-format -msgid "could only start %d threads; terminating" +#: nscd/connections.c:1866 +msgid "could not initialize conditional variable" msgstr "" -#: nscd/connections.c:1904 nscd/connections.c:1905 nscd/connections.c:1922 -#: nscd/connections.c:1931 nscd/connections.c:1949 nscd/connections.c:1960 -#: nscd/connections.c:1971 +#: nscd/connections.c:1874 +msgid "could not start clean-up thread; terminating" +msgstr "" + +#: nscd/connections.c:1888 +msgid "could not start any worker thread; terminating" +msgstr "" + +#: nscd/connections.c:1939 nscd/connections.c:1940 nscd/connections.c:1957 +#: nscd/connections.c:1966 nscd/connections.c:1984 nscd/connections.c:1995 +#: nscd/connections.c:2006 #, c-format msgid "Failed to run nscd as user '%s'" msgstr "" -#: nscd/connections.c:1923 +#: nscd/connections.c:1958 #, c-format msgid "initial getgrouplist failed" msgstr "" -#: nscd/connections.c:1932 +#: nscd/connections.c:1967 #, c-format msgid "getgrouplist failed" msgstr "" -#: nscd/connections.c:1950 +#: nscd/connections.c:1985 #, c-format msgid "setgroups failed" msgstr "" -#: nscd/grpcache.c:402 nscd/hstcache.c:418 nscd/initgrcache.c:412 -#: nscd/pwdcache.c:397 nscd/servicescache.c:343 +#: nscd/grpcache.c:404 nscd/hstcache.c:422 nscd/initgrcache.c:414 +#: nscd/pwdcache.c:399 nscd/servicescache.c:345 #, c-format msgid "short write in %s: %s" msgstr "" -#: nscd/grpcache.c:445 nscd/initgrcache.c:78 +#: nscd/grpcache.c:447 nscd/initgrcache.c:78 #, c-format msgid "Haven't found \"%s\" in group cache!" msgstr "" -#: nscd/grpcache.c:447 nscd/initgrcache.c:80 +#: nscd/grpcache.c:449 nscd/initgrcache.c:80 #, c-format msgid "Reloading \"%s\" in group cache!" msgstr "" -#: nscd/grpcache.c:524 +#: nscd/grpcache.c:526 #, c-format msgid "Invalid numeric gid \"%s\"!" msgstr "" -#: nscd/mem.c:383 +#: nscd/mem.c:422 #, c-format msgid "freed %zu bytes in %s cache" msgstr "" -#: nscd/mem.c:512 +#: nscd/mem.c:557 #, c-format msgid "no more memory for database '%s'" msgstr "" @@ -3773,7 +3782,7 @@ msgid "Shut the server down" msgstr "" #: nscd/nscd.c:103 -msgid "Print current configuration statistic" +msgid "Print current configuration statistics" msgstr "" #: nscd/nscd.c:104 @@ -3860,37 +3869,37 @@ msgstr "" msgid "Parse error: %s" msgstr "" -#: nscd/nscd_conf.c:193 +#: nscd/nscd_conf.c:194 #, c-format msgid "Must specify user name for server-user option" msgstr "" -#: nscd/nscd_conf.c:200 +#: nscd/nscd_conf.c:201 #, c-format msgid "Must specify user name for stat-user option" msgstr "" -#: nscd/nscd_conf.c:244 +#: nscd/nscd_conf.c:245 #, c-format msgid "invalid value for 'reload-count': %u" msgstr "" -#: nscd/nscd_conf.c:259 +#: nscd/nscd_conf.c:260 #, c-format msgid "Must specify value for restart-interval option" msgstr "" -#: nscd/nscd_conf.c:273 +#: nscd/nscd_conf.c:274 #, c-format msgid "Unknown option: %s %s %s" msgstr "" -#: nscd/nscd_conf.c:286 +#: nscd/nscd_conf.c:287 #, c-format msgid "cannot get current working directory: %s; disabling paranoia mode" msgstr "" -#: nscd/nscd_conf.c:306 +#: nscd/nscd_conf.c:307 #, c-format msgid "maximum file size for %s database too small" msgstr "" @@ -3989,17 +3998,17 @@ msgid "" "%15s check /etc/%s for changes\n" msgstr "" -#: nscd/pwdcache.c:440 +#: nscd/pwdcache.c:442 #, c-format msgid "Haven't found \"%s\" in password cache!" msgstr "" -#: nscd/pwdcache.c:442 +#: nscd/pwdcache.c:444 #, c-format msgid "Reloading \"%s\" in password cache!" msgstr "" -#: nscd/pwdcache.c:520 +#: nscd/pwdcache.c:522 #, c-format msgid "Invalid numeric uid \"%s\"!" msgstr "" @@ -4075,7 +4084,11 @@ msgstr "" msgid "Error getting sid from context" msgstr "" -#: nscd/selinux.c:399 +#: nscd/selinux.c:374 +msgid "compile-time support for database policy missing" +msgstr "" + +#: nscd/selinux.c:407 #, c-format msgid "" "\n" @@ -4091,12 +4104,12 @@ msgid "" "%15u CAV misses\n" msgstr "" -#: nscd/servicescache.c:390 +#: nscd/servicescache.c:392 #, c-format msgid "Haven't found \"%s\" in services cache!" msgstr "" -#: nscd/servicescache.c:392 +#: nscd/servicescache.c:394 #, c-format msgid "Reloading \"%s\" in services cache!" msgstr "" @@ -4220,61 +4233,56 @@ msgstr "" msgid "Unrecognized variable `%s'" msgstr "" -#: posix/getopt.c:571 posix/getopt.c:587 -#, c-format -msgid "%s: option `%s' is ambiguous\n" -msgstr "" - -#: posix/getopt.c:620 posix/getopt.c:624 +#: posix/getopt.c:570 posix/getopt.c:586 #, c-format -msgid "%s: option `--%s' doesn't allow an argument\n" +msgid "%s: option '%s' is ambiguous\n" msgstr "" -#: posix/getopt.c:633 posix/getopt.c:638 +#: posix/getopt.c:619 posix/getopt.c:623 #, c-format -msgid "%s: option `%c%s' doesn't allow an argument\n" +msgid "%s: option '--%s' doesn't allow an argument\n" msgstr "" -#: posix/getopt.c:681 posix/getopt.c:700 posix/getopt.c:1016 -#: posix/getopt.c:1035 +#: posix/getopt.c:632 posix/getopt.c:637 #, c-format -msgid "%s: option `%s' requires an argument\n" +msgid "%s: option '%c%s' doesn't allow an argument\n" msgstr "" -#: posix/getopt.c:738 posix/getopt.c:741 +#: posix/getopt.c:680 posix/getopt.c:699 posix/getopt.c:1002 +#: posix/getopt.c:1021 #, c-format -msgid "%s: unrecognized option `--%s'\n" +msgid "%s: option '%s' requires an argument\n" msgstr "" -#: posix/getopt.c:749 posix/getopt.c:752 +#: posix/getopt.c:737 posix/getopt.c:740 #, c-format -msgid "%s: unrecognized option `%c%s'\n" +msgid "%s: unrecognized option '--%s'\n" msgstr "" -#: posix/getopt.c:804 posix/getopt.c:807 +#: posix/getopt.c:748 posix/getopt.c:751 #, c-format -msgid "%s: illegal option -- %c\n" +msgid "%s: unrecognized option '%c%s'\n" msgstr "" -#: posix/getopt.c:813 posix/getopt.c:816 +#: posix/getopt.c:800 posix/getopt.c:803 #, c-format -msgid "%s: invalid option -- %c\n" +msgid "%s: invalid option -- '%c'\n" msgstr "" -#: posix/getopt.c:868 posix/getopt.c:884 posix/getopt.c:1088 -#: posix/getopt.c:1106 +#: posix/getopt.c:853 posix/getopt.c:870 posix/getopt.c:1073 +#: posix/getopt.c:1091 #, c-format -msgid "%s: option requires an argument -- %c\n" +msgid "%s: option requires an argument -- '%c'\n" msgstr "" -#: posix/getopt.c:937 posix/getopt.c:953 +#: posix/getopt.c:923 posix/getopt.c:939 #, c-format -msgid "%s: option `-W %s' is ambiguous\n" +msgid "%s: option '-W %s' is ambiguous\n" msgstr "" -#: posix/getopt.c:977 posix/getopt.c:995 +#: posix/getopt.c:963 posix/getopt.c:981 #, c-format -msgid "%s: option `-W %s' doesn't allow an argument\n" +msgid "%s: option '-W %s' doesn't allow an argument\n" msgstr "" #: posix/regcomp.c:135 @@ -4429,133 +4437,138 @@ msgstr "" msgid "Unknown signal %d" msgstr "" -#: sunrpc/auth_unix.c:114 -msgid "authunix_create: out of memory\n" +#: sunrpc/auth_unix.c:114 sunrpc/clnt_tcp.c:131 sunrpc/clnt_udp.c:140 +#: sunrpc/clnt_unix.c:128 sunrpc/svc_tcp.c:179 sunrpc/svc_tcp.c:218 +#: sunrpc/svc_udp.c:153 sunrpc/svc_unix.c:176 sunrpc/svc_unix.c:215 +#: sunrpc/xdr.c:566 sunrpc/xdr.c:718 sunrpc/xdr_array.c:106 +#: sunrpc/xdr_rec.c:156 sunrpc/xdr_ref.c:85 +msgid "out of memory\n" msgstr "" #: sunrpc/auth_unix.c:350 msgid "auth_unix.c: Fatal marshalling problem" msgstr "" -#: sunrpc/clnt_perr.c:118 sunrpc/clnt_perr.c:139 +#: sunrpc/clnt_perr.c:105 sunrpc/clnt_perr.c:121 #, c-format -msgid "; low version = %lu, high version = %lu" +msgid "%s: %s; low version = %lu, high version = %lu" msgstr "" -#: sunrpc/clnt_perr.c:125 -msgid "; why = " +#: sunrpc/clnt_perr.c:112 +#, c-format +msgid "%s: %s; why = %s\n" msgstr "" -#: sunrpc/clnt_perr.c:132 +#: sunrpc/clnt_perr.c:114 #, c-format -msgid "(unknown authentication error - %d)" +msgid "%s: %s; why = (unknown authentication error - %d)\n" msgstr "" -#: sunrpc/clnt_perr.c:172 +#: sunrpc/clnt_perr.c:159 msgid "RPC: Success" msgstr "" -#: sunrpc/clnt_perr.c:175 +#: sunrpc/clnt_perr.c:162 msgid "RPC: Can't encode arguments" msgstr "" -#: sunrpc/clnt_perr.c:179 +#: sunrpc/clnt_perr.c:166 msgid "RPC: Can't decode result" msgstr "" -#: sunrpc/clnt_perr.c:183 +#: sunrpc/clnt_perr.c:170 msgid "RPC: Unable to send" msgstr "" -#: sunrpc/clnt_perr.c:187 +#: sunrpc/clnt_perr.c:174 msgid "RPC: Unable to receive" msgstr "" -#: sunrpc/clnt_perr.c:191 +#: sunrpc/clnt_perr.c:178 msgid "RPC: Timed out" msgstr "" -#: sunrpc/clnt_perr.c:195 +#: sunrpc/clnt_perr.c:182 msgid "RPC: Incompatible versions of RPC" msgstr "" -#: sunrpc/clnt_perr.c:199 +#: sunrpc/clnt_perr.c:186 msgid "RPC: Authentication error" msgstr "" -#: sunrpc/clnt_perr.c:203 +#: sunrpc/clnt_perr.c:190 msgid "RPC: Program unavailable" msgstr "" -#: sunrpc/clnt_perr.c:207 +#: sunrpc/clnt_perr.c:194 msgid "RPC: Program/version mismatch" msgstr "" -#: sunrpc/clnt_perr.c:211 +#: sunrpc/clnt_perr.c:198 msgid "RPC: Procedure unavailable" msgstr "" -#: sunrpc/clnt_perr.c:215 +#: sunrpc/clnt_perr.c:202 msgid "RPC: Server can't decode arguments" msgstr "" -#: sunrpc/clnt_perr.c:219 +#: sunrpc/clnt_perr.c:206 msgid "RPC: Remote system error" msgstr "" -#: sunrpc/clnt_perr.c:223 +#: sunrpc/clnt_perr.c:210 msgid "RPC: Unknown host" msgstr "" -#: sunrpc/clnt_perr.c:227 +#: sunrpc/clnt_perr.c:214 msgid "RPC: Unknown protocol" msgstr "" -#: sunrpc/clnt_perr.c:231 +#: sunrpc/clnt_perr.c:218 msgid "RPC: Port mapper failure" msgstr "" -#: sunrpc/clnt_perr.c:235 +#: sunrpc/clnt_perr.c:222 msgid "RPC: Program not registered" msgstr "" -#: sunrpc/clnt_perr.c:239 +#: sunrpc/clnt_perr.c:226 msgid "RPC: Failed (unspecified error)" msgstr "" -#: sunrpc/clnt_perr.c:280 +#: sunrpc/clnt_perr.c:267 msgid "RPC: (unknown error code)" msgstr "" -#: sunrpc/clnt_perr.c:342 +#: sunrpc/clnt_perr.c:330 msgid "Authentication OK" msgstr "" -#: sunrpc/clnt_perr.c:345 +#: sunrpc/clnt_perr.c:333 msgid "Invalid client credential" msgstr "" -#: sunrpc/clnt_perr.c:349 +#: sunrpc/clnt_perr.c:337 msgid "Server rejected credential" msgstr "" -#: sunrpc/clnt_perr.c:353 +#: sunrpc/clnt_perr.c:341 msgid "Invalid client verifier" msgstr "" -#: sunrpc/clnt_perr.c:357 +#: sunrpc/clnt_perr.c:345 msgid "Server rejected verifier" msgstr "" -#: sunrpc/clnt_perr.c:361 +#: sunrpc/clnt_perr.c:349 msgid "Client credential too weak" msgstr "" -#: sunrpc/clnt_perr.c:365 +#: sunrpc/clnt_perr.c:353 msgid "Invalid server verifier" msgstr "" -#: sunrpc/clnt_perr.c:369 +#: sunrpc/clnt_perr.c:357 msgid "Failed (unspecified error)" msgstr "" @@ -4563,18 +4576,6 @@ msgstr "" msgid "clnt_raw.c: fatal header serialization error" msgstr "" -#: sunrpc/clnt_tcp.c:131 -msgid "clnttcp_create: out of memory\n" -msgstr "" - -#: sunrpc/clnt_udp.c:139 -msgid "clntudp_create: out of memory\n" -msgstr "" - -#: sunrpc/clnt_unix.c:128 -msgid "clntunix_create: out of memory\n" -msgstr "" - #: sunrpc/pm_getmaps.c:83 msgid "pmap_getmaps.c: rpc problem" msgstr "" @@ -4859,14 +4860,6 @@ msgstr "" msgid "svc_tcp.c - cannot getsockname or listen" msgstr "" -#: sunrpc/svc_tcp.c:179 -msgid "svctcp_create: out of memory\n" -msgstr "" - -#: sunrpc/svc_tcp.c:218 -msgid "svc_tcp: makefd_xprt: out of memory\n" -msgstr "" - #: sunrpc/svc_udp.c:128 msgid "svcudp_create: socket creation problem" msgstr "" @@ -4875,39 +4868,35 @@ msgstr "" msgid "svcudp_create - cannot getsockname" msgstr "" -#: sunrpc/svc_udp.c:152 -msgid "svcudp_create: out of memory\n" -msgstr "" - -#: sunrpc/svc_udp.c:174 +#: sunrpc/svc_udp.c:175 msgid "svcudp_create: xp_pad is too small for IP_PKTINFO\n" msgstr "" -#: sunrpc/svc_udp.c:474 +#: sunrpc/svc_udp.c:475 msgid "enablecache: cache already enabled" msgstr "" -#: sunrpc/svc_udp.c:480 +#: sunrpc/svc_udp.c:481 msgid "enablecache: could not allocate cache" msgstr "" -#: sunrpc/svc_udp.c:489 +#: sunrpc/svc_udp.c:490 msgid "enablecache: could not allocate cache data" msgstr "" -#: sunrpc/svc_udp.c:497 +#: sunrpc/svc_udp.c:498 msgid "enablecache: could not allocate cache fifo" msgstr "" -#: sunrpc/svc_udp.c:532 +#: sunrpc/svc_udp.c:533 msgid "cache_set: victim not found" msgstr "" -#: sunrpc/svc_udp.c:543 +#: sunrpc/svc_udp.c:544 msgid "cache_set: victim alloc failed" msgstr "" -#: sunrpc/svc_udp.c:550 +#: sunrpc/svc_udp.c:551 msgid "cache_set: could not allocate new rpc_buffer" msgstr "" @@ -4919,34 +4908,6 @@ msgstr "" msgid "svc_unix.c - cannot getsockname or listen" msgstr "" -#: sunrpc/svc_unix.c:176 -msgid "svcunix_create: out of memory\n" -msgstr "" - -#: sunrpc/svc_unix.c:215 -msgid "svc_unix: makefd_xprt: out of memory\n" -msgstr "" - -#: sunrpc/xdr.c:566 -msgid "xdr_bytes: out of memory\n" -msgstr "" - -#: sunrpc/xdr.c:718 -msgid "xdr_string: out of memory\n" -msgstr "" - -#: sunrpc/xdr_array.c:106 -msgid "xdr_array: out of memory\n" -msgstr "" - -#: sunrpc/xdr_rec.c:156 -msgid "xdrrec_create: out of memory\n" -msgstr "" - -#: sunrpc/xdr_ref.c:86 -msgid "xdr_reference: out of memory\n" -msgstr "" - #: sysdeps/generic/siglist.h:29 sysdeps/unix/siglist.c:27 msgid "Hangup" msgstr "" diff --git a/scripts/abi-versions.awk b/scripts/abi-versions.awk index ab98d78e54..06fa14833c 100644 --- a/scripts/abi-versions.awk +++ b/scripts/abi-versions.awk @@ -30,6 +30,9 @@ $2 == "=" { printf "#define ABI_%s_%s\tABI_%s_%s\n", libid, oldid, libid, newid; printf "#define VERSION_%s_%s\t%s\n", libid, oldid, new; + + if ("GLIBC_" oldest_abi == old) + oldest_abi = "default"; next; } diff --git a/stdlib/tst-makecontext.c b/stdlib/tst-makecontext.c index 1451efa56e..00f8f1990e 100644 --- a/stdlib/tst-makecontext.c +++ b/stdlib/tst-makecontext.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2006, 2007, 2008 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 @@ -25,10 +25,13 @@ ucontext_t ucp; char st1[8192]; __thread int thr; +int somevar = -76; +long othervar = -78L; + void cf (int i) { - if (i != 78 || thr != 94) + if (i != othervar || thr != 94) { printf ("i %d thr %d\n", i, thr); exit (1); @@ -54,7 +57,7 @@ do_test (void) ucp.uc_link = NULL; ucp.uc_stack.ss_sp = st1; ucp.uc_stack.ss_size = sizeof st1; - makecontext (&ucp, (void (*) (void)) cf, 1, 78); + makecontext (&ucp, (void (*) (void)) cf, 1, somevar - 2); if (setcontext (&ucp) != 0) { puts ("setcontext failed"); diff --git a/sysdeps/i386/i686/memcpy.S b/sysdeps/i386/i686/memcpy.S index 00e84ec2e5..ff5c66e9d4 100644 --- a/sysdeps/i386/i686/memcpy.S +++ b/sysdeps/i386/i686/memcpy.S @@ -1,7 +1,7 @@ /* Copy memory block and return pointer to beginning of destination block For Intel 80x86, x>=6. This file is part of the GNU C Library. - Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2003, 2004, 2008 Free Software Foundation, Inc. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. The GNU C Library is free software; you can redistribute it and/or @@ -41,29 +41,64 @@ END (__memcpy_chk) ENTRY (BP_SYM (memcpy)) ENTER - movl LEN(%esp), %ecx movl %edi, %eax movl DEST(%esp), %edi movl %esi, %edx movl SRC(%esp), %esi - CHECK_BOUNDS_BOTH_WIDE (%edi, DEST(%esp), %ecx) - CHECK_BOUNDS_BOTH_WIDE (%esi, SRC(%esp), %ecx) + movl %edi, %ecx + xorl %esi, %ecx + andl $3, %ecx + movl LEN(%esp), %ecx cld - shrl $1, %ecx - jnc 1f + jne .Lunaligned + + cmpl $3, %ecx + jbe .Lunaligned + + testl $3, %esi + je 1f movsb -1: shrl $1, %ecx - jnc 2f - movsw -2: rep + decl %ecx + testl $3, %esi + je 1f + movsb + decl %ecx + testl $3, %esi + je 1f + movsb + decl %ecx +1: pushl %eax + movl %ecx, %eax + shrl $2, %ecx + rep movsl - movl %eax, %edi + movl %eax, %ecx + andl $3, %ecx + rep + movsb + popl %eax + +.Lend: movl %eax, %edi movl %edx, %esi movl DEST(%esp), %eax RETURN_BOUNDED_POINTER (DEST(%esp)) LEAVE RET_PTR + + /* When we come here the pointers do not have the same + alignment or the length is too short. No need to optimize for + aligned memory accesses. */ +.Lunaligned: + shrl $1, %ecx + jnc 1f + movsb +1: shrl $1, %ecx + jnc 2f + movsw +2: rep + movsl + jmp .Lend END (BP_SYM (memcpy)) libc_hidden_builtin_def (memcpy) diff --git a/sysdeps/ieee754/ldbl-128/e_lgammal_r.c b/sysdeps/ieee754/ldbl-128/e_lgammal_r.c index b9302974c0..d080448476 100644 --- a/sysdeps/ieee754/ldbl-128/e_lgammal_r.c +++ b/sysdeps/ieee754/ldbl-128/e_lgammal_r.c @@ -772,6 +772,12 @@ __ieee754_lgammal_r (x, signgamp) if (! __finitel (x)) return x * x; + if (x == 0.0L) + { + if (__signbitl (x)) + *signgamp = -1; + } + if (x < 0.0L) { q = -x; diff --git a/sysdeps/powerpc/fpu/Makefile b/sysdeps/powerpc/fpu/Makefile index 060c952d15..ce67ff87df 100644 --- a/sysdeps/powerpc/fpu/Makefile +++ b/sysdeps/powerpc/fpu/Makefile @@ -1,5 +1,6 @@ ifeq ($(subdir),math) libm-support += fenv_const fe_nomask fe_mask t_sqrt +libm-tests += test-powerpc-snan # libm needs ld.so to access dl_hwcap $(objpfx)libm.so: $(elfobjdir)/ld.so diff --git a/sysdeps/powerpc/fpu/test-powerpc-snan.c b/sysdeps/powerpc/fpu/test-powerpc-snan.c new file mode 100644 index 0000000000..93b212abcb --- /dev/null +++ b/sysdeps/powerpc/fpu/test-powerpc-snan.c @@ -0,0 +1,385 @@ +/* Test Signalling NaN in isnan, isinf etc functions. + Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger <aj@suse.de>, 2005. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#define _GNU_SOURCE +#define __USE_GNU +#include <stdio.h> +#include <stdlib.h> +#include <sys/time.h> +#include <string.h> +#include <math.h> +#include <float.h> +#include <fenv.h> +#include <signal.h> +#include <setjmp.h> +#include <errno.h> + +int dest_offset; +char *dest_address; +double value = 123.456; +double zero = 0.0; + +float SNANf; +double SNAN; +long double SNANl; + +static sigjmp_buf sigfpe_buf; + +void +init_signaling_nan() +{ + union { + double _ld16; + double _d8; + unsigned int _ui4[4]; + float _f4; + } nan_temp; + + nan_temp._ui4[0] = 0x7fa00000; + SNANf = nan_temp._f4; + + nan_temp._ui4[0] = 0x7ff40000; + nan_temp._ui4[1] = 0x00000000; + SNAN = nan_temp._d8; + + nan_temp._ui4[0] = 0x7ff40000; + nan_temp._ui4[1] = 0x00000000; + nan_temp._ui4[2] = 0x00000000; + nan_temp._ui4[3] = 0x00000000; + SNANl = nan_temp._ld16; +} + +static float +snan_float (void) +{ + return SNANf; +} + +static double +snan_double (void) +{ + return SNAN; +} + +typedef long double ldouble; + +static ldouble +snan_ldouble (void) +{ + return SNANl; +} + + +void +myFPsighandler(int signal, + siginfo_t *info, + void *context) +{ + siglongjmp(sigfpe_buf, 0); +} + +int +set_sigaction_FP(void) +{ + struct sigaction sa; + /* register RT signal handler via sigaction */ + sa.sa_flags = SA_SIGINFO; + sa.sa_sigaction = &myFPsighandler; + sigemptyset(&sa.sa_mask); + sigaction(SIGFPE, &sa, NULL); + + return 0; +} + +int +remove_sigaction_FP(void) +{ + struct sigaction sa; + /* restore default RT signal handler via sigaction */ + sa.sa_flags = SA_SIGINFO; + sa.sa_handler = SIG_DFL; + sigemptyset(&sa.sa_mask); + sigaction(SIGFPE, &sa, NULL); + + return 0; +} + +static int errors = 0; + +static void +check (const char *testname, int result) +{ + if (!result) { + printf ("Failure: %s\n", testname); + errors++; + } +} + +#define TEST_FUNC(NAME, FLOAT) \ +static void \ +NAME (void) \ +{ \ + /* Variables are declared volatile to forbid some compiler \ + optimizations. */ \ + volatile FLOAT Inf_var, NaN_var, zero_var, one_var, SNaN_var; \ + fenv_t saved_fenv; \ + \ + zero_var = 0.0; \ + one_var = 1.0; \ + NaN_var = zero_var / zero_var; \ + SNaN_var = snan_##FLOAT (); \ + Inf_var = one_var / zero_var; \ + \ + (void) &zero_var; \ + (void) &one_var; \ + (void) &NaN_var; \ + (void) &SNaN_var; \ + (void) &Inf_var; \ + \ + set_sigaction_FP (); \ + fegetenv(&saved_fenv); \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnan(NaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnan (NaN)", isnan (NaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnan(-NaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnan (-NaN)", isnan (-NaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnan(SNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnan (SNaN)", isnan (SNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnan(-SNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnan (-SNaN)", isnan (-SNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isinf(NaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isinf (NaN)", !isinf (NaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isinf(-NaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isinf (-NaN)", !isinf (-NaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isinf(SNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isinf (SNaN)", !isinf (SNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isinf(-SNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isinf (-SNaN)", !isinf (-SNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isfinite(NaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isfinite (NaN)", !isfinite (NaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isfinite(-NaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isfinite (-NaN)", !isfinite (-NaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isfinite(SNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isfinite (SNaN)", !isfinite (SNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isfinite(-SNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isfinite (-SNaN)", !isfinite (-SNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnormal(NaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnormal (NaN)", !isnormal (NaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnormal(-NaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnormal (-NaN)", !isnormal (-NaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnormal(SNaN) isnormal SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnormal (SNaN)", !isnormal (SNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnormal(-SNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnormal (-SNaN)", !isnormal (-SNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " fpclassify(NaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " fpclassify (NaN)", (fpclassify (NaN_var)==FP_NAN)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " fpclassify(-NaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " fpclassify (-NaN)", (fpclassify (-NaN_var)==FP_NAN)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " fpclassify(SNaN) isnormal SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " fpclassify (SNaN)", (fpclassify (SNaN_var)==FP_NAN)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " fpclassify(-SNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " fpclassify (-SNaN)", (fpclassify (-SNaN_var)==FP_NAN)); \ + } \ + \ + fesetenv(&saved_fenv); /* restore saved fenv */ \ + remove_sigaction_FP(); \ +} + +TEST_FUNC (float_test, float) +TEST_FUNC (double_test, double) +#ifndef NO_LONG_DOUBLE +TEST_FUNC (ldouble_test, ldouble) +#endif + +static int +do_test (void) +{ + init_signaling_nan(); + + float_test(); + double_test(); +#ifndef NO_LONG_DOUBLE + ldouble_test(); +#endif + + return errors != 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" + diff --git a/sysdeps/powerpc/powerpc32/fpu/s_isnan.S b/sysdeps/powerpc/powerpc32/fpu/s_isnan.S new file mode 100644 index 0000000000..6e3f396de9 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/fpu/s_isnan.S @@ -0,0 +1,56 @@ +/* isnan(). PowerPC32 version. + Copyright (C) 2008 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + +/* int __isnan(x) */ + .machine power4 +EALIGN (__isnan, 4, 0) + mffs fp0 + mtfsb0 4*cr6+lt /* reset_fpscr_bit (FPSCR_VE) */ + fcmpu cr7,fp1,fp1 + mtfsf 255,fp0 + li r3,0 + beqlr+ cr7 /* (x == x) then not a NAN */ + li r3,1 /* else must be a NAN */ + blr + END (__isnan) + +hidden_def (__isnan) +weak_alias (__isnan, isnan) + +/* It turns out that the 'double' version will also always work for + single-precision. */ +strong_alias (__isnan, __isnanf) +hidden_def (__isnanf) +weak_alias (__isnanf, isnanf) + +#ifdef NO_LONG_DOUBLE +strong_alias (__isnan, __isnanl) +weak_alias (__isnan, isnanl) +#endif + +#ifndef IS_IN_libm +# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) +compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); +compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +# endif +#endif + diff --git a/sysdeps/powerpc/powerpc32/fpu/s_isnan.c b/sysdeps/powerpc/powerpc32/fpu/s_isnan.c deleted file mode 100644 index 397717ba9c..0000000000 --- a/sysdeps/powerpc/powerpc32/fpu/s_isnan.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <sysdeps/powerpc/fpu/s_isnan.c> -#ifndef IS_IN_libm -# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) -compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); -compat_symbol (libc, isnan, isnanl, GLIBC_2_0); -# endif -#endif diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt.S b/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt.S new file mode 100644 index 0000000000..6aef4e301b --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt.S @@ -0,0 +1,119 @@ +/* sqrt function. PowerPC32 version. + Copyright (C) 2007 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 1 Franklin Street, Fifth Floor, Boston MA + 02110-1301 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + +/* double [fp1] sqrt (double x [fp1]) + Power4 (ISA V2.0) and above implement sqrt in hardware (not optional). + The fsqrt instruction generates the correct value for all inputs and + sets the appropriate floating point exceptions. Extented checking is + only needed to set errno (via __kernel_standard) if the input value + is negative. + + The fsqrt will set FPCC and FU (Floating Point Unordered or NaN + to indicated that the input value was negative or NaN. Use Move to + Condition Register from FPSCR to copy the FPCC field to cr1. The + branch on summary overflow transfers control to w_sqrt to process + any error conditions. Otherwise we can return the result directly. + + This part of the function is a leaf routine, so no need to stack a + frame or execute prologue/epilogue code. This means it is safe to + transfer directly to w_sqrt as long as the input value (f1) is + preserved. Putting the the sqrt result into f2 (double parameter 2) + allows passing both the input value and sqrt result into the extended + wrapper so there is no need to recompute. + + This tactic avoids the overhead of stacking a frame for the normal + (non-error) case. Until gcc supports prologue shrink-wrapping + this is the best we can do. */ + + .section ".text" + .machine power4 +EALIGN (__sqrt, 5, 0) + fsqrt fp2,fp1 + mcrfs cr1,4 + bso- cr1,.Lw_sqrt + fmr fp1,fp2 + blr + .align 4 +.Lw_sqrt: + mflr r0 + stwu r1,-16(r1) + cfi_adjust_cfa_offset(16) + fmr fp12,fp2 + stw r0,20(r1) + stw r30,8(r1) + cfi_offset(lr,20) + cfi_offset(r30,8) +#ifdef SHARED +# ifdef HAVE_ASM_PPC_REL16 + bcl 20,31,.LCF1 +.LCF1: + mflr r30 + addis r30,r30,_GLOBAL_OFFSET_TABLE_-.LCF1@ha + addi r30,r30,_GLOBAL_OFFSET_TABLE_-.LCF1@l + lwz r9,_LIB_VERSION@got(30) + lwz r0,0(r9) +# else + bl _GLOBAL_OFFSET_TABLE_@local-4 + mflr r30 + lwz r9,_LIB_VERSION@got(30) + lwz r0,0(r9) +# endif +#else + lis r9,_LIB_VERSION@ha + lwz r0,_LIB_VERSION@l(r9) +#endif +/* if (_LIB_VERSION == _IEEE_) return z; */ + cmpwi cr7,r0,-1 + beq- cr7,.L4 +/* if (x != x) return z; !isnan*/ + fcmpu cr7,fp1,fp1 + bne- cr7,.L4 +/* if (x < 0.0) + return __kernel_standard (x, x, 26) */ + fmr fp2,fp1 + fabs fp0,fp1 + li r3,26 + fcmpu cr7,fp1,fp0 + bne- cr7,.L11 +.L4: + lwz r0,20(r1) + fmr fp1,fp12 + lwz r30,8(r1) + addi r1,r1,16 + mtlr r0 + blr +.L11: + bl __kernel_standard@plt + fmr fp12,fp1 + b .L4 + END (__sqrt) + +weak_alias (__sqrt, sqrt) + +#ifdef NO_LONG_DOUBLE +weak_alias (__sqrt, sqrtl) +strong_alias (__sqrt, __sqrtl) +#endif +#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) +compat_symbol (libm, __sqrt, sqrtl, GLIBC_2_0) +#endif + diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt.c b/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt.c deleted file mode 100644 index f59c193934..0000000000 --- a/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrt.c +++ /dev/null @@ -1,62 +0,0 @@ -/* Double-precision floating point square root wrapper. - Copyright (C) 2004, 2007 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 Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include <math_ldbl_opt.h> -#include "math.h" -#include "math_private.h" -#include <fenv_libc.h> - -#ifdef __STDC__ -double -__sqrt (double x) /* wrapper sqrt */ -#else -double -__sqrt (x) /* wrapper sqrt */ - double x; -#endif -{ - double z; -/* Power4 (ISA V2.0) and above implement sqrt in hardware. */ - __asm __volatile ( - " fsqrt %0,%1\n" - : "=f" (z) - : "f" (x)); -#ifdef _IEEE_LIBM - return z; -#else - if (__builtin_expect (_LIB_VERSION == _IEEE_, 0)) - return z; - - if (__builtin_expect (x != x, 0)) - return z; - - if (__builtin_expect (x < 0.0, 0)) - return __kernel_standard (x, x, 26); /* sqrt(negative) */ - else - return z; -#endif -} - -weak_alias (__sqrt, sqrt) -#ifdef NO_LONG_DOUBLE - strong_alias (__sqrt, __sqrtl) weak_alias (__sqrt, sqrtl) -#endif -#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) -compat_symbol (libm, __sqrt, sqrtl, GLIBC_2_0); -#endif diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf.S b/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf.S new file mode 100644 index 0000000000..e5b8b9d565 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf.S @@ -0,0 +1,111 @@ +/* sqrtf function. PowerPC32 version. + Copyright (C) 2007 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 1 Franklin Street, Fifth Floor, Boston MA + 02110-1301 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + +/* float [fp1] sqrts (float x [fp1]) + Power4 (ISA V2.0) and above implement sqrt in hardware (not optional). + The fsqrts instruction generates the correct value for all inputs and + sets the appropriate floating point exceptions. Extented checking is + only needed to set errno (via __kernel_standard) if the input value + is negative. + + The fsqrts will set FPCC and FU (Floating Point Unordered or NaN + to indicated that the input value was negative or NaN. Use Move to + Condition Register from FPSCR to copy the FPCC field to cr1. The + branch on summary overflow transfers control to w_sqrt to process + any error conditions. Otherwise we can return the result directly. + + This part of the function is a leaf routine, so no need to stack a + frame or execute prologue/epilogue code. This means it is safe to + transfer directly to w_sqrt as long as the input value (f1) is + preserved. Putting the the sqrt result into f2 (float parameter 2) + allows passing both the input value and sqrt result into the extended + wrapper so there is no need to recompute. + + This tactic avoids the overhead of stacking a frame for the normal + (non-error) case. Until gcc supports prologue shrink-wrapping + this is the best we can do. */ + + .section ".text" + .machine power4 +EALIGN (__sqrtf, 5, 0) + fsqrts fp2,fp1 + mcrfs cr1,4 + bso- cr1,.Lw_sqrtf + fmr fp1,fp2 + blr + .align 4 +.Lw_sqrtf: + mflr r0 + stwu r1,-16(r1) + cfi_adjust_cfa_offset(16) + fmr fp12,fp2 + stw r0,20(r1) + stw r30,8(r1) + cfi_offset(lr,20) + cfi_offset(r30,8) +#ifdef SHARED +# ifdef HAVE_ASM_PPC_REL16 + bcl 20,31,.LCF1 +.LCF1: + mflr r30 + addis r30,r30,_GLOBAL_OFFSET_TABLE_-.LCF1@ha + addi r30,r30,_GLOBAL_OFFSET_TABLE_-.LCF1@l + lwz r9,_LIB_VERSION@got(30) + lwz r0,0(r9) +# else + bl _GLOBAL_OFFSET_TABLE_@local-4 + mflr r30 + lwz r9,_LIB_VERSION@got(30) + lwz r0,0(r9) +# endif +#else + lis r9,_LIB_VERSION@ha + lwz r0,_LIB_VERSION@l(r9) +#endif +/* if (_LIB_VERSION == _IEEE_) return z; */ + cmpwi cr7,r0,-1 + beq- cr7,.L4 +/* if (x != x, 0) return z; !isnan */ + fcmpu cr7,fp1,fp1 + bne- cr7,.L4 +/* if (x < 0.0) + return __kernel_standard (x, x, 126) */ + fmr fp2,fp1 + fabs fp0,fp1 + li r3,126 + fcmpu cr7,1,0 + bne- cr7,.L11 +.L4: + lwz r0,20(r1) + fmr fp1,fp12 + lwz r30,8(r1) + addi r1,r1,16 + mtlr r0 + blr +.L11: + bl __kernel_standard@plt + fmr fp12,fp1 + b .L4 + END (__sqrtf) + +weak_alias (__sqrtf, sqrtf) + diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf.c b/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf.c deleted file mode 100644 index 4784869f07..0000000000 --- a/sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf.c +++ /dev/null @@ -1,60 +0,0 @@ -/* Single-precision floating point square root wrapper. - Copyright (C) 2004, 2007 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 Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include "math.h" -#include "math_private.h" -#include <fenv_libc.h> - -#include <sysdep.h> -#include <ldsodefs.h> - -#ifdef __STDC__ -float -__sqrtf (float x) /* wrapper sqrtf */ -#else -float -__sqrtf (x) /* wrapper sqrtf */ - float x; -#endif -{ -#ifdef _IEEE_LIBM - return __ieee754_sqrtf (x); -#else - float z; -/* Power4 (ISA V2.0) and above implement sqrtf in hardware. */ - __asm __volatile ( - " fsqrts %0,%1\n" - : "=f" (z) - : "f" (x)); - - if (__builtin_expect (_LIB_VERSION == _IEEE_, 0)) - return z; - - if (__builtin_expect (x != x, 0)) - return z; - - if (__builtin_expect (x < 0.0, 0)) - /* sqrtf(negative) */ - return (float) __kernel_standard ((double) x, (double) x, 126); - else - return z; -#endif -} - -weak_alias (__sqrtf, sqrtf) diff --git a/sysdeps/powerpc/powerpc32/power4/hp-timing.c b/sysdeps/powerpc/powerpc32/power4/hp-timing.c new file mode 100644 index 0000000000..332fe8af99 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power4/hp-timing.c @@ -0,0 +1,25 @@ +/* Support for high precision, low overhead timing functions. + powerpc64 version. + Copyright (C) 2005, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <hp-timing.h> + +/* We have to define the variable for the overhead. */ +hp_timing_t _dl_hp_timing_overhead; diff --git a/sysdeps/powerpc/powerpc32/power4/hp-timing.h b/sysdeps/powerpc/powerpc32/power4/hp-timing.h new file mode 100644 index 0000000000..5f719dd5a1 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power4/hp-timing.h @@ -0,0 +1,152 @@ +/* High precision, low overhead timing functions. powerpc64 version. + Copyright (C) 2005, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _HP_TIMING_H +#define _HP_TIMING_H 1 + +#include <string.h> +#include <sys/param.h> +#include <stdio-common/_itoa.h> +#include <atomic.h> + +/* The macros defined here use the powerpc 64-bit time base register. + The time base is nominally clocked at 1/8th the CPU clock, but this + can vary. + + The list of macros we need includes the following: + + - HP_TIMING_AVAIL: test for availability. + + - HP_TIMING_INLINE: this macro is non-zero if the functionality is not + implemented using function calls but instead uses some inlined code + which might simply consist of a few assembler instructions. We have to + know this since we might want to use the macros here in places where we + cannot make function calls. + + - hp_timing_t: This is the type for variables used to store the time + values. + + - HP_TIMING_ZERO: clear `hp_timing_t' object. + + - HP_TIMING_NOW: place timestamp for current time in variable given as + parameter. + + - HP_TIMING_DIFF_INIT: do whatever is necessary to be able to use the + HP_TIMING_DIFF macro. + + - HP_TIMING_DIFF: compute difference between two times and store it + in a third. Source and destination might overlap. + + - HP_TIMING_ACCUM: add time difference to another variable. This might + be a bit more complicated to implement for some platforms as the + operation should be thread-safe and 64bit arithmetic on 32bit platforms + is not. + + - HP_TIMING_ACCUM_NT: this is the variant for situations where we know + there are no threads involved. + + - HP_TIMING_PRINT: write decimal representation of the timing value into + the given string. This operation need not be inline even though + HP_TIMING_INLINE is specified. + +*/ + +/* We always assume having the timestamp register. */ +#define HP_TIMING_AVAIL (1) + +/* We indeed have inlined functions. */ +#define HP_TIMING_INLINE (1) + +/* We use 64bit values for the times. */ +typedef unsigned long long int hp_timing_t; + +/* Set timestamp value to zero. */ +#define HP_TIMING_ZERO(Var) (Var) = (0) + +/* That's quite simple. Use the `mftb' instruction. Note that the value + might not be 100% accurate since there might be some more instructions + running in this moment. This could be changed by using a barrier like + 'lwsync' right before the `mftb' instruciton. But we are not interested + in accurate clock cycles here so we don't do this. */ + +#define HP_TIMING_NOW(Var) \ + do { \ + union { long long ll; long ii[2]; } _var; \ + long tmp; \ + __asm__ __volatile__ ( \ + "1: mfspr %0,269;" \ + " mfspr %1,268;" \ + " mfspr %2,269;" \ + " cmpw %0,%2;" \ + " bne 1b;" \ + : "=r" (_var.ii[0]), "=r" (_var.ii[1]) , "=r" (tmp) \ + : : "cr0" \ + ); \ + Var = _var.ll; \ + } while (0) + + +/* Use two 'mftb' instructions in a row to find out how long it takes. + On current POWER4, POWER5, and 970 processors mftb take ~10 cycles. */ +#define HP_TIMING_DIFF_INIT() \ + do { \ + if (GLRO(dl_hp_timing_overhead) == 0) \ + { \ + int __cnt = 5; \ + GLRO(dl_hp_timing_overhead) = ~0ull; \ + do \ + { \ + hp_timing_t __t1, __t2; \ + HP_TIMING_NOW (__t1); \ + HP_TIMING_NOW (__t2); \ + if (__t2 - __t1 < GLRO(dl_hp_timing_overhead)) \ + GLRO(dl_hp_timing_overhead) = __t2 - __t1; \ + } \ + while (--__cnt > 0); \ + } \ + } while (0) + +/* It's simple arithmetic in 64-bit. */ +#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start)) + +/* We need to insure that this add is atomic in threaded environments. We use + __arch_atomic_exchange_and_add_64 from atomic.h to get thread safety. */ +#define HP_TIMING_ACCUM(Sum, Diff) \ + do { \ + hp_timing_t __diff = (Diff) - GLRO(dl_hp_timing_overhead); \ + __arch_atomic_exchange_and_add_64 (&(Sum), __diff); \ + } while (0) + +/* No threads, no extra work. */ +#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff) + +/* Print the time value. */ +#define HP_TIMING_PRINT(Buf, Len, Val) \ + do { \ + char __buf[20]; \ + char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \ + size_t __len = (Len); \ + char *__dest = (Buf); \ + while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \ + *__dest++ = *__cp++; \ + memcpy (__dest, " ticks", MIN (__len, sizeof (" ticks"))); \ + } while (0) + +#endif /* hp-timing.h */ diff --git a/sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S b/sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S new file mode 100644 index 0000000000..91337483d7 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S @@ -0,0 +1,62 @@ +/* isnan(). PowerPC32 version. + Copyright (C) 2008 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + +/* int __isnan(x) */ + .machine power5 +EALIGN (__isnan, 4, 0) + stwu r1,-32(r1) + cfi_adjust_cfa_offset (32) + ori r1,r1,0 + stfd fp1,24(r1) /* copy FPR to GPR */ + ori r1,r1,0 + lwz r4,24(r1) + lwz r5,28(r1) + lis r0,0x7ff0 /* const long r0 0x7ff00000 00000000 */ + clrlwi r4,r4,1 /* x = fabs(x) */ + cmpw cr7,r4,r0 /* if (fabs(x) =< inf) */ + cmpwi cr6,r5,0 + li r3,0 /* then return 0 */ + addi r1,r1,32 + cfi_adjust_cfa_offset (-32) + bltlr+ cr7 + bgt- cr7,L(NaN) + beqlr+ cr6 +L(NaN): + li r3,1 /* else return 1 */ + blr + END (__isnan) + +hidden_def (__isnan) +weak_alias (__isnan, isnan) + +#ifdef NO_LONG_DOUBLE +strong_alias (__isnan, __isnanl) +weak_alias (__isnan, isnanl) +#endif + +#ifndef IS_IN_libm +# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) +compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); +compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +# endif +#endif + diff --git a/sysdeps/powerpc/powerpc32/power5/fpu/s_isnanf.S b/sysdeps/powerpc/powerpc32/power5/fpu/s_isnanf.S new file mode 100644 index 0000000000..9b1e95f35f --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power5/fpu/s_isnanf.S @@ -0,0 +1,46 @@ +/* isnan(). PowerPC32 version. + Copyright (C) 2008 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + +/* int __isnanf(x) */ + .machine power5 +EALIGN (__isnanf, 4, 0) + stwu r1,-32(r1) + cfi_adjust_cfa_offset (32) + stfs fp1,28(r1) /* copy FPR to GPR */ + nop + nop + lwz r4,28(r1) + lis r0,0x7f80 /* const long r0 0x7f800000 */ + clrlwi r4,r4,1 /* x = fabs(x) */ + cmpw cr7,r4,r0 /* if (fabs(x) =< inf) */ + li r3,0 /* then return 0 */ + addi r1,r1,32 + cfi_adjust_cfa_offset (-32) + blelr+ cr7 +L(NaN): + li r3,1 /* else return 1 */ + blr + END (__isnanf) + +hidden_def (__isnanf) +weak_alias (__isnanf, isnanf) + diff --git a/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrt.S b/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrt.S new file mode 100644 index 0000000000..925930bf77 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrt.S @@ -0,0 +1,117 @@ +/* sqrt function. PowerPC32 version. + Copyright (C) 2007 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 1 Franklin Street, Fifth Floor, Boston MA + 02110-1301 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + +/* double [fp1] sqrt (double x [fp1]) + Power4 (ISA V2.0) and above implement sqrt in hardware (not optional). + The fsqrt instruction generates the correct value for all inputs and + sets the appropriate floating point exceptions. Extented checking is + only needed to set errno (via __kernel_standard) if the input value + is negative. + + So compare the input value against the absolute value of itself. + This will compare equal unless the value is negative (EDOM) or a NAN, + in which case we branch to the extend wrapper. If equal we can return + the result directly. + + This part of the function looks like a leaf routine, so no need to + stack a frame or execute prologue/epilogue code. It is safe to + branch directly to w_sqrt as long as the input value (f1) is + preserved. Putting the the sqrt result into f2 (float parameter 2) + allows passing both the input value and sqrt result into the extended + wrapper so there is no need to recompute. + + This tactic avoids the overhead of stacking a frame for the normal + (non-error) case. Until gcc supports prologue shrink-wrapping + this is the best we can do. */ + + .section ".text" + .machine power4 +EALIGN (__sqrt, 5, 0) + fabs fp0,fp1 + fsqrt fp2,fp1 + fcmpu cr1,fp0,fp1 + bne- cr1,.Lw_sqrt + fmr fp1,fp2 + blr + .align 4 +.Lw_sqrt: + mflr r0 + stwu r1,-16(r1) + cfi_adjust_cfa_offset(16) + fmr fp12,fp2 + stw r0,20(r1) + stw r30,8(r1) + cfi_offset(lr,20) + cfi_offset(r30,8) +#ifdef SHARED +# ifdef HAVE_ASM_PPC_REL16 + bcl 20,31,.LCF1 +.LCF1: + mflr r30 + addis r30,r30,_GLOBAL_OFFSET_TABLE_-.LCF1@ha + addi r30,r30,_GLOBAL_OFFSET_TABLE_-.LCF1@l + lwz r9,_LIB_VERSION@got(30) + lwz r0,0(r9) +# else + bl _GLOBAL_OFFSET_TABLE_@local-4 + mflr r30 + lwz r9,_LIB_VERSION@got(30) + lwz r0,0(r9) +# endif +#else + lis r9,_LIB_VERSION@ha + lwz r0,_LIB_VERSION@l(r9) +#endif +/* if (_LIB_VERSION == _IEEE_) return z; */ + cmpwi cr7,r0,-1 + beq- cr7,.L4 +/* if (x != x) return z; !isnan*/ + fcmpu cr7,fp1,fp1 + bne- cr7,.L4 +/* if (x < 0.0) + return __kernel_standard (x, x, 26) */ + fmr fp2,fp1 + li r3,26 + bne- cr1,.L11 +.L4: + lwz r0,20(r1) + fmr fp1,fp12 + lwz r30,8(r1) + addi r1,r1,16 + mtlr r0 + blr +.L11: + bl __kernel_standard@plt + fmr fp12,fp1 + b .L4 + END (__sqrt) + +weak_alias (__sqrt, sqrt) + +#ifdef NO_LONG_DOUBLE +weak_alias (__sqrt, sqrtl) +strong_alias (__sqrt, __sqrtl) +#endif +#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) +compat_symbol (libm, __sqrt, sqrtl, GLIBC_2_0) +#endif + diff --git a/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrtf.S b/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrtf.S new file mode 100644 index 0000000000..891e69c9c0 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power5/fpu/w_sqrtf.S @@ -0,0 +1,109 @@ +/* sqrtf function. PowerPC32 version. + Copyright (C) 2007 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 1 Franklin Street, Fifth Floor, Boston MA + 02110-1301 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + +/* float [fp1] sqrts (float x [fp1]) + Power4 (ISA V2.0) and above implement sqrt in hardware (not optional). + The fsqrts instruction generates the correct value for all inputs and + sets the appropriate floating point exceptions. Extented checking is + only needed to set errno (via __kernel_standard) if the input value + is negative. + + So compare the input value against the absolute value of itself. + This will compare equal unless the value is negative (EDOM) or a NAN, + in which case we branch to the extend wrapper. If equal we can return + the result directly. + + This part of the function looks like a leaf routine, so no need to + stack a frame or execute prologue/epilogue code. It is safe to + branch directly to w_sqrt as long as the input value (f1) is + preserved. Putting the the sqrt result into f2 (float parameter 2) + allows passing both the input value and sqrt result into the extended + wrapper so there is no need to recompute. + + This tactic avoids the overhead of stacking a frame for the normal + (non-error) case. Until gcc supports prologue shrink-wrapping + this is the best we can do. */ + + .section ".text" + .machine power4 +EALIGN (__sqrtf, 5, 0) + fabs fp0,fp1 + fsqrts fp2,fp1 + fcmpu cr1,fp0,fp1 + bne- cr1,.Lw_sqrtf + fmr fp1,fp2 + blr + .align 4 +.Lw_sqrtf: + mflr r0 + stwu r1,-16(r1) + cfi_adjust_cfa_offset(16) + fmr fp12,fp2 + stw r0,20(r1) + stw r30,8(r1) + cfi_offset(lr,20) + cfi_offset(r30,8) +#ifdef SHARED +# ifdef HAVE_ASM_PPC_REL16 + bcl 20,31,.LCF1 +.LCF1: + mflr r30 + addis r30,r30,_GLOBAL_OFFSET_TABLE_-.LCF1@ha + addi r30,r30,_GLOBAL_OFFSET_TABLE_-.LCF1@l + lwz r9,_LIB_VERSION@got(30) + lwz r0,0(r9) +# else + bl _GLOBAL_OFFSET_TABLE_@local-4 + mflr r30 + lwz r9,_LIB_VERSION@got(30) + lwz r0,0(r9) +# endif +#else + lis r9,_LIB_VERSION@ha + lwz r0,_LIB_VERSION@l(r9) +#endif +/* if (_LIB_VERSION == _IEEE_) return z; */ + cmpwi cr7,r0,-1 + beq- cr7,.L4 +/* if (x != x, 0) return z; !isnan */ + fcmpu cr7,fp1,fp1 + bne- cr7,.L4 +/* if (x < 0.0) + return __kernel_standard (x, x, 126) */ + fmr fp2,fp1 + li r3,126 + bne- cr1,.L11 +.L4: + lwz r0,20(r1) + fmr fp1,fp12 + lwz r30,8(r1) + addi r1,r1,16 + mtlr r0 + blr +.L11: + bl __kernel_standard@plt + fmr fp12,fp1 + b .L4 + END (__sqrtf) + +weak_alias (__sqrtf, sqrtf) + diff --git a/sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S b/sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S new file mode 100644 index 0000000000..dbaaf1c1a8 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S @@ -0,0 +1,62 @@ +/* isnan(). PowerPC32 version. + Copyright (C) 2008 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + +/* int __isnan(x) */ + .machine power6 +EALIGN (__isnan, 4, 0) + stwu r1,-32(r1) + cfi_adjust_cfa_offset (32) + ori r1,r1,0 + stfd fp1,24(r1) /* copy FPR to GPR */ + ori r1,r1,0 + lwz r4,24(r1) + lwz r5,28(r1) + lis r0,0x7ff0 /* const long r0 0x7ff00000 00000000 */ + clrlwi r4,r4,1 /* x = fabs(x) */ + cmpw cr7,r4,r0 /* if (fabs(x) =< inf) */ + cmpwi cr6,r5,0 + li r3,0 /* then return 0 */ + addi r1,r1,32 + cfi_adjust_cfa_offset (-32) + bltlr+ cr7 + bgt- cr7,L(NaN) + beqlr+ cr6 +L(NaN): + li r3,1 /* else return 1 */ + blr + END (__isnan) + +hidden_def (__isnan) +weak_alias (__isnan, isnan) + +#ifdef NO_LONG_DOUBLE +strong_alias (__isnan, __isnanl) +weak_alias (__isnan, isnanl) +#endif + +#ifndef IS_IN_libm +# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) +compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); +compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +# endif +#endif + diff --git a/sysdeps/powerpc/powerpc32/power6/fpu/s_isnanf.S b/sysdeps/powerpc/powerpc32/power6/fpu/s_isnanf.S new file mode 100644 index 0000000000..12bf473a8d --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power6/fpu/s_isnanf.S @@ -0,0 +1,46 @@ +/* isnanf(). PowerPC32 version. + Copyright (C) 2008 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + +/* int __isnanf(x) */ + .machine power6 +EALIGN (__isnanf, 4, 0) + stwu r1,-32(r1) + cfi_adjust_cfa_offset (32) + ori r1,r1,0 + stfs fp1,24(r1) /* copy FPR to GPR */ + ori r1,r1,0 + lwz r4,24(r1) + lis r0,0x7f80 /* const long r0 0x7f800000 */ + clrlwi r4,r4,1 /* x = fabs(x) */ + cmpw cr7,r4,r0 /* if (fabs(x) =< inf) */ + li r3,0 /* then return 0 */ + addi r1,r1,32 + cfi_adjust_cfa_offset (-32) + blelr+ cr7 +L(NaN): + li r3,1 /* else return 1 */ + blr + END (__isnan) + +hidden_def (__isnanf) +weak_alias (__isnanf, isnanf) + diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h index 89a69e1a23..c837393d79 100644 --- a/sysdeps/powerpc/powerpc64/dl-machine.h +++ b/sysdeps/powerpc/powerpc64/dl-machine.h @@ -246,30 +246,35 @@ BODY_PREFIX "_dl_start_user:\n" \ " " END_2(_dl_start_user) "\n" \ " .popsection"); -/* 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_PPC64_COPY) +/* ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to + one of the main executable's symbols, as for a COPY reloc. + + To make function pointer comparisons work on most targets, the + relevant ABI states that the address of a non-local function in a + dynamically linked executable is the address of the PLT entry for + that function. This is quite reasonable since using the real + function address in a non-PIC executable would typically require + dynamic relocations in .text, something to be avoided. For such + functions, the linker emits a SHN_UNDEF symbol in the executable + with value equal to the PLT entry address. Normally, SHN_UNDEF + symbols have a value of zero, so this is a clue to ld.so that it + should treat these symbols specially. For relocations not in + ELF_RTYPE_CLASS_PLT (eg. those on function pointers), ld.so should + use the value of the executable SHN_UNDEF symbol, ie. the PLT entry + address. For relocations in ELF_RTYPE_CLASS_PLT (eg. the relocs in + the PLT itself), ld.so should use the value of the corresponding + defined symbol in the object that defines the function, ie. the + real function address. This complicates ld.so in that there are + now two possible values for a given symbol, and it gets even worse + because protected symbols need yet another set of rules. + + On PowerPC64 we don't need any of this. The linker won't emit + SHN_UNDEF symbols with non-zero values. ld.so can make all + relocations behave "normally", ie. always use the real address + like PLT relocations. So always set ELF_RTYPE_CLASS_PLT. */ -/* Nonzero iff TYPE describes relocation of a PLT entry, so - PLT entries should not be allowed to define the value. */ -#define elf_machine_lookup_noplt_p(type) ((type) == R_PPC64_JMP_SLOT) - -/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so - PLT entries should not be allowed to define the value. - ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one - of the main executable's symbols, as for a COPY reloc. */ - -#if !defined RTLD_BOOTSTRAP || USE___THREAD -#define elf_machine_type_class(type) \ - /* This covers all the TLS relocs, though most won't appear. */ \ - (((((type) >= R_PPC64_DTPMOD64 && (type) <= R_PPC64_TPREL16_HIGHESTA) \ - || (type) == R_PPC64_ADDR24) * ELF_RTYPE_CLASS_PLT) \ - | (((type) == R_PPC64_COPY) * ELF_RTYPE_CLASS_COPY)) -#else #define elf_machine_type_class(type) \ - ((((type) == R_PPC64_ADDR24) * ELF_RTYPE_CLASS_PLT) \ - | (((type) == R_PPC64_COPY) * ELF_RTYPE_CLASS_COPY)) -#endif + (ELF_RTYPE_CLASS_PLT | (((type) == R_PPC64_COPY) * ELF_RTYPE_CLASS_COPY)) /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ #define ELF_MACHINE_JMP_SLOT R_PPC64_JMP_SLOT diff --git a/sysdeps/powerpc/powerpc64/fpu/s_isnan.S b/sysdeps/powerpc/powerpc64/fpu/s_isnan.S new file mode 100644 index 0000000000..9963896f2d --- /dev/null +++ b/sysdeps/powerpc/powerpc64/fpu/s_isnan.S @@ -0,0 +1,57 @@ +/* isnan(). PowerPC64 version. + Copyright (C) 2008 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + +/* int __isnan(x) */ + .machine power4 +EALIGN (__isnan, 4, 0) + CALL_MCOUNT 0 + mffs fp0 + mtfsb0 4*cr6+lt /* reset_fpscr_bit (FPSCR_VE) */ + fcmpu cr7,fp1,fp1 + mtfsf 255,fp0 + li r3,0 + beqlr+ cr7 /* (x == x) then not a NAN */ + li r3,1 /* else must be a NAN */ + blr + END (__isnan) + +hidden_def (__isnan) +weak_alias (__isnan, isnan) + +/* It turns out that the 'double' version will also always work for + single-precision. */ +strong_alias (__isnan, __isnanf) +hidden_def (__isnanf) +weak_alias (__isnanf, isnanf) + +#ifdef NO_LONG_DOUBLE +strong_alias (__isnan, __isnanl) +weak_alias (__isnan, isnanl) +#endif + +#ifndef IS_IN_libm +# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) +compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); +compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +# endif +#endif + diff --git a/sysdeps/powerpc/powerpc64/fpu/s_isnan.c b/sysdeps/powerpc/powerpc64/fpu/s_isnan.c deleted file mode 100644 index 397717ba9c..0000000000 --- a/sysdeps/powerpc/powerpc64/fpu/s_isnan.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <sysdeps/powerpc/fpu/s_isnan.c> -#ifndef IS_IN_libm -# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) -compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); -compat_symbol (libc, isnan, isnanl, GLIBC_2_0); -# endif -#endif diff --git a/sysdeps/powerpc/powerpc64/hp-timing.h b/sysdeps/powerpc/powerpc64/hp-timing.h index b58cca9003..e107a2dd49 100644 --- a/sysdeps/powerpc/powerpc64/hp-timing.h +++ b/sysdeps/powerpc/powerpc64/hp-timing.h @@ -1,5 +1,5 @@ /* High precision, low overhead timing functions. powerpc64 version. - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005, 2008 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -85,7 +85,11 @@ typedef unsigned long long int hp_timing_t; running in this moment. This could be changed by using a barrier like 'lwsync' right before the `mftb' instruciton. But we are not interested in accurate clock cycles here so we don't do this. */ +#ifdef _ARCH_PWR4 +#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("mfspr %0,268" : "=r" (Var)) +#else #define HP_TIMING_NOW(Var) __asm__ __volatile__ ("mftb %0" : "=r" (Var)) +#endif /* Use two 'mftb' instructions in a row to find out how long it takes. On current POWER4, POWER5, and 970 processors mftb take ~10 cycles. */ diff --git a/sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S b/sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S new file mode 100644 index 0000000000..d46d049d45 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S @@ -0,0 +1,61 @@ +/* isnan(). PowerPC64 version. + Copyright (C) 2008 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + +/* int __isnan(x) */ + .machine power5 +EALIGN (__isnan, 4, 0) + CALL_MCOUNT 0 + stfd fp1,-8(r1) /* copy FPR to GPR */ + lis r0,0x7ff0 + nop /* insure the following is in a different */ + nop /* dispatch group */ + ld r4,-8(r1) + sldi r0,r0,32 /* const long r0 0x7ff00000 00000000 */ + clrldi r4,r4,1 /* x = fabs(x) */ + cmpd cr7,r4,r0 /* if (fabs(x) <= inf) */ + li r3,0 /* then return 0 */ + blelr+ cr7 + li r3,1 /* else return 1 */ + blr + END (__isnan) + +hidden_def (__isnan) +weak_alias (__isnan, isnan) + +/* It turns out that the 'double' version will also always work for + single-precision. */ +strong_alias (__isnan, __isnanf) +hidden_def (__isnanf) +weak_alias (__isnanf, isnanf) + +#ifdef NO_LONG_DOUBLE +strong_alias (__isnan, __isnanl) +weak_alias (__isnan, isnanl) +#endif + +#ifndef IS_IN_libm +# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) +compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); +compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +# endif +#endif + diff --git a/sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S b/sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S new file mode 100644 index 0000000000..fe0c56ca8e --- /dev/null +++ b/sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S @@ -0,0 +1,60 @@ +/* isnan(). PowerPC64 version. + Copyright (C) 2008 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + +/* int __isnan(x) */ + .machine power6 +EALIGN (__isnan, 4, 0) + CALL_MCOUNT 0 + stfd fp1,-8(r1) /* copy FPR to GPR */ + ori r1,r1,0 + ld r4,-8(r1) + lis r0,0x7ff0 + sldi r0,r0,32 /* const long r0 0x7ff00000 00000000 */ + clrldi r4,r4,1 /* x = fabs(x) */ + cmpd cr7,r4,r0 /* if (fabs(x) <= inf) */ + li r3,0 /* then return 0 */ + blelr+ cr7 + li r3,1 /* else return 1 */ + blr + END (__isnan) + +hidden_def (__isnan) +weak_alias (__isnan, isnan) + +/* It turns out that the 'double' version will also always work for + single-precision. */ +strong_alias (__isnan, __isnanf) +hidden_def (__isnanf) +weak_alias (__isnanf, isnanf) + +#ifdef NO_LONG_DOUBLE +strong_alias (__isnan, __isnanl) +weak_alias (__isnan, isnanl) +#endif + +#ifndef IS_IN_libm +# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) +compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); +compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +# endif +#endif + diff --git a/sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S b/sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S new file mode 100644 index 0000000000..47dd49a751 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S @@ -0,0 +1,59 @@ +/* isnan(). PowerPC64 version. + Copyright (C) 2008 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + +/* int __isnan(x) */ + .machine power6 +EALIGN (__isnan, 4, 0) + CALL_MCOUNT 0 + mftgpr r4,fp1 /* copy FPR to GPR */ + lis r0,0x7ff0 + ori r1,r1,0 + clrldi r4,r4,1 /* x = fabs(x) */ + sldi r0,r0,32 /* const long r0 0x7ff00000 00000000 */ + cmpd cr7,r4,r0 /* if (fabs(x) <= inf) */ + li r3,0 /* then return 0 */ + blelr+ cr7 + li r3,1 /* else return 1 */ + blr + END (__isnan) + +hidden_def (__isnan) +weak_alias (__isnan, isnan) + +/* It turns out that the 'double' version will also always work for + single-precision. */ +strong_alias (__isnan, __isnanf) +hidden_def (__isnanf) +weak_alias (__isnanf, isnanf) + +#ifdef NO_LONG_DOUBLE +strong_alias (__isnan, __isnanl) +weak_alias (__isnan, isnanl) +#endif + +#ifndef IS_IN_libm +# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) +compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); +compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +# endif +#endif + diff --git a/sysdeps/unix/sysv/linux/i386/vfork.S b/sysdeps/unix/sysv/linux/i386/vfork.S index eefd4b49cb..2494d9bef0 100644 --- a/sysdeps/unix/sysv/linux/i386/vfork.S +++ b/sysdeps/unix/sysv/linux/i386/vfork.S @@ -1,4 +1,4 @@ -/* Copyright (C) 1999, 2002, 2004, 2005 Free Software Foundation, Inc. +/* Copyright (C) 1999, 2002, 2004, 2005, 2008 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Schwab <schwab@gnu.org>. @@ -34,6 +34,7 @@ ENTRY (__vfork) /* Pop the return PC value into ECX. */ popl %ecx cfi_adjust_cfa_offset (-4) + cfi_register (%eip, %ecx) #ifdef SAVE_PID SAVE_PID diff --git a/sysdeps/unix/sysv/linux/x86_64/makecontext.c b/sysdeps/unix/sysv/linux/x86_64/makecontext.c index 5deea7d1b2..615dede522 100644 --- a/sysdeps/unix/sysv/linux/x86_64/makecontext.c +++ b/sysdeps/unix/sysv/linux/x86_64/makecontext.c @@ -1,5 +1,5 @@ /* Create new context. - Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2002, 2004, 2005, 2008 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger <aj@suse.de>, 2002. @@ -78,31 +78,39 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) sp[idx_uc_link] = (unsigned long int) ucp->uc_link; va_start (ap, argc); - /* Handle arguments. */ + /* Handle arguments. + + The standard says the parameters must all be int values. This is + an historic accident and would be done differently today. For + x86-64 all integer values are passed as 64-bit values and + therefore extending the API to copy 64-bit values instead of + 32-bit ints makes sense. It does not break existing + functionality and it does not violate the standard which says + that passing non-int values means undefined behavior. */ for (i = 0; i < argc; ++i) switch (i) { case 0: - ucp->uc_mcontext.gregs [REG_RDI] = va_arg (ap, int); + ucp->uc_mcontext.gregs[REG_RDI] = va_arg (ap, long int); break; case 1: - ucp->uc_mcontext.gregs [REG_RSI] = va_arg (ap, int); + ucp->uc_mcontext.gregs[REG_RSI] = va_arg (ap, long int); break; case 2: - ucp->uc_mcontext.gregs [REG_RDX] = va_arg (ap, int); + ucp->uc_mcontext.gregs[REG_RDX] = va_arg (ap, long int); break; case 3: - ucp->uc_mcontext.gregs [REG_RCX] = va_arg (ap, int); + ucp->uc_mcontext.gregs[REG_RCX] = va_arg (ap, long int); break; case 4: - ucp->uc_mcontext.gregs [REG_R8] = va_arg (ap, int); + ucp->uc_mcontext.gregs[REG_R8] = va_arg (ap, long int); break; case 5: - ucp->uc_mcontext.gregs [REG_R9] = va_arg (ap, int); + ucp->uc_mcontext.gregs[REG_R9] = va_arg (ap, long int); break; default: /* Put value on stack. */ - sp[(i - 5)] = va_arg (ap, int); + sp[i - 5] = va_arg (ap, unsigned long int); break; } va_end (ap); diff --git a/sysdeps/unix/sysv/linux/x86_64/vfork.S b/sysdeps/unix/sysv/linux/x86_64/vfork.S index 4bad38892b..e289656ad2 100644 --- a/sysdeps/unix/sysv/linux/x86_64/vfork.S +++ b/sysdeps/unix/sysv/linux/x86_64/vfork.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2002, 2004, 2008 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 @@ -31,6 +31,7 @@ ENTRY (__vfork) is preserved by the syscall and that we're allowed to destroy. */ popq %rdi cfi_adjust_cfa_offset(-8) + cfi_register(%rip, %rdi) #ifdef SAVE_PID SAVE_PID diff --git a/sysdeps/unix/sysv/syscalls.list b/sysdeps/unix/sysv/syscalls.list index 436d05eb9a..f65ed79f70 100644 --- a/sysdeps/unix/sysv/syscalls.list +++ b/sysdeps/unix/sysv/syscalls.list @@ -11,6 +11,6 @@ settimeofday - settimeofday i:PP __settimeofday settimeofday signal - signal i:ii signal stime - stime i:p stime time - time Ei:P time -times - times i:p __times times +times - times Ei:p __times times ulimit - ulimit i:ii ulimit utime - utime i:sP utime |