about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-05-24 22:22:20 +0000
committerJakub Jelinek <jakub@redhat.com>2008-05-24 22:22:20 +0000
commit8ba7d5cebbd4acf40dc8d22982baa50c2e1fd194 (patch)
treece09df60a6357e43ff65911fc7e817bcae26486f
parente96fe50f0dd8d76fabfe139b46f059e3b2373b83 (diff)
downloadglibc-8ba7d5cebbd4acf40dc8d22982baa50c2e1fd194.tar.gz
glibc-8ba7d5cebbd4acf40dc8d22982baa50c2e1fd194.tar.xz
glibc-8ba7d5cebbd4acf40dc8d22982baa50c2e1fd194.zip
Updated to fedora-glibc-20080524T2218 cvs/fedora-glibc-2_8_90-5
-rw-r--r--ChangeLog72
-rw-r--r--Makeconfig1
-rw-r--r--Makefile11
-rw-r--r--bits/termios.h4
-rw-r--r--elf/Makefile12
-rw-r--r--fedora/branch.mk4
-rw-r--r--fedora/glibc.spec.in5
-rw-r--r--iconvdata/Depend1
-rw-r--r--include/inline-hashtab.h2
-rw-r--r--libio/stdio.h2
-rw-r--r--localedata/ChangeLog5
-rw-r--r--localedata/locales/iso14651_t1_common3
-rw-r--r--math/libm-test.inc4
-rw-r--r--nptl/ChangeLog5
-rw-r--r--resolv/res_send.c30
-rw-r--r--scripts/data/localplt-sparc-linux-gnu.data18
-rw-r--r--scripts/data/localplt-sparc64-linux-gnu.data20
-rw-r--r--scripts/soversions.awk13
-rw-r--r--shlib-versions5
-rw-r--r--stdio-common/Makefile7
-rw-r--r--stdio-common/scanf14.c53
-rw-r--r--stdio-common/scanf15.c43
-rw-r--r--stdio-common/scanf16.c147
-rw-r--r--stdio-common/scanf17.c128
-rw-r--r--string/endian.h66
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h16
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/brk.S6
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h15
29 files changed, 630 insertions, 70 deletions
diff --git a/ChangeLog b/ChangeLog
index 9ffb261908..03cffb9713 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,75 @@
+2008-05-24  Jakub Jelinek  <jakub@redhat.com>
+
+	* libio/stdio.h (vscanf): Fix -std=c99 redirect.
+	* stdio-common/Makefile (tests): Add scanf16 and scanf17.
+	(CFLAGS-scanf17.c): New.
+	* stdio-common/scanf14.c (main): Add fscanf and scanf tests.
+	* stdio-common/scanf15.c (main): Likewise.
+	* stdio-common/scanf16.c: New test.
+	* stdio-common/scanf17.c: New test.
+
+2008-05-24  Ulrich Drepper  <drepper@redhat.com>
+
+	* resolv/res_send.c (send_dg): If we already have one of two
+	answers and the server reports SERVFAIL, NOTIMP, or REFUSED, then
+	use the one answer insted of failing.
+
+2008-02-20  Ryan S. Arnold  <rsa@us.ibm.com>
+
+	* math/libm-test.inc (exp_test): Exclude expl(1000.0L) from
+	being executed on PowerPC as the expected result exceeds IBM
+	long double 128 __LDBL_MAX__.
+
+2008-05-21  Roland McGrath  <roland@redhat.com>
+
+	* shlib-versions (sparc.*-.*-.*, sparc64.*-.*-.*): Add ABI lines.
+
+	* Makefile (check-data): Use $(abi-name) before other guesses.
+	Look in $(add-ons) dirs before scripts/data/.
+	* elf/Makefile (check-data): Likewise.
+
+	* scripts/soversions.awk: Grok ABI line.
+	* Makeconfig ($(common-objpfx)soversions.mk): Likewise.
+	Emit definition for abi-name variable.
+
+2008-05-21  Ulrich Drepper  <drepper@redhat.com>
+
+	* string/endian.h: Define new fixed-size hto* and *toh macros only
+	if [__USE_BSD].
+
+	* iconvdata/Depend: Add localedata.
+
+2008-05-21  Samuel Thibault  <samuel.thibault@ens-lyon.org>
+
+	* bits/termios.h (ONLCR): Define under [__USE_XOPEN] too.
+
+2008-05-08  David S. Miller  <davem@davemloft.net>
+
+	* sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S: Use
+	HIDDEN_JUMPTARGET.
+	* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
+	(__SYSCALL_CLOBBERS): Remove %g* registers.
+	* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
+	(__SYSCALL_CLOBBERS): Likewise.
+	* scripts/data/localplt-sparc-linux-gnu.data: New file.
+	* scripts/data/localplt-sparc64-linux-gnu.data: Likewise.
+
+2008-05-21  Jakub Jelinek  <jakub@redhat.com>
+
+	* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
+	(CALL_ERRNO_LOCATION): Define.
+	(__SYSCALL_STRING, __CLONE_SYSCALL_STRING): Use it.
+	* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
+	(CALL_ERRNO_LOCATION): Define.
+	(__SYSCALL_STRING, __CLONE_SYSCALL_STRING): Use it.
+	* sysdeps/unix/sysv/linux/sparc/sparc64/brk.S (__brk): Use
+	HIDDEN_JUMPTARGET for __errno_location call in libc.so.
+
+2008-05-20  Ulrich Drepper  <drepper@redhat.com>
+
+	* include/inline-hashtab.h (higher_prime_number): Fix type of mid
+	variable.
+
 2008-05-20  Jakub Jelinek  <jakub@redhat.com>
 
 	* sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h
diff --git a/Makeconfig b/Makeconfig
index d269936f32..7de7621f56 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -826,6 +826,7 @@ $(common-objpfx)soversions.mk: $(common-objpfx)soversions.i $(..)Makeconfig
 	(seen_DEFAULT=0; seen_WORDSIZE32=0; seen_WORDSIZE64=0; \
 	 while read which lib number setname; do \
 	   eval seen_$$which=1; \
+	   test x"$$which" != xABI || echo abi-name = "$$lib"; \
 	   test x"$$which" = xDEFAULT || continue; \
 	   case $$number in \
 	     [0-9]*) echo "$$lib.so-version=.$$number"; \
diff --git a/Makefile b/Makefile
index 43c4f4d4b5..437854ed33 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,5 @@
-# Copyright (C) 1991-2002,2003,2004,2005,2006 Free Software Foundation, Inc.
+# Copyright (C) 1991-2002,2003,2004,2005,2006,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
@@ -246,8 +247,12 @@ tests-clean:
 tests: $(objpfx)c++-types-check.out $(objpfx)check-local-headers.out
 ifneq ($(CXX),no)
 check-data := $(firstword $(wildcard \
-	        $(foreach M,$(config-machine) $(base-machine),\
-			  scripts/data/c++-types-$M-$(config-os).data)))
+	        $(foreach D,$(add-ons) scripts/data,\
+	        	  $(patsubst %,$D/c++-types-%.data,\
+			   	     $(abi-name) \
+			   	     $(addsuffix -$(config-os),\
+				     		 $(config-machine) \
+						 $(base-machine))))))
 ifneq (,$(check-data))
 $(objpfx)c++-types-check.out: $(check-data) scripts/check-c++-types.sh
 	scripts/check-c++-types.sh $< $(CXX) $(filter-out -std=gnu99 -Wstrict-prototypes,$(CFLAGS)) $(CPPFLAGS) > $@
diff --git a/bits/termios.h b/bits/termios.h
index 4dc0fab911..293d0a6061 100644
--- a/bits/termios.h
+++ b/bits/termios.h
@@ -135,8 +135,10 @@ struct termios
   /* Output modes.  */
   tcflag_t c_oflag;
 #define	OPOST	(1 << 0)	/* Perform output processing.  */
-#ifdef	__USE_BSD
+#if defined __USE_BSD || defined __USE_XOPEN
 # define ONLCR	(1 << 1)	/* Map NL to CR-NL on output.  */
+#endif
+#ifdef	__USE_BSD
 # define OXTABS	TAB3		/* Expand tabs to spaces.  */
 # define ONOEOT	(1 << 3)	/* Discard EOT (^D) on output.  */
 #endif
diff --git a/elf/Makefile b/elf/Makefile
index 861485dcd1..e509153547 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -841,10 +841,14 @@ $(objpfx)tst-dlmodcount: $(libdl)
 $(objpfx)tst-dlmodcount.out: $(test-modules)
 
 check-data := $(firstword $(wildcard \
-	        $(patsubst %,../scripts/data/localplt-%.data,\
-			   $(addsuffix -$(config-os),\
-			   	       $(config-machine) $(base-machine))\
-			   generic)))
+	        $(foreach D,$(add-ons) scripts/data,\
+	        	  $(patsubst %,$(..)$D/localplt-%.data,\
+			   	     $(abi-name) \
+			   	     $(addsuffix -$(config-os),\
+				     		 $(config-machine) \
+						 $(base-machine)) \
+			   generic))))
+
 tests: $(objpfx)check-localplt.out
 
 ifeq ($(have-thread-library),yes)
diff --git a/fedora/branch.mk b/fedora/branch.mk
index a040576330..6e7d3e4540 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-05-20 19:24 UTC
-fedora-sync-tag := fedora-glibc-20080520T1924
+fedora-sync-date := 2008-05-24 22:18 UTC
+fedora-sync-tag := fedora-glibc-20080524T2218
diff --git a/fedora/glibc.spec.in b/fedora/glibc.spec.in
index 3b06768f62..44aa01c1b2 100644
--- a/fedora/glibc.spec.in
+++ b/fedora/glibc.spec.in
@@ -19,7 +19,7 @@
 Summary: The GNU libc libraries
 Name: glibc
 Version: @glibcversion@
-Release: 4
+Release: 5
 # GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries.
 # Things that are linked directly into dynamically linked programs
 # and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional
@@ -976,6 +976,9 @@ rm -f *.filelist*
 %endif
 
 %changelog
+* Sun May 25 2008 Jakub Jelinek <jakub@redhat.com> 2.8.90-5
+- update from trunk
+
 * Tue May 20 2008 Jakub Jelinek <jakub@redhat.com> 2.8.90-4
 - further getaddrinfo and nscd fixes
 
diff --git a/iconvdata/Depend b/iconvdata/Depend
index 401deb536c..38c28d0c90 100644
--- a/iconvdata/Depend
+++ b/iconvdata/Depend
@@ -1 +1,2 @@
 iconv
+localedata
diff --git a/include/inline-hashtab.h b/include/inline-hashtab.h
index 1c36bd7fce..ad361cd1ed 100644
--- a/include/inline-hashtab.h
+++ b/include/inline-hashtab.h
@@ -74,7 +74,7 @@ higher_prime_number (unsigned long n)
 
   while (low != high)
     {
-      const unsigned long *mid = low + (high - low) / 2;
+      const uint32_t *mid = low + (high - low) / 2;
       if (n > *mid)
 	low = mid + 1;
       else
diff --git a/libio/stdio.h b/libio/stdio.h
index c14351a5d5..e794da2e12 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -477,7 +477,7 @@ extern int __REDIRECT (vfscanf,
 		       __isoc99_vfscanf)
      __attribute__ ((__format__ (__scanf__, 2, 0))) __wur;
 extern int __REDIRECT (vscanf, (__const char *__restrict __format,
-				_G_va_list __arg), __isoc99_vfscanf)
+				_G_va_list __arg), __isoc99_vscanf)
      __attribute__ ((__format__ (__scanf__, 1, 0))) __wur;
 extern int __REDIRECT (vsscanf,
 		       (__const char *__restrict __s,
diff --git a/localedata/ChangeLog b/localedata/ChangeLog
index 86f9d763d0..b446ad4361 100644
--- a/localedata/ChangeLog
+++ b/localedata/ChangeLog
@@ -1,3 +1,8 @@
+2008-05-21  Ulrich Drepper  <drepper@redhat.com>
+
+	* locales/iso14651_t1_common: Remove U0C0D entry added for Telugu.
+	Reported by Pravin Satpute.
+
 2008-05-16  Ulrich Drepper  <drepper@redhat.com>
 
 	* locales/iso14651_t1_common: Remove duplicate U0C7B definition.
diff --git a/localedata/locales/iso14651_t1_common b/localedata/locales/iso14651_t1_common
index e9721fd078..fcbd897f0e 100644
--- a/localedata/locales/iso14651_t1_common
+++ b/localedata/locales/iso14651_t1_common
@@ -3406,7 +3406,6 @@ order_start <TELUGU>;forward;forward;forward;forward,position
 <U0C60> <tvw-vocalicrr>;<BAS>;<MIN>;IGNORE
 <U0C0C> <tvw-vocalicl>;<BAS>;<MIN>;IGNORE
 <U0C61> <tvw-vocalicll>;<BAS>;<MIN>;IGNORE
-<U0C0D> <tvw-candrae>;<BAS>;<MIN>;IGNORE
 <U0C0E> <tvw-shorte>;<BAS>;<MIN>;IGNORE
 <U0C0F> <tvw-e>;<BAS>;<MIN>;IGNORE
 <U0C10> <tvw-ai>;<BAS>;<MIN>;IGNORE
@@ -3416,8 +3415,6 @@ order_start <TELUGU>;forward;forward;forward;forward,position
 <U0C15> <t-ka>;<BAS>;<MIN>;IGNORE
 <U0C16> <t-kha>;<BAS>;<MIN>;IGNORE
 <U0C17> <t-ga>;<BAS>;<MIN>;IGNORE
-#XXX This is wrong since there is already a definition for U0C7B.
-#<U0C7B> <t-gga>;<BAS>;<MIN>;IGNORE
 <U0C18> <t-gha>;<BAS>;<MIN>;IGNORE
 <U0C19> <t-nga>;<BAS>;<MIN>;IGNORE
 <U0C1A> <t-ca>;<BAS>;<MIN>;IGNORE
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 267d6077e1..6d9a3ec6cb 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -2511,8 +2511,8 @@ exp_test (void)
   TEST_f_f (exp, 0.75L, 2.11700001661267466854536981983709561L);
   TEST_f_f (exp, 50.0L, 5184705528587072464087.45332293348538L);
   TEST_f_f (exp, 88.72269439697265625L, 3.40233126623160774937554134772290447915e38L);
-#ifdef TEST_LDOUBLE
-  /* The result can only be represented in long double.  */
+#if defined TEST_LDOUBLE && __LDBL_MAX_EXP__ > 1024
+  /* The result can only be represented in sane long double.  */
   TEST_f_f (exp, 1000.0L, 0.197007111401704699388887935224332313e435L);
 #endif
 
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index ac01c3e5bb..95e478af2e 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,6 +1,7 @@
-2008-05-19  Jakub Jelinek  <jakub@redhat.com>
+2008-05-20  Jakub Jelinek  <jakub@redhat.com>
+	    David S. Miller  <davem@davemloft.net>
 
-	* elf/soinit.c (__EH_FRAME_BEGIN__): Remove.
+	* sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: New file.
 
 2008-05-10  Ulrich Drepper  <drepper@redhat.com>
 
diff --git a/resolv/res_send.c b/resolv/res_send.c
index e67ef1c676..e78ff967aa 100644
--- a/resolv/res_send.c
+++ b/resolv/res_send.c
@@ -1001,12 +1001,12 @@ send_dg(res_state statp,
 		need_recompute = 1;
 	}
 	if (n == 0) {
-		Dprint(statp->options & RES_DEBUG, (stdout,
-						    ";; timeout sending\n"));
-		if (recvresp1)
-		  return resplen;
-		if (buf2 != NULL && recvresp2)
-		  return 1;
+		Dprint(statp->options & RES_DEBUG, (stdout, ";; timeout\n"));
+		if (recvresp1 || (buf2 != NULL && recvresp2))
+		  {
+		    *resplen2 = 1;
+		    return resplen;
+		  }
 
 		*gotsomewhere = 1;
 		return (0);
@@ -1184,6 +1184,24 @@ send_dg(res_state statp,
 				thisansp,
 				(*thisresplen > *thisanssiz)
 				? *thisanssiz : *thisresplen);
+
+			if (recvresp1 || (buf2 != NULL && recvresp2))
+			  {
+			    *resplen2 = 1;
+			    return resplen;
+			  }
+			if (buf2 != NULL)
+			  {
+			    /* We are waiting for a possible second reply.  */
+			    resplen = 1;
+			    if (hp->id == anhp->id)
+			      recvresp1 = 1;
+			    else
+			      recvresp2 = 1;
+
+			    goto wait;
+			  }
+
 		next_ns:
 			__res_iclose(statp, false);
 			/* don't retry if called from dig */
diff --git a/scripts/data/localplt-sparc-linux-gnu.data b/scripts/data/localplt-sparc-linux-gnu.data
new file mode 100644
index 0000000000..5ceed16c9b
--- /dev/null
+++ b/scripts/data/localplt-sparc-linux-gnu.data
@@ -0,0 +1,18 @@
+libc.so: _Q_add
+libc.so: _Q_div
+libc.so: _Q_feq
+libc.so: _Q_fge
+libc.so: _Q_fle
+libc.so: _Q_flt
+libc.so: _Q_fne
+libc.so: _Q_itoq
+libc.so: _Q_mul
+libc.so: _Q_sub
+libc.so: _Unwind_Find_FDE
+libc.so: calloc
+libc.so: ffs
+libc.so: free
+libc.so: malloc
+libc.so: memalign
+libc.so: realloc
+libm.so: matherr
diff --git a/scripts/data/localplt-sparc64-linux-gnu.data b/scripts/data/localplt-sparc64-linux-gnu.data
new file mode 100644
index 0000000000..5e6e42d672
--- /dev/null
+++ b/scripts/data/localplt-sparc64-linux-gnu.data
@@ -0,0 +1,20 @@
+libc.so: _Qp_add
+libc.so: _Qp_div
+libc.so: _Qp_feq
+libc.so: _Qp_fge
+libc.so: _Qp_fle
+libc.so: _Qp_flt
+libc.so: _Qp_fne
+libc.so: _Qp_itoq
+libc.so: _Qp_mul
+libc.so: _Qp_qtod
+libc.so: _Qp_sub
+libc.so: _Qp_xtoq
+libc.so: _Unwind_Find_FDE
+libc.so: calloc
+libc.so: ffs
+libc.so: free
+libc.so: malloc
+libc.so: memalign
+libc.so: realloc
+libm.so: matherr
diff --git a/scripts/soversions.awk b/scripts/soversions.awk
index 32ce076ba9..55577ccc7e 100644
--- a/scripts/soversions.awk
+++ b/scripts/soversions.awk
@@ -18,6 +18,16 @@ $2 ~ /WORDSIZE[3264]/ {
   next;
 }
 
+$2 == "ABI" {
+  if ((config ~ thiscf) && !abiname) {
+    abiname = $3;
+    sub(/@CPU@/, cpu, abiname);
+    sub(/@VENDOR@/, vendor, abiname);
+    sub(/@OS@/, os, abiname);
+  }
+  next;
+}
+
 # Obey the first matching DEFAULT line.
 $2 == "DEFAULT" {
   $1 = $2 = "";
@@ -66,6 +76,9 @@ END {
 	}
       }
   }
+  if (abiname) {
+    print "ABI", abiname
+  }
   for (c in lines) {
     print lines[c]
   }
diff --git a/shlib-versions b/shlib-versions
index 9a10fc0566..65e772bbb5 100644
--- a/shlib-versions
+++ b/shlib-versions
@@ -43,6 +43,11 @@ powerpc.*-.*-.*		WORDSIZE64		powerpc64-@VENDOR@-@OS@
 sparc64.*-.*-.*		WORDSIZE32		sparc-@VENDOR@-@OS@
 sparc.*-.*-.*		WORDSIZE64		sparc64-@VENDOR@-@OS@
 
+# Configuration		ABI			Identifier for ABI data files
+# -------------		----------		-----------------------------
+sparc64.*-.*-.*		ABI			sparc64-@OS@
+sparc.*-.*-.*		ABI			sparc-@OS@
+
 # Configuration		Library=version		Earliest symbol set (optional)
 # -------------		---------------		------------------------------
 
diff --git a/stdio-common/Makefile b/stdio-common/Makefile
index f9fc9da306..f8ae6f25d9 100644
--- a/stdio-common/Makefile
+++ b/stdio-common/Makefile
@@ -57,7 +57,8 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \
 	 tst-perror tst-sprintf tst-rndseek tst-fdopen tst-fphex bug14 bug15 \
 	 tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \
 	 tst-fwrite bug16 bug17 tst-swscanf tst-sprintf2 bug18 bug18a \
-	 bug19 bug19a tst-popen2 scanf13 scanf14 scanf15 bug20 bug21 bug22
+	 bug19 bug19a tst-popen2 scanf13 scanf14 scanf15 bug20 bug21 bug22 \
+	 scanf16 scanf17
 
 test-srcs = tst-unbputc tst-printf
 
@@ -109,11 +110,13 @@ CFLAGS-isoc99_scanf.c += $(exceptions)
 CFLAGS-errlist.c = $(fno-unit-at-a-time)
 CFLAGS-siglist.c = $(fno-unit-at-a-time)
 
-# The following is a hack since we must compile scanf15.c without any
+# The following is a hack since we must compile scanf1{5,7}.c without any
 # GNU extension.  The latter are needed, though, when internal headers
 # are used.  So made sure we see the installed headers first.
 CFLAGS-scanf15.c = -I../libio -I../stdlib -I../wcsmbs -I../time -I../string \
 		   -I../wctype
+CFLAGS-scanf17.c = -I../libio -I../stdlib -I../wcsmbs -I../time -I../string \
+		   -I../wctype
 
 # We know the test has a format string problem.
 CFLAGS-tst-sprintf.c = -Wno-format
diff --git a/stdio-common/scanf14.c b/stdio-common/scanf14.c
index 387ceba4bb..6ca5c7c567 100644
--- a/stdio-common/scanf14.c
+++ b/stdio-common/scanf14.c
@@ -59,5 +59,58 @@ main (void)
   else if (d != 5.25 || memcmp (c, " x", 2) != 0)
     FAIL ();
 
+  const char *tmpdir = getenv ("TMPDIR");
+  if (tmpdir == NULL || tmpdir[0] == '\0')
+    tmpdir = "/tmp";
+
+  char fname[strlen (tmpdir) + sizeof "/tst-scanf14.XXXXXX"];
+  sprintf (fname, "%s/tst-scanf14.XXXXXX", tmpdir);
+  if (fname == NULL)
+    FAIL ();
+
+  /* Create a temporary file.   */
+  int fd = mkstemp (fname);
+  if (fd == -1)
+    FAIL ();
+
+  FILE *fp = fdopen (fd, "w+");
+  if (fp == NULL)
+    FAIL ();
+  else
+    {
+      if (fputs (" 1.25s x", fp) == EOF)
+	FAIL ();
+      if (fseek (fp, 0, SEEK_SET) != 0)
+	FAIL ();
+      if (fscanf (fp, "%as%2c", &sp, c) != 2)
+	FAIL ();
+      else
+	{
+	  if (strcmp (sp, "1.25s") != 0 || memcmp (c, " x", 2) != 0)
+	    FAIL ();
+	  memset (sp, 'x', sizeof "1.25s");
+	  free (sp);
+	}
+
+      if (freopen (fname, "r", stdin) == NULL)
+	FAIL ();
+      else
+	{
+	  if (scanf ("%as%2c", &sp, c) != 2)
+	    FAIL ();
+	  else
+	    {
+	      if (strcmp (sp, "1.25s") != 0 || memcmp (c, " x", 2) != 0)
+		FAIL ();
+	      memset (sp, 'x', sizeof "1.25s");
+	      free (sp);
+	    }
+	}
+
+      fclose (fp);
+    }
+
+  remove (fname);
+
   return result;
 }
diff --git a/stdio-common/scanf15.c b/stdio-common/scanf15.c
index cc8aa2e6a6..c56715c486 100644
--- a/stdio-common/scanf15.c
+++ b/stdio-common/scanf15.c
@@ -50,5 +50,48 @@ main (void)
   else if (d != 5.25 || memcmp (c, " x", 2) != 0)
     FAIL ();
 
+  const char *tmpdir = getenv ("TMPDIR");
+  if (tmpdir == NULL || tmpdir[0] == '\0')
+    tmpdir = "/tmp";
+
+  char fname[strlen (tmpdir) + sizeof "/tst-scanf15.XXXXXX"];
+  sprintf (fname, "%s/tst-scanf15.XXXXXX", tmpdir);
+  if (fname == NULL)
+    FAIL ();
+
+  /* Create a temporary file.   */
+  int fd = mkstemp (fname);
+  if (fd == -1)
+    FAIL ();
+
+  FILE *fp = fdopen (fd, "w+");
+  if (fp == NULL)
+    FAIL ();
+  else
+    {
+      if (fputs (" 1.25s x", fp) == EOF)
+	FAIL ();
+      if (fseek (fp, 0, SEEK_SET) != 0)
+	FAIL ();
+      if (fscanf (fp, "%as%2c", &f, c) != 2)
+	FAIL ();
+      else if (f != 1.25 || memcmp (c, " x", 2) != 0)
+	FAIL ();
+
+      if (freopen (fname, "r", stdin) == NULL)
+	FAIL ();
+      else
+	{
+	  if (scanf ("%as%2c", &f, c) != 2)
+	    FAIL ();
+	  else if (f != 1.25 || memcmp (c, " x", 2) != 0)
+	    FAIL ();
+	}
+
+      fclose (fp);
+    }
+
+  remove (fname);
+
   return result;
 }
diff --git a/stdio-common/scanf16.c b/stdio-common/scanf16.c
new file mode 100644
index 0000000000..3e3cb417f2
--- /dev/null
+++ b/stdio-common/scanf16.c
@@ -0,0 +1,147 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+
+#define FAIL() \
+  do {							\
+    result = 1;						\
+    printf ("test at line %d failed\n", __LINE__);	\
+  } while (0)
+
+static int
+xsscanf (const char *str, const char *fmt, ...)
+{
+  va_list ap;
+  va_start (ap, fmt);
+  int ret = vsscanf (str, fmt, ap);
+  va_end (ap);
+  return ret;
+}
+
+static int
+xscanf (const char *fmt, ...)
+{
+  va_list ap;
+  va_start (ap, fmt);
+  int ret = vscanf (fmt, ap);
+  va_end (ap);
+  return ret;
+}
+
+static int
+xfscanf (FILE *f, const char *fmt, ...)
+{
+  va_list ap;
+  va_start (ap, fmt);
+  int ret = vfscanf (f, fmt, ap);
+  va_end (ap);
+  return ret;
+}
+
+int
+main (void)
+{
+  wchar_t *lsp;
+  char *sp;
+  float f;
+  double d;
+  char c[8];
+  int result = 0;
+
+  if (xsscanf (" 0.25s x", "%e%3c", &f, c) != 2)
+    FAIL ();
+  else if (f != 0.25 || memcmp (c, "s x", 3) != 0)
+    FAIL ();
+  if (xsscanf (" 1.25s x", "%as%2c", &sp, c) != 2)
+    FAIL ();
+  else
+    {
+      if (strcmp (sp, "1.25s") != 0 || memcmp (c, " x", 2) != 0)
+	FAIL ();
+      memset (sp, 'x', sizeof "1.25s");
+      free (sp);
+    }
+  if (xsscanf (" 2.25s x", "%las%2c", &d, c) != 2)
+    FAIL ();
+  else if (d != 2.25 || memcmp (c, " x", 2) != 0)
+    FAIL ();
+  if (xsscanf (" 3.25S x", "%4aS%3c", &lsp, c) != 2)
+    FAIL ();
+  else
+    {
+      if (wcscmp (lsp, L"3.25") != 0 || memcmp (c, "S x", 3) != 0)
+	FAIL ();
+      memset (lsp, 'x', sizeof L"3.25");
+      free (lsp);
+    }
+  if (xsscanf ("4.25[0-9.] x", "%a[0-9.]%8c", &sp, c) != 2)
+    FAIL ();
+  else
+    {
+      if (strcmp (sp, "4.25") != 0 || memcmp (c, "[0-9.] x", 8) != 0)
+	FAIL ();
+      memset (sp, 'x', sizeof "4.25");
+      free (sp);
+    }
+  if (xsscanf ("5.25[0-9.] x", "%la[0-9.]%2c", &d, c) != 2)
+    FAIL ();
+  else if (d != 5.25 || memcmp (c, " x", 2) != 0)
+    FAIL ();
+
+  const char *tmpdir = getenv ("TMPDIR");
+  if (tmpdir == NULL || tmpdir[0] == '\0')
+    tmpdir = "/tmp";
+
+  char fname[strlen (tmpdir) + sizeof "/tst-scanf16.XXXXXX"];
+  sprintf (fname, "%s/tst-scanf16.XXXXXX", tmpdir);
+  if (fname == NULL)
+    FAIL ();
+
+  /* Create a temporary file.   */
+  int fd = mkstemp (fname);
+  if (fd == -1)
+    FAIL ();
+
+  FILE *fp = fdopen (fd, "w+");
+  if (fp == NULL)
+    FAIL ();
+  else
+    {
+      if (fputs (" 1.25s x", fp) == EOF)
+	FAIL ();
+      if (fseek (fp, 0, SEEK_SET) != 0)
+	FAIL ();
+      if (xfscanf (fp, "%as%2c", &sp, c) != 2)
+	FAIL ();
+      else
+	{
+	  if (strcmp (sp, "1.25s") != 0 || memcmp (c, " x", 2) != 0)
+	    FAIL ();
+	  memset (sp, 'x', sizeof "1.25s");
+	  free (sp);
+	}
+
+      if (freopen (fname, "r", stdin) == NULL)
+	FAIL ();
+      else
+	{
+	  if (xscanf ("%as%2c", &sp, c) != 2)
+	    FAIL ();
+	  else
+	    {
+	      if (strcmp (sp, "1.25s") != 0 || memcmp (c, " x", 2) != 0)
+		FAIL ();
+	      memset (sp, 'x', sizeof "1.25s");
+	      free (sp);
+	    }
+	}
+
+      fclose (fp);
+    }
+
+  remove (fname);
+
+  return result;
+}
diff --git a/stdio-common/scanf17.c b/stdio-common/scanf17.c
new file mode 100644
index 0000000000..ee9024f9b7
--- /dev/null
+++ b/stdio-common/scanf17.c
@@ -0,0 +1,128 @@
+#undef _GNU_SOURCE
+#define _XOPEN_SOURCE 600
+/* The following macro definitions are a hack.  They word around disabling
+   the GNU extension while still using a few internal headers.  */
+#define u_char unsigned char
+#define u_short unsigned short
+#define u_int unsigned int
+#define u_long unsigned long
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+
+#define FAIL() \
+  do {							\
+    result = 1;						\
+    printf ("test at line %d failed\n", __LINE__);	\
+  } while (0)
+
+static int
+xsscanf (const char *str, const char *fmt, ...)
+{
+  va_list ap;
+  va_start (ap, fmt);
+  int ret = vsscanf (str, fmt, ap);
+  va_end (ap);
+  return ret;
+}
+
+static int
+xscanf (const char *fmt, ...)
+{
+  va_list ap;
+  va_start (ap, fmt);
+  int ret = vscanf (fmt, ap);
+  va_end (ap);
+  return ret;
+}
+
+static int
+xfscanf (FILE *f, const char *fmt, ...)
+{
+  va_list ap;
+  va_start (ap, fmt);
+  int ret = vfscanf (f, fmt, ap);
+  va_end (ap);
+  return ret;
+}
+
+int
+main (void)
+{
+  float f;
+  double d;
+  char c[8];
+  int result = 0;
+
+  if (xsscanf (" 0.25s x", "%e%3c", &f, c) != 2)
+    FAIL ();
+  else if (f != 0.25 || memcmp (c, "s x", 3) != 0)
+    FAIL ();
+  if (xsscanf (" 1.25s x", "%as%2c", &f, c) != 2)
+    FAIL ();
+  else if (f != 1.25 || memcmp (c, " x", 2) != 0)
+    FAIL ();
+  if (xsscanf (" 2.25s x", "%las%2c", &d, c) != 2)
+    FAIL ();
+  else if (d != 2.25 || memcmp (c, " x", 2) != 0)
+    FAIL ();
+  if (xsscanf (" 3.25S x", "%4aS%2c", &f, c) != 2)
+    FAIL ();
+  else if (f != 3.25 || memcmp (c, " x", 2) != 0)
+    FAIL ();
+  if (xsscanf (" 4.25[0-9.] x", "%a[0-9.]%2c", &f, c) != 2)
+    FAIL ();
+  else if (f != 4.25 || memcmp (c, " x", 2) != 0)
+    FAIL ();
+  if (xsscanf (" 5.25[0-9.] x", "%la[0-9.]%2c", &d, c) != 2)
+    FAIL ();
+  else if (d != 5.25 || memcmp (c, " x", 2) != 0)
+    FAIL ();
+
+  const char *tmpdir = getenv ("TMPDIR");
+  if (tmpdir == NULL || tmpdir[0] == '\0')
+    tmpdir = "/tmp";
+
+  char fname[strlen (tmpdir) + sizeof "/tst-scanf17.XXXXXX"];
+  sprintf (fname, "%s/tst-scanf17.XXXXXX", tmpdir);
+  if (fname == NULL)
+    FAIL ();
+
+  /* Create a temporary file.   */
+  int fd = mkstemp (fname);
+  if (fd == -1)
+    FAIL ();
+
+  FILE *fp = fdopen (fd, "w+");
+  if (fp == NULL)
+    FAIL ();
+  else
+    {
+      if (fputs (" 1.25s x", fp) == EOF)
+	FAIL ();
+      if (fseek (fp, 0, SEEK_SET) != 0)
+	FAIL ();
+      if (xfscanf (fp, "%as%2c", &f, c) != 2)
+	FAIL ();
+      else if (f != 1.25 || memcmp (c, " x", 2) != 0)
+	FAIL ();
+
+      if (freopen (fname, "r", stdin) == NULL)
+	FAIL ();
+      else
+	{
+	  if (xscanf ("%as%2c", &f, c) != 2)
+	    FAIL ();
+	  else if (f != 1.25 || memcmp (c, " x", 2) != 0)
+	    FAIL ();
+	}
+
+      fclose (fp);
+    }
+
+  remove (fname);
+
+  return result;
+}
diff --git a/string/endian.h b/string/endian.h
index 430fb3a5c4..37d030a252 100644
--- a/string/endian.h
+++ b/string/endian.h
@@ -56,39 +56,41 @@
 #endif
 
 
+#ifdef __USE_BSD
 /* Conversion interfaces.  */
-#include <bits/byteswap.h>
-
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-# define htobe16(x) __bswap_16 (x)
-# define htole16(x) (x)
-# define be16toh(x) __bswap_16 (x)
-# define le16toh(x) (x)
-
-# define htobe32(x) __bswap_32 (x)
-# define htole32(x) (x)
-# define be32toh(x) __bswap_32 (x)
-# define le32toh(x) (x)
-
-# define htobe64(x) __bswap_64 (x)
-# define htole64(x) (x)
-# define be64toh(x) __bswap_64 (x)
-# define le64toh(x) (x)
-#else
-# define htobe16(x) (x)
-# define htole16(x) __bswap_16 (x)
-# define be16toh(x) (x)
-# define le16toh(x) __bswap_16 (x)
-
-# define htobe32(x) (x)
-# define htole32(x) __bswap_32 (x)
-# define be32toh(x) (x)
-# define le32toh(x) __bswap_32 (x)
-
-# define htobe64(x) (x)
-# define htole64(x) __bswap_64 (x)
-# define be64toh(x) (x)
-# define le64toh(x) __bswap_64 (x)
+# include <bits/byteswap.h>
+
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+#  define htobe16(x) __bswap_16 (x)
+#  define htole16(x) (x)
+#  define be16toh(x) __bswap_16 (x)
+#  define le16toh(x) (x)
+
+#  define htobe32(x) __bswap_32 (x)
+#  define htole32(x) (x)
+#  define be32toh(x) __bswap_32 (x)
+#  define le32toh(x) (x)
+
+#  define htobe64(x) __bswap_64 (x)
+#  define htole64(x) (x)
+#  define be64toh(x) __bswap_64 (x)
+#  define le64toh(x) (x)
+# else
+#  define htobe16(x) (x)
+#  define htole16(x) __bswap_16 (x)
+#  define be16toh(x) (x)
+#  define le16toh(x) __bswap_16 (x)
+
+#  define htobe32(x) (x)
+#  define htole32(x) __bswap_32 (x)
+#  define be32toh(x) (x)
+#  define le32toh(x) __bswap_32 (x)
+
+#  define htobe64(x) (x)
+#  define htole64(x) __bswap_64 (x)
+#  define be64toh(x) (x)
+#  define le64toh(x) __bswap_64 (x)
+# endif
 #endif
 
 #endif	/* endian.h */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S b/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S
index 33e40ac65a..a38cd30c02 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S
@@ -111,7 +111,7 @@ ENTRY(__start_context)
 	 mov	%g1, %o0
 	/* If this returns (which can happen if the syscall fails) we'll
 	   exit the program with the return error value (-1).  */
-1:	call	exit
+1:	call	HIDDEN_JUMPTARGET(exit)
 	 nop
 	/* The 'exit' call should never return.  In case it does cause
 	   the process to terminate.  */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
index c808a97fc5..3cb0a48c95 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
@@ -1,4 +1,5 @@
-/* Copyright (C) 1997, 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 2002, 2003, 2004, 2006, 2008
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, January 1997.
 
@@ -89,6 +90,13 @@ ENTRY(name);					\
 
 #else  /* __ASSEMBLER__ */
 
+#if defined SHARED && defined DO_VERSIONING && defined PIC \
+    && !defined NO_HIDDEN && !defined NOT_IN_libc
+# define CALL_ERRNO_LOCATION "call   __GI___errno_location;"
+#else
+# define CALL_ERRNO_LOCATION "call   __errno_location;"
+#endif
+
 #define __SYSCALL_STRING						\
 	"ta	0x10;"							\
 	"bcs	2f;"							\
@@ -97,7 +105,7 @@ ENTRY(name);					\
 	".subsection 2;"						\
 	"2:"								\
 	"save	%%sp, -192, %%sp;"					\
-	"call	__errno_location;"					\
+	CALL_ERRNO_LOCATION						\
 	" nop;"								\
 	"st	%%i0,[%%o0];"						\
 	"ba	1b;"							\
@@ -113,7 +121,7 @@ ENTRY(name);					\
 	".subsection 2;"						\
 	"2:"								\
 	"save	%%sp, -192, %%sp;"					\
-	"call	__errno_location;"					\
+	CALL_ERRNO_LOCATION						\
 	" nop;"								\
 	"st	%%i0, [%%o0];"						\
 	"ba	1b;"							\
@@ -126,7 +134,7 @@ ENTRY(name);					\
 	" sub	%%g0, %%o0, %%o0;"					\
 	"1:"
 
-#define __SYSCALL_CLOBBERS "g2", "g3", "g4", "g5", "g6",		\
+#define __SYSCALL_CLOBBERS						\
 	"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",			\
 	"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",		\
 	"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",		\
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S b/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S
index 134ce789f7..ccc5589927 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 2008 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997.
 
@@ -86,7 +86,11 @@ ENTRY (__brk)
 #endif
 	st	%o0, [%g1]
 #else
+#ifndef NOT_IN_libc
+	call	HIDDEN_JUMPTARGET(__errno_location)
+#else
 	call	__errno_location
+#endif
 	 mov	%o0,%l1
 	st	%l1, [%o0]
 #endif
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
index f156f9241a..79fa13de75 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 2000, 2002, 2003, 2004, 2006
+/* Copyright (C) 1997, 2000, 2002, 2003, 2004, 2006, 2008
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997.
@@ -106,12 +106,19 @@ ENTRY(name);					\
 
 #else  /* __ASSEMBLER__ */
 
+#if defined SHARED && defined DO_VERSIONING && defined PIC \
+    && !defined NO_HIDDEN && !defined NOT_IN_libc
+# define CALL_ERRNO_LOCATION "call   __GI___errno_location;"
+#else
+# define CALL_ERRNO_LOCATION "call   __errno_location;"
+#endif
+
 #define __SYSCALL_STRING						\
 	"ta	0x6d;"							\
 	"bcc,pt	%%xcc, 1f;"						\
 	" nop;"								\
 	"save	%%sp, -192, %%sp;"					\
-	"call	__errno_location;"					\
+	CALL_ERRNO_LOCATION						\
 	" nop;"								\
 	"st	%%i0,[%%o0];"						\
 	"restore %%g0, -1, %%o0;"					\
@@ -122,7 +129,7 @@ ENTRY(name);					\
 	"bcc,pt	%%xcc, 1f;"						\
 	" sub	%%o1, 1, %%o1;"						\
 	"save	%%sp, -192, %%sp;"					\
-	"call	__errno_location;"					\
+	CALL_ERRNO_LOCATION						\
 	" mov	-1, %%i1;"						\
 	"st	%%i0,[%%o0];"						\
 	"restore %%g0, -1, %%o0;"					\
@@ -135,7 +142,7 @@ ENTRY(name);					\
 	" sub	%%g0, %%o0, %%o0;"					\
 	"1:"
 
-#define __SYSCALL_CLOBBERS "g2", "g3", "g4", "g5", "g6",		\
+#define __SYSCALL_CLOBBERS						\
 	"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",			\
 	"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",		\
 	"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",		\