about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2004-10-12 12:00:26 +0000
committerJakub Jelinek <jakub@redhat.com>2004-10-12 12:00:26 +0000
commit3ee87ca7d4c813087eeee8b9fd04b7836244a54a (patch)
tree30d5d50dce77cb2e80d0bead19ee23e7d0a38617
parent7dbf6a6cd568437c4b2fa14bcf5a1914cc267527 (diff)
downloadglibc-3ee87ca7d4c813087eeee8b9fd04b7836244a54a.tar.gz
glibc-3ee87ca7d4c813087eeee8b9fd04b7836244a54a.tar.xz
glibc-3ee87ca7d4c813087eeee8b9fd04b7836244a54a.zip
Updated to fedora-glibc-20041012T1128 cvs/fedora-glibc-2_3_3-67
-rw-r--r--ChangeLog90
-rw-r--r--PROJECTS45
-rw-r--r--elf/dl-addr.c8
-rw-r--r--elf/dl-sym.c6
-rw-r--r--elf/tst-dlopenrpath.c2
-rw-r--r--fedora/branch.mk4
-rw-r--r--fedora/glibc.spec.in9
-rw-r--r--gmon/Makefile4
-rw-r--r--localedata/ChangeLog5
-rw-r--r--localedata/locales/fa_IR18
-rw-r--r--malloc/malloc.c4
-rw-r--r--misc/sys/uio.h12
-rw-r--r--nptl/ChangeLog12
-rw-r--r--nptl/allocatestack.c2
-rw-r--r--nptl/pt-allocrtsig.c2
-rw-r--r--nptl/pthread_attr_getstackaddr.c2
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h2
-rw-r--r--nptl/tst-clock2.c8
-rw-r--r--posix/tst-getaddrinfo2.c4
-rw-r--r--resolv/res_init.c3
-rw-r--r--resolv/res_mkquery.c2
-rw-r--r--resolv/res_send.c106
-rw-r--r--stdio-common/vfscanf.c80
-rw-r--r--sysdeps/m68k/fpu/bits/mathinline.h42
-rw-r--r--sysdeps/m68k/memcopy.h22
-rw-r--r--sysdeps/powerpc/powerpc64/Makefile7
-rw-r--r--sysdeps/powerpc/powerpc64/__longjmp-common.S1
-rw-r--r--sysdeps/powerpc/powerpc64/bsd-_setjmp.S12
-rw-r--r--sysdeps/powerpc/powerpc64/bsd-setjmp.S6
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_ceil.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_ceilf.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_copysign.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_floor.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_floorf.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_llrint.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_llrintf.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_llround.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_llroundf.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_rint.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_rintf.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_round.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_roundf.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_trunc.S1
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/s_truncf.S1
-rw-r--r--sysdeps/powerpc/powerpc64/memcpy.S2
-rw-r--r--sysdeps/powerpc/powerpc64/memset.S2
-rw-r--r--sysdeps/powerpc/powerpc64/setjmp-common.S4
-rw-r--r--sysdeps/powerpc/powerpc64/stpcpy.S1
-rw-r--r--sysdeps/powerpc/powerpc64/strchr.S1
-rw-r--r--sysdeps/powerpc/powerpc64/strcmp.S1
-rw-r--r--sysdeps/powerpc/powerpc64/strcpy.S1
-rw-r--r--sysdeps/powerpc/powerpc64/strlen.S1
-rw-r--r--sysdeps/powerpc/powerpc64/strncmp.S1
-rw-r--r--sysdeps/powerpc/powerpc64/sysdep.h68
-rw-r--r--timezone/asia22
-rw-r--r--timezone/private.h13
-rw-r--r--timezone/southamerica45
-rw-r--r--timezone/zdump.c73
58 files changed, 565 insertions, 205 deletions
diff --git a/ChangeLog b/ChangeLog
index aeb8bd9e93..b930c5e840 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,93 @@
+2004-10-11  Ulrich Drepper  <drepper@redhat.com>
+
+	* timezone/asia: Update from tzdata2004e.
+	* timezone/southamerica: Likewise.
+	* timezone/private.h: Update from tzcode2004e.
+	* timezone/zdump.c: Likewise.
+
+	* stdio-common/vfscanf.c: Add support for reading localized
+	digits.  Patch mainly by Hamed Malek <hamed@bamdad.org>.
+
+	* resolv/res_init.c (res_thread_freeres): Reset _res.options.
+	[BZ #434]
+
+	* resolv/res_send.c (send_dg): Use nonblocking sockets.  Add
+	appropriate poll/select calls and restart operation if necessary.
+	Also handle EINTR.
+
+	* elf/tst-dlopenrpath.c (do_test): Enable code which was disabled
+	for debugging.
+
+	* elf/dl-sym.c (do_sym): Avoid using global variable.
+
+	* elf/dl-addr.c (_dl_addr): Really use match everywhere.
+
+2004-10-09  Andreas Schwab  <schwab@suse.de>
+
+	* sysdeps/m68k/memcopy.h (WORD_COPY_BWD): Remove use of cast as
+	lvalue.
+
+	* sysdeps/m68k/fpu/bits/mathinline.h: Remove __THROW from inline
+	definitions.
+
+2004-10-07  Andreas Schwab  <schwab@suse.de>
+
+	* misc/sys/uio.h: Change __vector to __iovec to avoid clash with
+	altivec.
+
+2004-10-06  Alan Modra  <amodra@bigpond.net.au>
+
+	* gmon/Makefile (CFLAGS-mcount.c): Move before inclusion of "Rules".
+	* sysdeps/powerpc/powerpc64/Makefile (CFLAGS-mcount.c): Add
+	-msoft-float.
+	* sysdeps/powerpc/powerpc64/sysdep.h (SAVE_ARG, REST_ARG): New macros.
+	(CALL_MCOUNT): Replace with a gas macro implementation.
+	(EALIGN): Delete PROF version.
+	* sysdeps/powerpc/powerpc64/__longjmp-common.S: Invoke CALL_MCOUNT.
+	* sysdeps/powerpc/powerpc64/bsd-_setjmp.S: Likewise.
+	* sysdeps/powerpc/powerpc64/bsd-setjmp.S: Likewise.
+	* sysdeps/powerpc/powerpc64/setjmp-common.S: Likewise.
+	* sysdeps/powerpc/powerpc64/memcpy.S: Likewise.
+	* sysdeps/powerpc/powerpc64/memset.S: Likewise.
+	* sysdeps/powerpc/powerpc64/stpcpy.S: Likewise.
+	* sysdeps/powerpc/powerpc64/strchr.S: Likewise.
+	* sysdeps/powerpc/powerpc64/strcmp.S: Likewise.
+	* sysdeps/powerpc/powerpc64/strcpy.S: Likewise.
+	* sysdeps/powerpc/powerpc64/strlen.S: Likewise.
+	* sysdeps/powerpc/powerpc64/strncmp.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_ceil.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_ceilf.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_copysign.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_floor.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_floorf.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_llrint.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_llrintf.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_llround.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_llroundf.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_rint.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_rintf.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_round.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_roundf.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_trunc.S: Likewise.
+	* sysdeps/powerpc/powerpc64/fpu/s_truncf.S: Likewise.
+
+	* sysdeps/powerpc/powerpc64/setjmp-common.S: Add extra entry point
+	past _mcount call.
+	* sysdeps/powerpc/powerpc64/bsd-_setjmp.S: Use it.
+	* sysdeps/powerpc/powerpc64/bsd-setjmp.S: Likewise.
+
+2004-10-06  Ulrich Drepper  <drepper@redhat.com>
+
+	* resolv/res_mkquery.c (res_nmkquery): Reject randombits value if
+	low 16 bits are zero.
+
+2004-10-06  Jakub Jelinek  <jakub@redhat.com>
+
+	* posix/tst-getaddrinfo2.c: Include stdlib.h and string.h.
+	(do_test): Use %p instead of 0x%08X to print a pointer.
+
+	* malloc/malloc.c: Include stdio-common/_itoa.h.
+
 2004-10-05  Ulrich Drepper  <drepper@redhat.com>
 
 	* elf/rtld.c (dl_main): Use _dl_debug_printf instead of _dl_printf
diff --git a/PROJECTS b/PROJECTS
index 881d7d2046..92ca902943 100644
--- a/PROJECTS
+++ b/PROJECTS
@@ -1,6 +1,6 @@
 Open jobs for finishing GNU libc:
 ---------------------------------
-Status: September 2002
+Status: October 2004
 
 If you have time and talent to take over any of the jobs below please
 contact <bug-glibc@gnu.org>.
@@ -53,7 +53,7 @@ contact <bug-glibc@gnu.org>.
 
 
 [11] Write access function for netmasks, bootparams, and automount
-     databases for nss_files and nss_db module.
+     databases for nss_files, nss_nis, and nss_nisplus modules.
      The functions should be embedded in the nss scheme.  This is not
      hard and not all services must be supported at once.
 
@@ -76,7 +76,7 @@ contact <bug-glibc@gnu.org>.
 [18] Based on the sprof program we need tools to analyze the output.  The
      result should be a link map which specifies in which order the .o
      files are placed in the shared object.  This should help to improve
-     code locality and result in a smaller foorprint (in code and data
+     code locality and result in a smaller footprint (in code and data
      memory) since less pages are only used in small parts.
 
 
@@ -93,29 +93,6 @@ contact <bug-glibc@gnu.org>.
      available.
 
 
-[21] The nscd program and the stubs in the libc should be changed so
-     that each program uses only one socket connect.  Take a look at
-	http://people.redhat.com/drepper/nscd.html
-
-     An alternative approach is to use an mmap()ed file.  The idea is
-     the following:
-     - the nscd creates the hash tables and the information it stores
-       in it in a mmap()ed region.  This means no pointers must be
-       used, only offsets.
-     OR
-       if POSIX shared memory is available use a named shared memory
-       region to put the data in
-     - each program using NSS functionality tries to open the file
-       with the data.
-     - by checking some timestamp (which the nscd renews frequently)
-       the programs can test whether the file is still valid
-     - if the file is valid look through the nscd and locate the
-       appropriate hash table for the database and lookup the data.
-       If it is included we are set.
-     - if the data is not yet in the database we contact the nscd using
-       the currently implemented methods.
-
-
 [23] The `strptime' function needs to be completed.  This includes among
      other things that it must get teached about timezones.  The solution
      envisioned is to extract the timezones from the ADO timezone
@@ -127,18 +104,4 @@ contact <bug-glibc@gnu.org>.
      Australia/Canberra or if the current locale is en_AU.
 
 
-[25] Sun's nscd version implements a feature where the nscd keeps N entries
-     for each database current.  I.e., if an entries lifespan is over and
-     it is one of the N entries to be kept the nscd updates the information
-     instead of removing the entry.
-
-     How to decide about which N entries to keep has to be examined.
-     Factors should be number of uses (of course), influenced by aging.
-     Just imagine a computer used by several people.  The IDs of the current
-     user should be preferred even if the last user spent more time.
-
-
-[27] We need a second test suite with tests which cannot run during a normal
-     `make check' run.  This test suite can require root priviledges and
-     can test things like DNS (i.e., require network access),
-     user-interaction, networking in general, and probably many other things.
+[27] ...deleted...
diff --git a/elf/dl-addr.c b/elf/dl-addr.c
index ae97398bad..c373eb3b17 100644
--- a/elf/dl-addr.c
+++ b/elf/dl-addr.c
@@ -28,7 +28,7 @@ _dl_addr (const void *address, Dl_info *info,
 	  struct link_map **mapp, const ElfW(Sym) **symbolp)
 {
   const ElfW(Addr) addr = DL_LOOKUP_ADDRESS (address);
-  struct link_map *l, *match;
+  struct link_map *match;
   const ElfW(Sym) *symtab, *matchsym, *symtabend;
   const char *strtab;
   ElfW(Word) strtabsize;
@@ -38,7 +38,7 @@ _dl_addr (const void *address, Dl_info *info,
 
   /* Find the highest-addressed object that ADDRESS is not below.  */
   match = NULL;
-  for (l = GL(dl_loaded); l; l = l->l_next)
+  for (struct link_map *l = GL(dl_loaded); l; l = l->l_next)
     if (addr >= l->l_map_start && addr < l->l_map_end)
       {
 	/* We know ADDRESS lies within L if in any shared object.
@@ -67,8 +67,8 @@ _dl_addr (const void *address, Dl_info *info,
       info->dli_fbase = (void *) match->l_map_start;
 
       /* If this is the main program the information is incomplete.  */
-      if (__builtin_expect (l->l_name[0], 'a') == '\0'
-	  && l->l_type == lt_executable)
+      if (__builtin_expect (match->l_name[0], 'a') == '\0'
+	  && match->l_type == lt_executable)
 	info->dli_fname = _dl_argv[0];
 
       symtab = (const void *) D_PTR (match, l_info[DT_SYMTAB]);
diff --git a/elf/dl-sym.c b/elf/dl-sym.c
index c7c737804e..a94610263d 100644
--- a/elf/dl-sym.c
+++ b/elf/dl-sym.c
@@ -90,9 +90,9 @@ do_sym (void *handle, const char *name, void *who,
     {
       if (__builtin_expect (match == GL(dl_loaded), 0))
 	{
-	  if (! GL(dl_loaded)
-	      || caller < GL(dl_loaded)->l_map_start
-	      || caller >= GL(dl_loaded)->l_map_end)
+	  if (match == NULL
+	      || caller < match->l_map_start
+	      || caller >= match->l_map_end)
 	    GLRO(dl_signal_error) (0, NULL, NULL, N_("\
 RTLD_NEXT used in code not dynamically loaded"));
 	}
diff --git a/elf/tst-dlopenrpath.c b/elf/tst-dlopenrpath.c
index 964f103b8c..bd4d888f34 100644
--- a/elf/tst-dlopenrpath.c
+++ b/elf/tst-dlopenrpath.c
@@ -62,10 +62,8 @@ do_test (void)
   result = foo ();
 
  out:
-#if 0
   unlink (PFX "test-subdir/in-subdir.so");
   rmdir (testsubdir);
-#endif
 
   return result;
 }
diff --git a/fedora/branch.mk b/fedora/branch.mk
index 086ea6912b..abdfc0ce41 100644
--- a/fedora/branch.mk
+++ b/fedora/branch.mk
@@ -1,5 +1,5 @@
 # This file is updated automatically by Makefile.
 glibc-branch := fedora
 glibc-base := HEAD
-fedora-sync-date := 2004-10-06 09:00 UTC
-fedora-sync-tag := fedora-glibc-20041006T0900
+fedora-sync-date := 2004-10-12 11:28 UTC
+fedora-sync-tag := fedora-glibc-20041012T1128
diff --git a/fedora/glibc.spec.in b/fedora/glibc.spec.in
index b93411f1d7..766d7c5518 100644
--- a/fedora/glibc.spec.in
+++ b/fedora/glibc.spec.in
@@ -1,4 +1,4 @@
-%define glibcrelease 66
+%define glibcrelease 67
 %define auxarches i586 i686 athlon sparcv9 alphaev6
 %define prelinkarches noarch
 %define nptlarches i386 i686 athlon x86_64 ia64 s390 s390x sparcv9 ppc ppc64
@@ -1239,6 +1239,13 @@ rm -f *.filelist*
 %endif
 
 %changelog
+* Tue Oct 12 2004 Jakub Jelinek <jakub@redhat.com> 2.3.3-67
+- update from CVS
+  - use non-blocking sockets in resolver (#135234)
+  - reset pd->res options on thread exit, so that threads
+    reusing cached stacks get resolver state properly initialized
+    (BZ #434)
+
 * Wed Oct  6 2004 Jakub Jelinek <jakub@redhat.com> 2.3.3-66
 - update from CVS
 - avoid using perl in the spec file, buildrequire sed >= 3.95
diff --git a/gmon/Makefile b/gmon/Makefile
index 060ede1f8f..80a79456f7 100644
--- a/gmon/Makefile
+++ b/gmon/Makefile
@@ -29,11 +29,11 @@ elide-routines.os = bb_init_func bb_exit_func
 
 tests	:= tst-sprofil
 
-include ../Rules
-
 # The mcount code won't work without a frame pointer.
 CFLAGS-mcount.c := -fno-omit-frame-pointer
 
+include ../Rules
+
 # We cannot compile mcount.c with -pg because that would
 # create recursive calls.  Just copy the normal static object.
 # On systems where `profil' is not a system call, the same
diff --git a/localedata/ChangeLog b/localedata/ChangeLog
index 065136e8d7..5f362c62b7 100644
--- a/localedata/ChangeLog
+++ b/localedata/ChangeLog
@@ -1,3 +1,8 @@
+2004-10-11  Ulrich Drepper  <drepper@redhat.com>
+
+	* locales/fa_IR: Add to_inpunct map.
+	Patch by Hamed Malek <hamed@bamdad.org>.
+
 2004-10-04  Ulrich Drepper  <drepper@redhat.com>
 
 	* locales/gu_IN: Update various incorrect and missing information.
diff --git a/localedata/locales/fa_IR b/localedata/locales/fa_IR
index 128c5d8cdc..8f65b1edd8 100644
--- a/localedata/locales/fa_IR
+++ b/localedata/locales/fa_IR
@@ -10,8 +10,8 @@ escape_char  /
 % Fax: +98 21 6019568
 % Language: fa
 % Territory: IR
-% Revision: 2.3
-% Date: 2004-03-16
+% Revision: 2.4
+% Date: 2004-09-04
 % Users: general
 % Repertoiremap:
 % Charset: UTF-8
@@ -50,6 +50,20 @@ copy "i18n"
 
 outdigit <U06F0>..<U06F9>
 
+map to_inpunct; /
+  (<U0030>,<U06F0>); /
+  (<U0031>,<U06F1>); /
+  (<U0032>,<U06F2>); /
+  (<U0033>,<U06F3>); /
+  (<U0034>,<U06F4>); /
+  (<U0035>,<U06F5>); /
+  (<U0036>,<U06F6>); /
+  (<U0037>,<U06F7>); /
+  (<U0038>,<U06F8>); /
+  (<U0039>,<U06F9>); /
+  (<U002E>,<U066B>); /
+  (<U002C>,<U066C>)
+
 map to_outpunct; /
   (<U002E>,<U066B>); /
   (<U002C>,<U066C>)
diff --git a/malloc/malloc.c b/malloc/malloc.c
index a41171490a..ad6009a198 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -257,6 +257,10 @@
 
 #include <malloc-machine.h>
 
+#ifdef _LIBC
+#include <stdio-common/_itoa.h>
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/misc/sys/uio.h b/misc/sys/uio.h
index 53add9f2e2..1b203f71c2 100644
--- a/misc/sys/uio.h
+++ b/misc/sys/uio.h
@@ -30,24 +30,24 @@ __BEGIN_DECLS
 
 
 /* Read data from file descriptor FD, and put the result in the
-   buffers described by VECTOR, which is a vector of COUNT `struct iovec's.
+   buffers described by IOVEC, which is a vector of COUNT `struct iovec's.
    The buffers are filled in the order specified.
    Operates just like `read' (see <unistd.h>) except that data are
-   put in VECTOR instead of a contiguous buffer.
+   put in IOVEC instead of a contiguous buffer.
 
    This function is a cancellation point and therefore not marked with
    __THROW.  */
-extern ssize_t readv (int __fd, __const struct iovec *__vector, int __count);
+extern ssize_t readv (int __fd, __const struct iovec *__iovec, int __count);
 
-/* Write data pointed by the buffers described by VECTOR, which
+/* Write data pointed by the buffers described by IOVEC, which
    is a vector of COUNT `struct iovec's, to file descriptor FD.
    The data is written in the order specified.
    Operates just like `write' (see <unistd.h>) except that the data
-   are taken from VECTOR instead of a contiguous buffer.
+   are taken from IOVEC instead of a contiguous buffer.
 
    This function is a cancellation point and therefore not marked with
    __THROW.  */
-extern ssize_t writev (int __fd, __const struct iovec *__vector, int __count);
+extern ssize_t writev (int __fd, __const struct iovec *__iovec, int __count);
 
 __END_DECLS
 
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 5d488cd1a5..e842302cb8 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -4,9 +4,17 @@
 	of pthread-functions.h and pthreaddef.h.
 	* sysdeps/unix/sysv/linux/s390/jmp-unwind.c: Likewise.
 
+	* sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h (pthread_cond_t):
+	Change __data.__nwaiters from int to unsigned int.
+
+	* tst-clock2.c (do_test): Don't fail if _POSIX_THREAD_CPUTIME == 0 and
+	sysconf (_SC_THREAD_CPUTIME) returns negative value.
+
+	* allocatestack.c (__find_thread_by_id): Move attribute_hidden
+	before return type.
+
 	* sysdeps/s390/jmpbuf-unwind.h: Include bits/wordsize.h.
-	(JMPBUF_CFA_UNWINDS_ADJ): Subtract 96 resp. 160 bytes from
-	CFA.
+	(JMPBUF_CFA_UNWINDS_ADJ): Subtract 96 resp. 160 bytes from CFA.
 
 2004-10-06  Ulrich Drepper  <drepper@redhat.com>
 
diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
index 242da0a5a1..d4f3188f53 100644
--- a/nptl/allocatestack.c
+++ b/nptl/allocatestack.c
@@ -772,8 +772,8 @@ __reclaim_stacks (void)
 
 #if HP_TIMING_AVAIL
 /* Find a thread given the thread ID.  */
-struct pthread *
 attribute_hidden
+struct pthread *
 __find_thread_by_id (pid_t tid)
 {
   struct pthread *result = NULL;
diff --git a/nptl/pt-allocrtsig.c b/nptl/pt-allocrtsig.c
index 9481e15f25..347bf139ad 100644
--- a/nptl/pt-allocrtsig.c
+++ b/nptl/pt-allocrtsig.c
@@ -28,7 +28,7 @@ extern int __libc_allocate_rtsig_private (int high);
 
 
 /* We reserve __SIGRTMIN for use as the cancellation signal and
-   __SIGRTMIN+1 to andle setuid et.al.  These signals are used
+   __SIGRTMIN+1 to handle setuid et.al.  These signals are used
    internally.  */
 int
 __libc_current_sigrtmin (void)
diff --git a/nptl/pthread_attr_getstackaddr.c b/nptl/pthread_attr_getstackaddr.c
index e6e25880ab..7656600dd5 100644
--- a/nptl/pthread_attr_getstackaddr.c
+++ b/nptl/pthread_attr_getstackaddr.c
@@ -33,7 +33,7 @@ __pthread_attr_getstackaddr (attr, stackaddr)
   iattr = (struct pthread_attr *) attr;
 
   /* Some code assumes this function to work even if no stack address
-     has been set.  Let them figure it our for themselves what the
+     has been set.  Let them figure it out for themselves what the
      value means.  Simply store the result.  */
   *stackaddr = iattr->stackaddr;
 
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h b/nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
index 03c2ef8106..92fb08c951 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
@@ -100,7 +100,7 @@ typedef union
     __extension__ unsigned long long int __wakeup_seq;
     __extension__ unsigned long long int __woken_seq;
     void *__mutex;
-    int __nwaiters;
+    unsigned int __nwaiters;
     unsigned int __broadcast_seq;
   } __data;
   char __size[__SIZEOF_PTHREAD_COND_T];
diff --git a/nptl/tst-clock2.c b/nptl/tst-clock2.c
index fd216b2ba1..bca40956e2 100644
--- a/nptl/tst-clock2.c
+++ b/nptl/tst-clock2.c
@@ -58,6 +58,14 @@ do_test (void)
 #if defined _POSIX_THREAD_CPUTIME && _POSIX_THREAD_CPUTIME >= 0
 # define N 10
 
+# if _POSIX_THREAD_CPUTIME == 0
+  if (sysconf (_SC_THREAD_CPUTIME) < 0)
+    {
+      puts ("_POSIX_THREAD_CPUTIME option not available");
+      return 0;
+    }
+# endif
+
   if (pthread_barrier_init (&b2, NULL, 2) != 0
       || pthread_barrier_init (&bN, NULL, N + 1) != 0)
     {
diff --git a/posix/tst-getaddrinfo2.c b/posix/tst-getaddrinfo2.c
index b0bce5925c..13edca0a34 100644
--- a/posix/tst-getaddrinfo2.c
+++ b/posix/tst-getaddrinfo2.c
@@ -2,6 +2,8 @@
 #include <errno.h>
 #include <netdb.h>
 #include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
 #include <sys/socket.h>
 
 static int
@@ -47,7 +49,7 @@ do_test (void)
       if (err)
         {
           printf ("FAIL getaddrinfo IPv4 socktype 0,513: "
-                  "fam %d alen %d addr 0x%08X addr/fam %d "
+                  "fam %d alen %d addr %p addr/fam %d "
                   "addr/port %d H[%d]\n",
                   pai->ai_family, pai->ai_addrlen, psin,
                   psin ? psin->sin_family : 0,
diff --git a/resolv/res_init.c b/resolv/res_init.c
index 4087597a87..731c784e17 100644
--- a/resolv/res_init.c
+++ b/resolv/res_init.c
@@ -597,6 +597,9 @@ res_thread_freeres (void)
 	free (_res._u._ext.nsaddrs[ns]);
 	_res._u._ext.nsaddrs[ns] = NULL;
       }
+
+  /* Make sure we do a full re-initialization the next time.  */
+  _res.options = 0;
 }
 text_set_element (__libc_thread_subfreeres, res_thread_freeres);
 text_set_element (__libc_subfreeres, res_thread_freeres);
diff --git a/resolv/res_mkquery.c b/resolv/res_mkquery.c
index 5b705b0e8b..9825ae0fa3 100644
--- a/resolv/res_mkquery.c
+++ b/resolv/res_mkquery.c
@@ -141,7 +141,7 @@ res_nmkquery(res_state statp,
 	    randombits = (tv.tv_sec << 8) ^ tv.tv_usec;
 #endif
 	  }
-	while (randombits == 0);
+	while ((randombits & 0xffff) == 0);
 	statp->id = (statp->id + randombits) & 0xffff;
 #endif
 	hp->opcode = op;
diff --git a/resolv/res_send.c b/resolv/res_send.c
index 2366f59cd2..44d8cb0fee 100644
--- a/resolv/res_send.c
+++ b/resolv/res_send.c
@@ -88,6 +88,7 @@ static const char rcsid[] = "$BINDId: res_send.c,v 8.38 2000/03/30 20:16:51 vixi
 #include <sys/ioctl.h>
 
 #include <errno.h>
+#include <fcntl.h>
 #include <netdb.h>
 #include <resolv.h>
 #include <signal.h>
@@ -965,12 +966,73 @@ send_dg(res_state statp,
 			return (0);
 		}
 #endif /* !CANNOT_CONNECT_DGRAM */
+		/* Make socket non-blocking.  */
+		int fl = __fcntl (EXT(statp).nssocks[ns], F_GETFL);
+		if  (fl != -1)
+			__fcntl (EXT(statp).nssocks[ns], F_SETFL,
+				 fl | O_NONBLOCK);
 		Dprint(statp->options & RES_DEBUG,
 		       (stdout, ";; new DG socket\n"))
 	}
 	s = EXT(statp).nssocks[ns];
+	/*
+	 * Compute time for the total operation.
+	 */
+	seconds = (statp->retrans << ns);
+	if (ns > 0)
+		seconds /= statp->nscount;
+	if (seconds <= 0)
+		seconds = 1;
+	evNowTime(&now);
+	evConsTime(&timeout, seconds, 0);
+	evAddTime(&finish, &now, &timeout);
+	int need_recompute = 0;
+ resend:
+#ifdef _LIBC
+        /* Convert struct timespec in milliseconds.  */
+	ptimeout = timeout.tv_sec * 1000 + timeout.tv_nsec / 1000000;
+
+	pfd[0].fd = s;
+	pfd[0].events = POLLOUT;
+	n = __poll (pfd, 1, 0);
+	if (__builtin_expect (n == 0, 0)) {
+		n = __poll (pfd, 1, ptimeout);
+		need_recompute = 1;
+	}
+#else
+	FD_ZERO(&dsmask);
+	FD_SET(s, &dsmask);
+	struct timeval zerotime = { 0, 0 };
+	n = pselect(s + 1, NULL, &dsmask, NULL, &zerotime, NULL);
+	if (n == 0) {
+		n = pselect(s + 1, NULL, &dsmask, NULL, &timeout, NULL);
+		need_recompute = 1;
+	}
+#endif
+	if (n == 0) {
+		Dprint(statp->options & RES_DEBUG, (stdout,
+						    ";; timeout sending\n"));
+		*gotsomewhere = 1;
+		return (0);
+	}
+	if (n < 0) {
+		if (errno == EINTR) {
+		recompute_resend:
+			evNowTime(&now);
+			if (evCmpTime(finish, now) > 0) {
+				evSubTime(&timeout, &finish, &now);
+				goto resend;
+			}
+		}
+		Perror(statp, stderr, "select", errno);
+		res_nclose(statp);
+		return (0);
+	}
+	__set_errno (0);
 #ifndef CANNOT_CONNECT_DGRAM
 	if (send(s, (char*)buf, buflen, 0) != buflen) {
+		if (errno == EINTR || errno == EAGAIN)
+			goto recompute_resend;
 		Perror(statp, stderr, "send", errno);
 		res_nclose(statp);
 		return (0);
@@ -984,6 +1046,8 @@ send_dg(res_state statp,
 	if (sendto(s, (char*)buf, buflen, 0,
 		   (struct sockaddr *)nsap, sizeof *nsap) != buflen)
 	{
+		if (errno == EINTR || errno == EAGAIN)
+			goto recompute_resend;
 		Aerror(statp, stderr, "sendto", errno,
 		       (struct sockaddr *) nsap);
 		res_nclose(statp);
@@ -991,46 +1055,38 @@ send_dg(res_state statp,
 	}
 #endif /* !CANNOT_CONNECT_DGRAM */
 
-	/*
-	 * Wait for reply.
-	 */
-	seconds = (statp->retrans << ns);
-	if (ns > 0)
-		seconds /= statp->nscount;
-	if (seconds <= 0)
-		seconds = 1;
-	evNowTime(&now);
-	evConsTime(&timeout, seconds, 0);
-	evAddTime(&finish, &now, &timeout);
  wait:
+	if (need_recompute) {
+		evNowTime(&now);
+		if (evCmpTime(finish, now) <= 0) {
+		err_return:
+			Perror(statp, stderr, "select", errno);
+			res_nclose(statp);
+			return (0);
+		}
+		evSubTime(&timeout, &finish, &now);
+	}
 #ifdef _LIBC
         /* Convert struct timespec in milliseconds.  */
 	ptimeout = timeout.tv_sec * 1000 + timeout.tv_nsec / 1000000;
 
-	pfd[0].fd = s;
 	pfd[0].events = POLLIN;
 	n = __poll (pfd, 1, ptimeout);
 #else
-	FD_ZERO(&dsmask);
-	FD_SET(s, &dsmask);
 	n = pselect(s + 1, &dsmask, NULL, NULL, &timeout, NULL);
 #endif
 	if (n == 0) {
-		Dprint(statp->options & RES_DEBUG, (stdout, ";; timeout\n"));
+		Dprint(statp->options & RES_DEBUG, (stdout,
+						    ";; timeout receiving\n"));
 		*gotsomewhere = 1;
 		return (0);
 	}
 	if (n < 0) {
 		if (errno == EINTR) {
-			evNowTime(&now);
-			if (evCmpTime(finish, now) > 0) {
-				evSubTime(&timeout, &finish, &now);
-				goto wait;
-			}
+			need_recompute = 1;
+			goto wait;
 		}
-		Perror(statp, stderr, "select", errno);
-		res_nclose(statp);
-		return (0);
+		goto err_return;
 	}
 	__set_errno (0);
 #ifdef _LIBC
@@ -1056,6 +1112,10 @@ send_dg(res_state statp,
 	resplen = recvfrom(s, (char*)ans, anssiz,0,
 			   (struct sockaddr *)&from, &fromlen);
 	if (resplen <= 0) {
+		if (errno == EINTR || errno == EAGAIN) {
+			need_recompute = 1;
+			goto wait;
+		}
 		Perror(statp, stderr, "recvfrom", errno);
 		res_nclose(statp);
 		return (0);
diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c
index 63e7bd8815..c641d2d371 100644
--- a/stdio-common/vfscanf.c
+++ b/stdio-common/vfscanf.c
@@ -1163,9 +1163,15 @@ _IO_vfscanf (s, format, argptr, errp)
 	      int level;
 #ifdef COMPILE_WSCANF
 	      const wchar_t *wcdigits[10];
+	      const wchar_t *wcdigits_extended[10];
 #else
 	      const char *mbdigits[10];
+	      const char *mbdigits_extended[10];
 #endif
+	      /*  "to_inpunct" is a map from ASCII digits to their
+		  equivalent in locale. This is defined for locales
+		  which use an extra digits set.  */
+	      wctrans_t map = __wctrans ("to_inpunct");
 	      int n;
 
 	      from_level = 0;
@@ -1176,6 +1182,66 @@ _IO_vfscanf (s, format, argptr, errp)
 	      to_level = (uint32_t) curctype->values[_NL_ITEM_INDEX (_NL_CTYPE_INDIGITS_MB_LEN)].word - 1;
 #endif
 
+	      /* Get the alternative digit forms if there are any.  */
+	      if (__builtin_expect (map != NULL, 0))
+		{
+		  /*  Adding new level for extra digits set in locale file.  */
+		  ++to_level;
+
+		  for (n = 0; n < 10; ++n)
+		    {
+#ifdef COMPILE_WSCANF
+		      wcdigits[n] = (const wchar_t *)
+                        _NL_CURRENT (LC_CTYPE, _NL_CTYPE_INDIGITS0_WC + n);
+
+		      wchar_t *wc_extended = (wchar_t *)
+			alloca ((to_level + 2) * sizeof (wchar_t));
+		      __wmemcpy (wc_extended, wcdigits[n], to_level);
+		      wc_extended[to_level] = __towctrans (L'0' + n, map);
+		      wc_extended[to_level + 1] = '\0';
+		      wcdigits_extended[n] = wc_extended;
+#else
+		      mbdigits[n]
+                        = curctype->values[_NL_CTYPE_INDIGITS0_MB + n].string;
+
+		      /*  Get the equivalent wide char in map.  */
+		      wint_t extra_wcdigit = __towctrans (L'0' + n, map);
+
+		      /*  Convert it to multibyte representation.  */
+		      mbstate_t state;
+		      memset (&state, '\0', sizeof (state));
+
+		      char extra_mbdigit[MB_LEN_MAX];
+		      size_t mblen
+			= __wcrtomb (extra_mbdigit, extra_wcdigit, &state);
+
+		      if (mblen == (size_t) -1)
+			{
+			  /*  Ignore this new level.  */
+			  map = NULL;
+			  break;
+			}
+
+		      /*  Calculate the length of mbdigits[n].  */
+		      const char *last_char = mbdigits[n];
+		      for (level = 0; level < to_level; ++level)
+			last_char = strchr (last_char, '\0') + 1;
+
+		      size_t mbdigits_len = last_char - mbdigits[n];
+
+		      /*  Allocate memory for extended multibyte digit.  */
+		      char *mb_extended;
+		      mb_extended = (char *) alloca (mbdigits_len + mblen + 1);
+
+		      /*  And get the mbdigits + extra_digit string.  */
+		      *(char *) __mempcpy (__mempcpy (mb_extended, mbdigits[n],
+						      mbdigits_len),
+					   extra_mbdigit, mblen) = '\0';
+		      mbdigits_extended[n] = mb_extended;
+#endif
+		    }
+		}
+
 	      /* Read the number into workspace.  */
 	      while (c != EOF && width != 0)
 		{
@@ -1185,8 +1251,11 @@ _IO_vfscanf (s, format, argptr, errp)
 		    {
 		      /* Get the string for the digits with value N.  */
 #ifdef COMPILE_WSCANF
-		      wcdigits[n] = (const wchar_t *)
-			_NL_CURRENT (LC_CTYPE, _NL_CTYPE_INDIGITS0_WC + n);
+		      if (__builtin_expect (map != NULL, 0))
+			wcdigits[n] = wcdigits_extended[n];
+		      else
+			wcdigits[n] = (const wchar_t *)
+			  _NL_CURRENT (LC_CTYPE, _NL_CTYPE_INDIGITS0_WC + n);
 		      wcdigits[n] += from_level;
 
 		      if (c == (wint_t) *wcdigits[n])
@@ -1201,8 +1270,11 @@ _IO_vfscanf (s, format, argptr, errp)
 		      const char *cmpp;
 		      int avail = width > 0 ? width : INT_MAX;
 
-		      mbdigits[n]
-			= curctype->values[_NL_CTYPE_INDIGITS0_MB + n].string;
+		      if (__builtin_expect (map != NULL, 0))
+			mbdigits[n] = mbdigits_extended[n];
+		      else
+			mbdigits[n]
+			  = curctype->values[_NL_CTYPE_INDIGITS0_MB + n].string;
 
 		      for (level = 0; level < from_level; level++)
 			mbdigits[n] = strchr (mbdigits[n], '\0') + 1;
diff --git a/sysdeps/m68k/fpu/bits/mathinline.h b/sysdeps/m68k/fpu/bits/mathinline.h
index 1e43e43047..acbac47aac 100644
--- a/sysdeps/m68k/fpu/bits/mathinline.h
+++ b/sysdeps/m68k/fpu/bits/mathinline.h
@@ -1,5 +1,5 @@
 /* Definitions of inline math functions implemented by the m68881/2.
-   Copyright (C) 1991,92,93,94,96,97,98,99,2000,2002, 2003
+   Copyright (C) 1991,92,93,94,96,97,98,99,2000,2002, 2003, 2004
      Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -110,7 +110,7 @@
 #if defined __USE_MISC || defined __USE_ISOC99
 # define __inline_mathop(func, op)			\
   __inline_mathop1(double, func, op)			\
-  __inline_mathop1(float, __CONCAT(func,f), op)		\
+  __inline_mathop1(float, __CONCAT(func,f), op)	\
   __inline_mathop1(long double, __CONCAT(func,l), op)
 #else
 # define __inline_mathop(func, op)			\
@@ -118,7 +118,7 @@
 #endif
 
 #define __inline_mathop1(float_type,func, op)				      \
-  __m81_defun (float_type, func, (float_type __mathop_x)) __THROW	      \
+  __m81_defun (float_type, func, (float_type __mathop_x))		      \
   {									      \
     float_type __result;						      \
     __asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\
@@ -175,7 +175,7 @@ __inline_mathop(trunc, intrz)
    for the function names.  */
 
 #define __inline_functions(float_type, s)				  \
-__m81_defun (float_type, __CONCAT(__floor,s), (float_type __x))	__THROW	  \
+__m81_defun (float_type, __CONCAT(__floor,s), (float_type __x))	  \
 {									  \
   float_type __result;							  \
   unsigned long int __ctrl_reg;						  \
@@ -191,7 +191,7 @@ __m81_defun (float_type, __CONCAT(__floor,s), (float_type __x))	__THROW	  \
   return __result;							  \
 }									  \
 									  \
-__m81_defun (float_type, __CONCAT(__ceil,s), (float_type __x)) __THROW	  \
+__m81_defun (float_type, __CONCAT(__ceil,s), (float_type __x))	  	  \
 {									  \
   float_type __result;							  \
   unsigned long int __ctrl_reg;						  \
@@ -217,7 +217,7 @@ __inline_functions(long double,l)
 #ifdef __USE_MISC
 
 # define __inline_functions(float_type, s)				  \
-__m81_defun (int, __CONCAT(__isinf,s), (float_type __value)) __THROW	  \
+__m81_defun (int, __CONCAT(__isinf,s), (float_type __value))	  	  \
 {									  \
   /* There is no branch-condition for infinity,				  \
      so we must extract and examine the condition codes manually.  */	  \
@@ -227,7 +227,7 @@ __m81_defun (int, __CONCAT(__isinf,s), (float_type __value)) __THROW	  \
   return (__fpsr & (2 << 24)) ? (__fpsr & (8 << 24) ? -1 : 1) : 0;	  \
 }									  \
 									  \
-__m81_defun (int, __CONCAT(__finite,s), (float_type __value)) __THROW	  \
+__m81_defun (int, __CONCAT(__finite,s), (float_type __value))	  	  \
 {									  \
   /* There is no branch-condition for infinity, so we must extract and	  \
      examine the condition codes manually.  */				  \
@@ -238,7 +238,7 @@ __m81_defun (int, __CONCAT(__finite,s), (float_type __value)) __THROW	  \
 }									  \
 									  \
 __m81_defun (float_type, __CONCAT(__scalbn,s),				  \
-	     (float_type __x, int __n))	__THROW				  \
+	     (float_type __x, int __n))					  \
 {									  \
   float_type __result;							  \
   __asm ("fscale%.l %1, %0" : "=f" (__result) : "dmi" (__n), "0" (__x));  \
@@ -255,7 +255,7 @@ __inline_functions(long double,l)
 #if defined __USE_MISC || defined __USE_XOPEN
 
 # define __inline_functions(float_type, s)				  \
-__m81_defun (int, __CONCAT(__isnan,s), (float_type __value)) __THROW	  \
+__m81_defun (int, __CONCAT(__isnan,s), (float_type __value))	  	  \
 {									  \
   char __result;							  \
   __asm("ftst%.x %1\n"							  \
@@ -275,7 +275,7 @@ __inline_functions(long double,l)
 #ifdef __USE_ISOC99
 
 # define __inline_functions(float_type, s)				  \
-__m81_defun (int, __CONCAT(__signbit,s), (float_type __value)) __THROW	  \
+__m81_defun (int, __CONCAT(__signbit,s), (float_type __value))	  	  \
 {									  \
   /* There is no branch-condition for the sign bit, so we must extract	  \
      and examine the condition codes manually.  */			  \
@@ -285,13 +285,13 @@ __m81_defun (int, __CONCAT(__signbit,s), (float_type __value)) __THROW	  \
   return (__fpsr >> 27) & 1;						  \
 }									  \
 									  \
-__m81_defun (float_type, __CONCAT(__scalbln,s),				  \
-	     (float_type __x, long int __n)) __THROW			  \
+  __m81_defun (float_type, __CONCAT(__scalbln,s),			  \
+	     (float_type __x, long int __n))				  \
 {									  \
   return __CONCAT(__scalbn,s) (__x, __n);				  \
 }									  \
 									  \
-__m81_defun (float_type, __CONCAT(__nearbyint,s), (float_type __x)) __THROW \
+__m81_defun (float_type, __CONCAT(__nearbyint,s), (float_type __x))	  \
 {									  \
   float_type __result;							  \
   unsigned long int __ctrl_reg;						  \
@@ -305,7 +305,7 @@ __m81_defun (float_type, __CONCAT(__nearbyint,s), (float_type __x)) __THROW \
   return __result;							  \
 }									  \
 									  \
-__m81_defun (long int, __CONCAT(__lrint,s), (float_type __x)) __THROW	  \
+__m81_defun (long int, __CONCAT(__lrint,s), (float_type __x))		  \
 {									  \
   long int __result;							  \
   __asm ("fmove%.l %1, %0" : "=dm" (__result) : "f" (__x));		  \
@@ -314,7 +314,7 @@ __m81_defun (long int, __CONCAT(__lrint,s), (float_type __x)) __THROW	  \
 									  \
 __m81_inline float_type							  \
 __m81_u(__CONCAT(__fma,s))(float_type __x, float_type __y,		  \
-			   float_type __z) __THROW			  \
+			   float_type __z)				  \
 {									  \
   return (__x * __y) + __z;						  \
 }
@@ -331,7 +331,7 @@ __inline_functions (long double,l)
 # define __inline_functions(float_type, s)				\
 __m81_inline void							\
 __m81_u(__CONCAT(__sincos,s))(float_type __x, float_type *__sinx,	\
-			      float_type *__cosx) __THROW		\
+			      float_type *__cosx)			\
 {									\
   __asm ("fsincos%.x %2,%1:%0"						\
 	 : "=f" (*__sinx), "=f" (*__cosx) : "f" (__x));			\
@@ -351,14 +351,14 @@ __inline_functions (long double,l)
 /* Note that there must be no whitespace before the argument passed for
    NAME, to make token pasting work correctly with -traditional.  */
 # define __inline_forward_c(rettype, name, args1, args2)	\
-extern __inline rettype __attribute__((__const__))	\
-name args1 __THROW					\
-{							\
-  return __CONCAT(__,name) args2;			\
+extern __inline rettype __attribute__((__const__))		\
+  name args1							\
+{								\
+  return __CONCAT(__,name) args2;				\
 }
 
 # define __inline_forward(rettype, name, args1, args2)	\
-extern __inline rettype name args1 __THROW		\
+extern __inline rettype name args1			\
 {							\
   return __CONCAT(__,name) args2;			\
 }
diff --git a/sysdeps/m68k/memcopy.h b/sysdeps/m68k/memcopy.h
index cdc268ad51..0951eeaf7a 100644
--- a/sysdeps/m68k/memcopy.h
+++ b/sysdeps/m68k/memcopy.h
@@ -1,5 +1,5 @@
 /* memcopy.h -- definitions for memory copy functions.  Motorola 68020 version.
-   Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1997, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Torbjorn Granlund (tege@sics.se).
 
@@ -68,29 +68,33 @@
   do									      \
     {									      \
       size_t __nblocks = (nbytes) / 32 + 1;				      \
+      op_t *__dst_ep = (op_t *) (dst_ep);				      \
+      op_t *__src_ep = (op_t *) (src_ep);				      \
       switch ((nbytes) / sizeof (op_t) % 8)				      \
 	do								      \
 	  {								      \
-	    *--((op_t *) dst_ep) = *--((op_t *) src_ep);		      \
+	    *--__dst_ep = *--__src_ep;					      \
 	  case 7:							      \
-	    *--((op_t *) dst_ep) = *--((op_t *) src_ep);		      \
+	    *--__dst_ep = *--__src_ep;					      \
 	  case 6:							      \
-	    *--((op_t *) dst_ep) = *--((op_t *) src_ep);		      \
+	    *--__dst_ep = *--__src_ep;					      \
 	  case 5:							      \
-	    *--((op_t *) dst_ep) = *--((op_t *) src_ep);		      \
+	    *--__dst_ep = *--__src_ep;					      \
 	  case 4:							      \
-	    *--((op_t *) dst_ep) = *--((op_t *) src_ep);		      \
+	    *--__dst_ep = *--__src_ep;					      \
 	  case 3:							      \
-	    *--((op_t *) dst_ep) = *--((op_t *) src_ep);		      \
+	    *--__dst_ep = *--__src_ep;					      \
 	  case 2:							      \
-	    *--((op_t *) dst_ep) = *--((op_t *) src_ep);		      \
+	    *--__dst_ep = *--__src_ep;					      \
 	  case 1:							      \
-	    *--((op_t *) dst_ep) = *--((op_t *) src_ep);		      \
+	    *--__dst_ep = *--__src_ep;					      \
 	  case 0:							      \
 	    __nblocks--;						      \
 	  }								      \
       while (__nblocks != 0);						      \
       (nbytes_left) = (nbytes) % sizeof (op_t);				      \
+      (dst_ep) = (unsigned long) __dst_ep;				      \
+      (src_ep) = (unsigned long) __src_ep;				      \
     } while (0)
 
 #endif
diff --git a/sysdeps/powerpc/powerpc64/Makefile b/sysdeps/powerpc/powerpc64/Makefile
index 758b856854..3ced6568df 100644
--- a/sysdeps/powerpc/powerpc64/Makefile
+++ b/sysdeps/powerpc/powerpc64/Makefile
@@ -22,3 +22,10 @@ ifeq ($(subdir),elf)
 # help gcc inline asm code from dl-machine.h
 +cflags += -finline-limit=2000
 endif
+
+ifeq ($(subdir),gmon)
+# The assembly functions assume that fp arg regs are not trashed.
+# Compiling with -msoft-float ensures that fp regs are not used
+# for moving memory around.
+CFLAGS-mcount.c += -msoft-float
+endif
diff --git a/sysdeps/powerpc/powerpc64/__longjmp-common.S b/sysdeps/powerpc/powerpc64/__longjmp-common.S
index b11a0fd7b5..9d0195dd14 100644
--- a/sysdeps/powerpc/powerpc64/__longjmp-common.S
+++ b/sysdeps/powerpc/powerpc64/__longjmp-common.S
@@ -42,6 +42,7 @@
 
 	.machine	"altivec"
 ENTRY (BP_SYM (__longjmp))
+	CALL_MCOUNT 2
 	CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
 #ifndef __NO_VMX__
 	ld    r5,.LC__dl_hwcap@toc(r2)
diff --git a/sysdeps/powerpc/powerpc64/bsd-_setjmp.S b/sysdeps/powerpc/powerpc64/bsd-_setjmp.S
index 13f4056706..82b79a8098 100644
--- a/sysdeps/powerpc/powerpc64/bsd-_setjmp.S
+++ b/sysdeps/powerpc/powerpc64/bsd-_setjmp.S
@@ -25,8 +25,9 @@
 #if defined NOT_IN_libc
 /* Build a non-versioned object for rtld-*.  */
 ENTRY (BP_SYM (_setjmp))
+	CALL_MCOUNT 1
 	li r4,0			/* Set second argument to 0.  */
-	b JUMPTARGET(BP_SYM (__sigsetjmp))
+	b JUMPTARGET (__sigsetjmp_ent)
 END (BP_SYM (_setjmp))
 libc_hidden_def (_setjmp)
 
@@ -36,8 +37,9 @@ libc_hidden_def (_setjmp)
 symbol_version (__novmx_setjmp,_setjmp,GLIBC_2.3);
 
 ENTRY (BP_SYM (__novmx_setjmp))
+	CALL_MCOUNT 1
 	li r4,0			/* Set second argument to 0.  */
-	b JUMPTARGET(BP_SYM (__novmx__sigsetjmp))
+	b JUMPTARGET (__novmx__sigsetjmp_ent)
 END (BP_SYM (__novmx_setjmp))
 libc_hidden_def (__novmx_setjmp)
 # endif /* defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4) */
@@ -50,13 +52,15 @@ ENTRY (BP_SYM (__GI__setjmp))
 #if defined SHARED && !defined IS_IN_rtld
 	std r2,40(r1)	/* Save the callers TOC in the save area.  */
 #endif
+	CALL_MCOUNT 1
 	li r4,0			/* Set second argument to 0.  */
-	b JUMPTARGET(BP_SYM (__vmx__sigsetjmp))
+	b JUMPTARGET (__vmx__sigsetjmp_ent)
 END (BP_SYM (__GI__setjmp))
 
 ENTRY (BP_SYM (__vmx_setjmp))
+	CALL_MCOUNT 1
 	li r4,0			/* Set second argument to 0.  */
-	b JUMPTARGET(BP_SYM (__vmx__sigsetjmp))
+	b JUMPTARGET (__vmx__sigsetjmp_ent)
 END (BP_SYM (__vmx_setjmp))
 libc_hidden_def (__vmx_setjmp)
 #endif /* !NOT_IN_libc */
diff --git a/sysdeps/powerpc/powerpc64/bsd-setjmp.S b/sysdeps/powerpc/powerpc64/bsd-setjmp.S
index 73b9a4d34e..543e83faa3 100644
--- a/sysdeps/powerpc/powerpc64/bsd-setjmp.S
+++ b/sysdeps/powerpc/powerpc64/bsd-setjmp.S
@@ -25,8 +25,9 @@
 
 
 ENTRY (__novmxsetjmp)
+	CALL_MCOUNT 1
 	li r4,1			/* Set second argument to 1.  */
-	b JUMPTARGET (__novmx__sigsetjmp)
+	b JUMPTARGET (__novmx__sigsetjmp_ent)
 END (__novmxsetjmp)
 strong_alias (__novmxsetjmp, __novmx__setjmp)
 symbol_version (__novmxsetjmp, setjmp, GLIBC_2.3)
@@ -35,8 +36,9 @@ symbol_version (__novmxsetjmp, setjmp, GLIBC_2.3)
 
 
 ENTRY (__vmxsetjmp)
+	CALL_MCOUNT 1
 	li r4,1			/* Set second argument to 1.  */
-	b JUMPTARGET (__vmx__sigsetjmp)
+	b JUMPTARGET (__vmx__sigsetjmp_ent)
 END (__vmxsetjmp)
 strong_alias (__vmxsetjmp, __vmx__setjmp)
 strong_alias (__vmx__sigsetjmp, __setjmp)
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_ceil.S b/sysdeps/powerpc/powerpc64/fpu/s_ceil.S
index 127f302666..a1bfaa70c2 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_ceil.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_ceil.S
@@ -27,6 +27,7 @@
 	.section	".text"
 
 ENTRY (__ceil)
+	CALL_MCOUNT 0
 	mffs	fp11		/* Save current FPU rounding mode.  */
 	lfd	fp13,.LC0@toc(2)
 	fabs	fp0,fp1
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S b/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S
index 34f61423cc..42eb274389 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S
@@ -27,6 +27,7 @@
 	.section	".text"
 
 ENTRY (__ceilf)
+	CALL_MCOUNT 0
 	mffs	fp11		/* Save current FPU rounding mode.  */
 	lfd	fp13,.LC0@toc(2)
 	fabs	fp0,fp1
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_copysign.S b/sysdeps/powerpc/powerpc64/fpu/s_copysign.S
index 40fd83d3d1..a43ed12cf0 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_copysign.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_copysign.S
@@ -23,6 +23,7 @@
 #include <sysdep.h>
 
 ENTRY(__copysign)
+	CALL_MCOUNT 0
 /* double [f1] copysign (double [f1] x, double [f2] y);
    copysign(x,y) returns a value with the magnitude of x and
    with the sign bit of y.  */
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_floor.S b/sysdeps/powerpc/powerpc64/fpu/s_floor.S
index 57fd63cd66..80cbdc5709 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_floor.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_floor.S
@@ -25,6 +25,7 @@
 	.section	".text"
 
 ENTRY (__floor)
+	CALL_MCOUNT 0
 	mffs	fp11		/* Save current FPU rounding mode.  */
 	lfd	fp13,.LC0@toc(2)
 	fabs	fp0,fp1
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_floorf.S b/sysdeps/powerpc/powerpc64/fpu/s_floorf.S
index cde92b9174..20cbb15ebd 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_floorf.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_floorf.S
@@ -25,6 +25,7 @@
 	.section	".text"
 
 ENTRY (__floorf)
+	CALL_MCOUNT 0
 	mffs	fp11		/* Save current FPU rounding mode.  */
 	lfd	fp13,.LC0@toc(2)
 	fabs	fp0,fp1
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_llrint.S b/sysdeps/powerpc/powerpc64/fpu/s_llrint.S
index bc976a7edb..610b561f25 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_llrint.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_llrint.S
@@ -21,6 +21,7 @@
 
 /* long long int[r3] __llrint (double x[fp1])  */
 ENTRY (__llrint)	
+	CALL_MCOUNT 0
 	fctid	fp13,fp1
 	stfd	fp13,-16(r1)
 	nop	/* Insure the following load is in a different dispatch group */
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_llrintf.S b/sysdeps/powerpc/powerpc64/fpu/s_llrintf.S
index aef84de831..b7b2a8fc63 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_llrintf.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_llrintf.S
@@ -21,6 +21,7 @@
 
 /* long long int[r3] __llrintf (float x[fp1])  */
 ENTRY (__llrintf)	
+	CALL_MCOUNT 0
 	fctid	fp13,fp1
 	stfd	fp13,-16(r1)
 	nop	/* Insure the following load is in a different dispatch group */
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_llround.S b/sysdeps/powerpc/powerpc64/fpu/s_llround.S
index 320ef0f6d8..a3dcd4c33d 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_llround.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_llround.S
@@ -37,6 +37,7 @@
    to the integer value.  */
 
 ENTRY (__llround)
+	CALL_MCOUNT 0
 	lfd	fp12,.LC0@toc(2)
 	lfd	fp10,.LC1@toc(2)
 	fcmpu	cr6,fp1,fp12	/* if (x > 0.0)  */
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_llroundf.S b/sysdeps/powerpc/powerpc64/fpu/s_llroundf.S
index ff923056b1..b5ca43bf20 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_llroundf.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_llroundf.S
@@ -37,6 +37,7 @@
    to the integer value.  */
 
 ENTRY (__llroundf)
+	CALL_MCOUNT 0
 	lfd	fp12,.LC0@toc(2)
 	lfd	fp10,.LC1@toc(2)
 	fcmpu	cr6,fp1,fp12	/* if (x < 0.0)  */
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_rint.S b/sysdeps/powerpc/powerpc64/fpu/s_rint.S
index f7db7ff80a..79e807269d 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_rint.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_rint.S
@@ -28,6 +28,7 @@
 	.section	".text"
 
 ENTRY (__rint)
+	CALL_MCOUNT 0
 	lfd	fp13,.LC0@toc(2)
 	fabs	fp0,fp1
 	fsub	fp12,fp13,fp13	/* generate 0.0  */
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_rintf.S b/sysdeps/powerpc/powerpc64/fpu/s_rintf.S
index de6d654796..eb34dd5e77 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_rintf.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_rintf.S
@@ -25,6 +25,7 @@
 	.section	".text"
 
 ENTRY (__rintf)
+	CALL_MCOUNT 0
 	lfd	fp13,.LC0@toc(2)
 	fabs	fp0,fp1
 	fsubs	fp12,fp13,fp13	/* generate 0.0  */
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_round.S b/sysdeps/powerpc/powerpc64/fpu/s_round.S
index 1c2e5299e5..c0b6d46fea 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_round.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_round.S
@@ -39,6 +39,7 @@
    to the integer value.  */
 
 ENTRY (__round)
+	CALL_MCOUNT 0
 	mffs	fp11		/* Save current FPU rounding mode.  */
 	lfd	fp13,.LC0@toc(2)
 	fabs	fp0,fp1
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_roundf.S b/sysdeps/powerpc/powerpc64/fpu/s_roundf.S
index fd8eb0aea3..23ee4c052b 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_roundf.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_roundf.S
@@ -39,6 +39,7 @@
    to the integer value.  */
 
 ENTRY (__roundf )
+	CALL_MCOUNT 0
 	mffs	fp11		/* Save current FPU rounding mode.  */
 	lfd	fp13,.LC0@toc(2)
 	fabs	fp0,fp1
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_trunc.S b/sysdeps/powerpc/powerpc64/fpu/s_trunc.S
index dc345ab424..3ddd298525 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_trunc.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_trunc.S
@@ -34,6 +34,7 @@
    subtracting +-2**52.  */
 
 ENTRY (__trunc)
+	CALL_MCOUNT 0
 	mffs	fp11		/* Save current FPU rounding mode.  */
 	lfd	fp13,.LC0@toc(2)
 	fabs	fp0,fp1
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_truncf.S b/sysdeps/powerpc/powerpc64/fpu/s_truncf.S
index 727647f6de..b38b722a6f 100644
--- a/sysdeps/powerpc/powerpc64/fpu/s_truncf.S
+++ b/sysdeps/powerpc/powerpc64/fpu/s_truncf.S
@@ -34,6 +34,7 @@
    subtracting +-2**23.  */
 
 ENTRY (__truncf)
+	CALL_MCOUNT 0
 	mffs	fp11		/* Save current FPU rounding mode.  */
 	lfd	fp13,.LC0@toc(2)
 	fabs	fp0,fp1
diff --git a/sysdeps/powerpc/powerpc64/memcpy.S b/sysdeps/powerpc/powerpc64/memcpy.S
index 251e1fed80..9df5bb42b6 100644
--- a/sysdeps/powerpc/powerpc64/memcpy.S
+++ b/sysdeps/powerpc/powerpc64/memcpy.S
@@ -37,6 +37,8 @@
    Each case has a optimized unrolled loop.   */
 
 EALIGN (BP_SYM (memcpy), 5, 0)
+	CALL_MCOUNT 3
+
     cmpldi cr1,5,31
     neg   0,3
     std   3,-16(1)
diff --git a/sysdeps/powerpc/powerpc64/memset.S b/sysdeps/powerpc/powerpc64/memset.S
index f3a299d5c8..1abc59bb17 100644
--- a/sysdeps/powerpc/powerpc64/memset.S
+++ b/sysdeps/powerpc/powerpc64/memset.S
@@ -41,6 +41,7 @@
    to 0, to take advantage of the dcbz instruction.  */
 
 EALIGN (BP_SYM (memset), 5, 0)
+	CALL_MCOUNT 3
 
 #define rTMP	r0
 #define rRTN	r3	/* Initial value of 1st argument.  */
@@ -274,6 +275,7 @@ libc_hidden_builtin_def (memset)
 /* Copied from bzero.S to prevent the linker from inserting a stub
    between bzero and memset.  */
 ENTRY (BP_SYM (__bzero))
+	CALL_MCOUNT 3
 #if __BOUNDED_POINTERS__
 	mr	r6,r4
 	li	r5,0
diff --git a/sysdeps/powerpc/powerpc64/setjmp-common.S b/sysdeps/powerpc/powerpc64/setjmp-common.S
index ab57170875..f82d5a21f5 100644
--- a/sysdeps/powerpc/powerpc64/setjmp-common.S
+++ b/sysdeps/powerpc/powerpc64/setjmp-common.S
@@ -41,6 +41,10 @@
 
 	.machine	"altivec"
 ENTRY (BP_SYM (__sigsetjmp))
+	CALL_MCOUNT 2
+	.globl JUMPTARGET(GLUE(__sigsetjmp,_ent))
+	.hidden JUMPTARGET(GLUE(__sigsetjmp,_ent))
+JUMPTARGET(GLUE(__sigsetjmp,_ent)):
 	CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
 	std  r1,(JB_GPR1*8)(3)
 	mflr r0
diff --git a/sysdeps/powerpc/powerpc64/stpcpy.S b/sysdeps/powerpc/powerpc64/stpcpy.S
index deac0ea229..cc7a6ab66a 100644
--- a/sysdeps/powerpc/powerpc64/stpcpy.S
+++ b/sysdeps/powerpc/powerpc64/stpcpy.S
@@ -26,6 +26,7 @@
 /* char * [r3] stpcpy (char *dest [r3], const char *src [r4])  */
 
 EALIGN (BP_SYM (__stpcpy), 4, 0)
+	CALL_MCOUNT 2
 
 #define rTMP	r0
 #define rRTN	r3
diff --git a/sysdeps/powerpc/powerpc64/strchr.S b/sysdeps/powerpc/powerpc64/strchr.S
index e3222f354d..93ea61e49c 100644
--- a/sysdeps/powerpc/powerpc64/strchr.S
+++ b/sysdeps/powerpc/powerpc64/strchr.S
@@ -26,6 +26,7 @@
 /* char * [r3] strchr (const char *s [r3] , int c [r4] )  */
 
 ENTRY (BP_SYM (strchr))
+	CALL_MCOUNT 2
 
 #define rTMP1	r0
 #define rRTN	r3	/* outgoing result */
diff --git a/sysdeps/powerpc/powerpc64/strcmp.S b/sysdeps/powerpc/powerpc64/strcmp.S
index 7e2dae07f7..4d7eb21bf7 100644
--- a/sysdeps/powerpc/powerpc64/strcmp.S
+++ b/sysdeps/powerpc/powerpc64/strcmp.S
@@ -26,6 +26,7 @@
 /* int [r3] strcmp (const char *s1 [r3], const char *s2 [r4])  */
 
 EALIGN (BP_SYM(strcmp), 4, 0)
+	CALL_MCOUNT 2
 
 #define rTMP	r0
 #define rRTN	r3
diff --git a/sysdeps/powerpc/powerpc64/strcpy.S b/sysdeps/powerpc/powerpc64/strcpy.S
index 4d12b82e5e..e9e9fc78cd 100644
--- a/sysdeps/powerpc/powerpc64/strcpy.S
+++ b/sysdeps/powerpc/powerpc64/strcpy.S
@@ -26,6 +26,7 @@
 /* char * [r3] strcpy (char *dest [r3], const char *src [r4])  */
 
 EALIGN (BP_SYM (strcpy), 4, 0)
+	CALL_MCOUNT 2
 
 #define rTMP	r0
 #define rRTN	r3	/* incoming DEST arg preserved as result */
diff --git a/sysdeps/powerpc/powerpc64/strlen.S b/sysdeps/powerpc/powerpc64/strlen.S
index 760be5884a..4c1385aead 100644
--- a/sysdeps/powerpc/powerpc64/strlen.S
+++ b/sysdeps/powerpc/powerpc64/strlen.S
@@ -79,6 +79,7 @@
 /* int [r3] strlen (char *s [r3])  */
 
 ENTRY (BP_SYM (strlen))
+	CALL_MCOUNT 1
 
 #define rTMP1	r0
 #define rRTN	r3	/* incoming STR arg, outgoing result */
diff --git a/sysdeps/powerpc/powerpc64/strncmp.S b/sysdeps/powerpc/powerpc64/strncmp.S
index bdcfab99e3..04bdc2f606 100644
--- a/sysdeps/powerpc/powerpc64/strncmp.S
+++ b/sysdeps/powerpc/powerpc64/strncmp.S
@@ -26,6 +26,7 @@
 /* int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5])  */
 
 EALIGN (BP_SYM(strncmp), 4, 0)
+	CALL_MCOUNT 3
 
 #define rTMP	r0
 #define rRTN	r3
diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h
index 4420a6dfac..fead0b578a 100644
--- a/sysdeps/powerpc/powerpc64/sysdep.h
+++ b/sysdeps/powerpc/powerpc64/sysdep.h
@@ -23,37 +23,36 @@
 
 #ifdef __ASSEMBLER__
 
+/* Support macros for CALL_MCOUNT.  */
+	.macro SAVE_ARG NARG
+	.if \NARG
+	SAVE_ARG \NARG-1
+	std	2+\NARG,-72+8*(\NARG)(1)
+	.endif
+	.endm
+
+	.macro REST_ARG NARG
+	.if \NARG
+	REST_ARG \NARG-1
+	ld	2+\NARG,40+8*(\NARG)(1)
+	.endif
+	.endm
+
 /* If compiled for profiling, call `_mcount' at the start of each function.
    see ppc-mcount.S for more details.  */
+	.macro CALL_MCOUNT NARG
 #ifdef	PROF
-/* The mcount code relies on a the return address being on the stack
-   to locate our caller and so it can restore it; so store one just
-   for its benefit.  */
-#ifdef SYSV_ELF_PROFILING
-#define CALL_MCOUNT	\
-  .pushsection;			\
-  .section ".data";		\
-  .align ALIGNARG(2);		\
-__mcount:			\
-  .long  0;			\
-  .previous;			\
-  .section ".toc","aw";		\
-.LC__mcount:;			\
-  .tc __mcount[TC],__mcount;	\
-  .previous;			\
-  mflr  r0;			\
-  std   r0,16(r1);		\
-  ld    r0,.LC__mcount@toc(r2);	\
-  bl    JUMPTARGET(_mcount);
-#else /* SYSV_ELF_PROFILING */
-#define CALL_MCOUNT	\
-  mflr  r0;			\
-  std   r0,16(r1);		\
-  bl    JUMPTARGET(_mcount);
-#endif /* SYSV_ELF_PROFILING */
-#else  /* PROF */
-#define CALL_MCOUNT		/* Do nothing.  */
-#endif /* PROF */
+	mflr	r0
+	SAVE_ARG \NARG
+	std	r0,16(r1)
+	stdu	r1,-112(r1)
+	bl	JUMPTARGET (_mcount)
+	ld	r0,128(r1)
+	REST_ARG \NARG
+	addi	r1,r1,112
+	mtlr	r0
+#endif
+	.endm
 
 #ifdef USE_PPC64_OVERLAPPING_OPD
 # define OPD_ENT(name)	.quad BODY_LABEL (name), .TOC.@tocbase
@@ -106,24 +105,11 @@ BODY_LABEL(name):
 
 /* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes
    past a 2^alignt boundary.  */
-#ifdef PROF
-#define EALIGN(name, alignt, words) \
-	ENTRY_2(name)				\
-	.align ALIGNARG(alignt);		\
-	EALIGN_W_##words;			\
-BODY_LABEL(name):				\
-	CALL_MCOUNT				\
-	b 0f;					\
-	.align ALIGNARG(alignt);		\
-	EALIGN_W_##words;			\
-0:
-#else /* PROF */
 #define EALIGN(name, alignt, words) \
 	ENTRY_2(name)				\
 	.align ALIGNARG(alignt);		\
 	EALIGN_W_##words;			\
 BODY_LABEL(name):
-#endif
 
 /* Local labels stripped out by the linker.  */
 #undef L
diff --git a/timezone/asia b/timezone/asia
index 4417134dac..3c2c1a1868 100644
--- a/timezone/asia
+++ b/timezone/asia
@@ -1,4 +1,4 @@
-# @(#)asia	7.75
+# @(#)asia	7.77
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
@@ -761,6 +761,26 @@ Zone	Asia/Jerusalem	2:20:56 -	LMT	1880
 # direction is expected until the latter part of 2004 which is a long
 # time off in terms of Israeli politics.
 
+# (2004-09-20):
+# The latest rumour, however, is that in 2005, when the clock changes to
+# Daylight Saving Time (date as yet unknown), the move will be a two-hour leap
+# forward (from UTC+0200 to UTC+0400) and then, in the fall, the clock will
+# move back only an hour to UTC+0300 thus effectively moving Israel's timezone
+# from UTC+0200 to UTC+0300.  However, no actual draft has been put before the
+# Knesset (Israel's Parliament) though the intention is to do so this
+# month [2004-09].
+
+# (2004-09-26):
+# Even though the draft law for the above did pass the Ministerial Committee
+# for Legislative Matters three months ago, it was voted down in today's
+# Cabinet meeting.  The current suggestion is to keep the current timezone at
+# UTC+0200 but have an extended period of Daylight Saving Time (UTC+0300) from
+# the beginning of Passover holiday in the spring to after the Tabernacle
+# holiday in the fall (i.e. the dates of which are governed by the Hebrew
+# calendar but this means at least 184 days of DST).  However, this is only a
+# suggestion that was raised in today's cabinet meeting and has not yet been
+# drafted.
+
 
 
 ###############################################################################
diff --git a/timezone/private.h b/timezone/private.h
index c8f4548683..57663052f0 100644
--- a/timezone/private.h
+++ b/timezone/private.h
@@ -21,7 +21,7 @@
 
 #ifndef lint
 #ifndef NOID
-static char	privatehid[] = "@(#)private.h	7.53";
+static char	privatehid[] = "@(#)private.h	7.54";
 #endif /* !defined NOID */
 #endif /* !defined lint */
 
@@ -190,11 +190,22 @@ extern int	unlink P((const char * filename));
 ** But some newer errno.h implementations define it as a macro.
 ** Fix the former without affecting the latter.
 */
+
 #ifndef errno
 extern int errno;
 #endif /* !defined errno */
 
 /*
+** Some time.h implementations don't declare asctime_r.
+** Others might define it as a macro.
+** Fix the former without affecting the latter.
+*/
+
+#ifndef asctime_r
+extern char *	asctime_r();
+#endif
+
+/*
 ** Private function declarations.
 */
 char *	icalloc P((int nelem, int elsize));
diff --git a/timezone/southamerica b/timezone/southamerica
index 13bd5270e8..912491049b 100644
--- a/timezone/southamerica
+++ b/timezone/southamerica
@@ -1,4 +1,4 @@
-# @(#)southamerica	7.52
+# @(#)southamerica	7.54
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
@@ -186,6 +186,20 @@ Rule	Arg	2000	only	-	Mar	Sun>=1	0:00	0	-
 # contains a contradiction.  I would give more credence to the Saturday/Sunday
 # date than the "three days earlier" phrase, and conclude that Tierra del
 # Fuego set its clocks back at 2004-05-30 00:00.
+#
+# From Steffen Thorsen (2004-10-05):
+# The previous law 7210 which changed the province of Mendoza's time zone
+# back in May have been modified slightly in a new law 7277, which set the
+# new end date to 2004-09-26 (original date was 2004-10-17).
+# http://www.gobernac.mendoza.gov.ar/boletin/pdf/20040924-27244-normas.pdf
+#
+# From Mariano Absatz (2004-10-05):
+# San Juan changed from UTC-03:00 to UTC-04:00 at midnight between
+# Sunday, May 30th and Monday, May 31st.  It changed back to UTC-03:00
+# at midnight between Saturday, July 24th and Sunday, July 25th....
+# http://www.sanjuan.gov.ar/prensa/archivo/000329.html
+# http://www.sanjuan.gov.ar/prensa/archivo/000426.html
+# http://www.sanjuan.gov.ar/prensa/archivo/000441.html
 
 # Unless otherwise specified, data are from Shanks through 1992, from
 # the IATA otherwise.  As noted below, Shanks says that
@@ -261,8 +275,8 @@ Zone America/Argentina/San_Juan -4:34:04 - LMT	1894 Oct 31
 			-4:00	-	WART	1991 May  7
 			-3:00	Arg	AR%sT	1999 Oct  3
 			-4:00	Arg	AR%sT	2000 Mar  3
-			-3:00	-	ART	2004 Jun  1
-			-4:00	-	WART	2004 Oct 17
+			-3:00	-	ART	2004 May 31
+			-4:00	-	WART	2004 Jul 25
 			-3:00	-	ART
 #
 # Jujuy (JY)
@@ -306,7 +320,7 @@ Zone America/Argentina/Mendoza -4:35:16 - LMT	1894 Oct 31
 			-3:00	Arg	AR%sT	1999 Oct  3
 			-4:00	Arg	AR%sT	2000 Mar  3
 			-3:00	-	ART	2004 May 23
-			-4:00	-	WART	2004 Oct 17
+			-4:00	-	WART	2004 Sep 26
 			-3:00	-	ART
 #
 # Chubut (CH)
@@ -420,6 +434,11 @@ Zone	America/La_Paz	-4:32:36 -	LMT	1890
 # the Government decided to postpone DST, instead of changing the Constitution
 # (maybe, for the next elections, it will be possible to change the clock)...
 
+# From Rodrigo Severo (2004-10-04):
+# It's just the biannual change made necessary by the much hyped, supposedly
+# modern Brazilian eletronic voting machines which, apparently, can't deal
+# with a time change between the first and the second rounds of the elections.
+
 # From Paul Eggert (2002-10-10):
 # The official decrees referenced below are mostly taken from
 # <a href="http://pcdsh01.on.br/DecHV.html">
@@ -556,11 +575,15 @@ Rule	Brazil	2001	max	-	Feb	Sun>=15	 0:00	0	-
 Rule	Brazil	2002	only	-	Nov	 3	 0:00	1:00	S
 # Decree 4,844 (2003-09-24; corrected 2003-09-26) repeals DST in BA, MT, TO.
 # <a href="http://www.presidencia.gov.br/CCIVIL/decreto/2003/D4844.htm"></a>
-Rule	Brazil	2003	max	-	Oct	Sun>=15	 0:00	1:00	S
+Rule	Brazil	2003	only	-	Oct	19	 0:00	1:00	S
+# Decree 5,223 (2004-10-01) reestablishes DST in MT.
+# <a href="http://www.planalto.gov.br/ccivil_03/_Ato2004-2006/2004/Decreto/D5223.htm"></a>
+Rule	Brazil	2004	only	-	Nov	 2	 0:00	1:00	S
 # The latest ruleset listed above says that the following states observe DST:
-# DF, ES, GO, MG, MS, PR, RJ, RS, SC, SP.
+# DF, ES, GO, MG, MS, MT, PR, RJ, RS, SC, SP.
 #
-# For dates after mid-2004, the above rules with TO="max" are guesses
+Rule	Brazil	2005	max	-	Oct	Sun>=15	 0:00	1:00	S
+# For dates after mid-2005, the above rules with TO="max" are guesses
 # and are quite possibly wrong, but are more likely than no DST at all.
 
 
@@ -648,7 +671,8 @@ Zone America/Campo_Grande -3:38:28 -	LMT	1914
 # Mato Grosso (MT)
 Zone America/Cuiaba	-3:44:20 -	LMT	1914
 			-4:00	Brazil	AM%sT	2003 Sep 24
-			-4:00	-	AMT
+			-4:00	-	AMT	2004 Oct  4
+			-4:00	Brazil	AM%sT
 #
 # west Para (PA), Rondonia (RO)
 # West Para includes Altamira, Oribidos, Prainha, Oriximina, and Santarem.
@@ -1029,6 +1053,11 @@ Rule	Uruguay	1990	1992	-	Mar	Sun>=1	 0:00	0	-
 Rule	Uruguay	1990	1991	-	Oct	Sun>=21	 0:00	1:00	S
 Rule	Uruguay	1992	only	-	Oct	18	 0:00	1:00	S
 Rule	Uruguay	1993	only	-	Feb	28	 0:00	0	-
+# From Eduardo Cota (2004-09-20):
+# The uruguayan government has decreed a change in the local time....
+# http://www.presidencia.gub.uy/decretos/2004091502.htm
+Rule	Uruguay	2004	only	-	Sep	Sun>=15	 0:00	1:00	S
+Rule	Uruguay	2005	only	-	Mar	Sun>=8	 0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Montevideo	-3:44:44 -	LMT	1898 Jun 28
 			-3:44:44 -	MMT	1920 May  1	# Montevideo MT
diff --git a/timezone/zdump.c b/timezone/zdump.c
index 9faeaf21b2..20bb916822 100644
--- a/timezone/zdump.c
+++ b/timezone/zdump.c
@@ -1,4 +1,4 @@
-static char	elsieid[] = "@(#)zdump.c	7.31";
+static char	elsieid[] = "@(#)zdump.c	7.40";
 
 /*
 ** This code has been made independent of the rest of the time
@@ -64,16 +64,15 @@ static char	elsieid[] = "@(#)zdump.c	7.31";
 #define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
 #endif /* !defined isleap */
 
-#if HAVE_GETTEXT - 0
+#if HAVE_GETTEXT
 #include "locale.h"	/* for setlocale */
 #include "libintl.h"
-#endif /* HAVE_GETTEXT - 0 */
+#endif /* HAVE_GETTEXT */
 
 #ifndef GNUC_or_lint
 #ifdef lint
 #define GNUC_or_lint
-#endif /* defined lint */
-#ifndef lint
+#else /* !defined lint */
 #ifdef __GNUC__
 #define GNUC_or_lint
 #endif /* defined __GNUC__ */
@@ -83,8 +82,7 @@ static char	elsieid[] = "@(#)zdump.c	7.31";
 #ifndef INITIALIZE
 #ifdef GNUC_or_lint
 #define INITIALIZE(x)	((x) = 0)
-#endif /* defined GNUC_or_lint */
-#ifndef GNUC_or_lint
+#else /* !defined GNUC_or_lint */
 #define INITIALIZE(x)
 #endif /* !defined GNUC_or_lint */
 #endif /* !defined INITIALIZE */
@@ -96,11 +94,11 @@ static char	elsieid[] = "@(#)zdump.c	7.31";
 */
 
 #ifndef _
-#if HAVE_GETTEXT - 0
+#if HAVE_GETTEXT
 #define _(msgid) gettext(msgid)
-#else /* !(HAVE_GETTEXT - 0) */
+#else /* !HAVE_GETTEXT */
 #define _(msgid) msgid
-#endif /* !(HAVE_GETTEXT - 0) */
+#endif /* !HAVE_GETTEXT */
 #endif /* !defined _ */
 
 #ifndef TZ_DOMAIN
@@ -110,8 +108,7 @@ static char	elsieid[] = "@(#)zdump.c	7.31";
 #ifndef P
 #ifdef __STDC__
 #define P(x)	x
-#endif /* defined __STDC__ */
-#ifndef __STDC__
+#else /* !defined __STDC__ */
 #define P(x)	()
 #endif /* !defined __STDC__ */
 #endif /* !defined P */
@@ -129,6 +126,7 @@ static time_t	hunt P((char * name, time_t lot, time_t	hit));
 static size_t	longest;
 static char *	progname;
 static void	show P((char * zone, time_t t, int v));
+static void	dumptime P((const struct tm * tmp));
 
 int
 main(argc, argv)
@@ -150,14 +148,13 @@ char *	argv[];
 	struct tm		newtm;
 
 	INITIALIZE(cuttime);
-#if HAVE_GETTEXT - 0
-	(void) setlocale(LC_CTYPE, "");
+#if HAVE_GETTEXT
 	(void) setlocale(LC_MESSAGES, "");
 #ifdef TZ_DOMAINDIR
 	(void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
-#endif /* defined(TEXTDOMAINDIR) */
+#endif /* defined TEXTDOMAINDIR */
 	(void) textdomain(TZ_DOMAIN);
-#endif /* HAVE_GETTEXT - 0 */
+#endif /* HAVE_GETTEXT */
 	progname = argv[0];
 	for (i = 1; i < argc; ++i)
 		if (strcmp(argv[i], "--version") == 0) {
@@ -324,7 +321,7 @@ struct tm *	oldp;
 		return -delta(oldp, newp);
 	result = 0;
 	for (tmy = oldp->tm_year; tmy < newp->tm_year; ++tmy)
-		result += DAYSPERNYEAR + isleap(tmy + TM_YEAR_BASE);
+		result += DAYSPERNYEAR + isleap(tmy + (long) TM_YEAR_BASE);
 	result += newp->tm_yday - oldp->tm_yday;
 	result *= HOURSPERDAY;
 	result += newp->tm_hour - oldp->tm_hour;
@@ -344,10 +341,12 @@ int	v;
 	struct tm *	tmp;
 
 	(void) printf("%-*s  ", (int) longest, zone);
-	if (v)
-		(void) printf("%.24s UTC = ", asctime(gmtime(&t)));
+	if (v) {
+		dumptime(gmtime(&t));
+		(void) printf(" UTC = ");
+	}
 	tmp = localtime(&t);
-	(void) printf("%.24s", asctime(tmp));
+	dumptime(tmp);
 	if (*abbr(tmp) != '\0')
 		(void) printf(" %s", abbr(tmp));
 	if (v) {
@@ -371,3 +370,37 @@ struct tm *	tmp;
 	result = tzname[tmp->tm_isdst];
 	return (result == NULL) ? &nada : result;
 }
+
+static void
+dumptime(timeptr)
+register const struct tm *	timeptr;
+{
+	static const char	wday_name[][3] = {
+		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+	};
+	static const char	mon_name[][3] = {
+		"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+	};
+	register const char *	wn;
+	register const char *	mn;
+
+	/*
+	** The packaged versions of localtime and gmtime never put out-of-range
+	** values in tm_wday or tm_mon, but since this code might be compiled
+	** with other (perhaps experimental) versions, paranoia is in order.
+	*/
+	if (timeptr->tm_wday < 0 || timeptr->tm_wday >=
+		(int) (sizeof wday_name / sizeof wday_name[0]))
+			wn = "???";
+	else		wn = wday_name[timeptr->tm_wday];
+	if (timeptr->tm_mon < 0 || timeptr->tm_mon >=
+		(int) (sizeof mon_name / sizeof mon_name[0]))
+			mn = "???";
+	else		mn = mon_name[timeptr->tm_mon];
+	(void) printf("%.3s %.3s%3d %.2d:%.2d:%.2d %ld",
+		wn, mn,
+		timeptr->tm_mday, timeptr->tm_hour,
+		timeptr->tm_min, timeptr->tm_sec,
+		timeptr->tm_year + (long) TM_YEAR_BASE);
+}