summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--NEWS10
-rw-r--r--README2
-rw-r--r--aclocal.m433
-rwxr-xr-xconfigure9
-rw-r--r--configure.in9
-rw-r--r--sysdeps/i386/configure39
-rw-r--r--sysdeps/i386/configure.in19
8 files changed, 126 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index f72c3e06a2..25203dce15 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2013-04-06  Carlos O'Donell  <carlos@redhat.com>
 
+	[BZ #10060, #10062]
+	* aclocal.m4 (LIBC_COMPILER_BUILTIN_INLINED): New macro.
+	* sysdeps/i386/configure.in: Use LIBC_COMPILER_BUILTIN_INLINED and
+	fail configure if __sync_val_compare_and_swap is not inlined.
+	* sysdeps/i386/configure: Regenerate.
+	* configure.in: Build for i686 when configured for i386.
+	* configure: Regenerate.
+	* README: Remove i386 reference.
+
+2013-04-06  Carlos O'Donell  <carlos@redhat.com>
+
 	* sysdeps/s390/s390-32/sysdep.h: Undefine PSEUDO before redefinition.
 	* sysdeps/s390/s390-64/sysdep.h: Likewise.
 
diff --git a/NEWS b/NEWS
index b85b67d280..e5c8c864d3 100644
--- a/NEWS
+++ b/NEWS
@@ -9,11 +9,11 @@ Version 2.18
 
 * The following bugs are resolved with this release:
 
-  10357, 11120, 11561, 12723, 13550, 13889, 13951, 14142, 14176, 14200,
-  14317, 14327, 14478, 14496, 14686, 14812, 14920, 14964, 14981, 14982,
-  14985, 14994, 14996, 15003, 15006, 15020, 15023, 15036, 15054, 15055,
-  15062, 15078, 15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304,
-  15305, 15307, 15327, 15330, 15335, 15336, 15337, 15342.
+  10060, 10062, 10357, 11120, 11561, 12723, 13550, 13889, 13951, 14142,
+  14176, 14200, 14317, 14327, 14478, 14496, 14686, 14812, 14920, 14964,
+  14981, 14982, 14985, 14994, 14996, 15003, 15006, 15020, 15023, 15036,
+  15054, 15055, 15062, 15078, 15160, 15214, 15232, 15234, 15283, 15285,
+  15287, 15304, 15305, 15307, 15327, 15330, 15335, 15336, 15337, 15342.
 
 * CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla
   #15078).
diff --git a/README b/README
index 6fdfc03138..bb4ccb896b 100644
--- a/README
+++ b/README
@@ -12,7 +12,7 @@ implement the operating system behavior seen by user applications.
 In GNU/Hurd systems, it works with a microkernel and Hurd servers.
 
 The GNU C Library implements much of the POSIX.1 functionality in the
-GNU/Hurd system, using configurations i[34567]86-*-gnu.  The current
+GNU/Hurd system, using configurations i[4567]86-*-gnu.  The current
 GNU/Hurd support requires out-of-tree patches that will eventually be
 incorporated into an official GNU C Library release.
 
diff --git a/aclocal.m4 b/aclocal.m4
index 042a7e3c38..64351d0a00 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -248,3 +248,36 @@ dnl LIBC_CONFIG_VAR(make-variable, shell-value)
 AC_DEFUN([LIBC_CONFIG_VAR],
 [config_vars="$config_vars
 $1 = $2"])
+
+dnl Check that function FUNC was inlined as a builtin.  The code fragment
+dnl CODE is compiled with additional options CC_OPTION.  If FUNC is
+dnl not found in the assembly then it is assumed the compiler has support
+dnl for this builtin and has inlined the call.  If the compiler has the
+dnl feature then ACTION-IF-TRUE is called, otherwise ACTION-IF-FALSE.
+dnl It is up to the caller to provide a CC_OPTION that ensures the
+dnl builtin is inlined if present.
+dnl Warning: This may not work for some machines. For example on ARM the
+dnl ABI dictates that some functions should not be inlined and instead
+dnl should be provided by a compiler helper library e.g. __aeabi_memcpy.
+dnl This is done to reduce code size.
+dnl LIBC_COMPILER_BUILTIN([func], [code], [cc_option], [action-if-true], [action-if-false])
+AC_DEFUN([LIBC_COMPILER_BUILTIN_INLINED],
+[AC_MSG_CHECKING([for compiler support of inlined builtin function $1])
+libc_compiler_builtin_inlined=no
+cat > conftest.c <<EOF
+int _start (void) { $2 return 0; }
+EOF
+if ! AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
+		     $3 -nostdlib -nostartfiles
+		     -S conftest.c -o - | fgrep "$1"
+		     1>&AS_MESSAGE_LOG_FD])
+then
+  libc_compiler_builtin_inlined=yes
+fi
+rm -f conftest*
+if test $libc_compiler_builtin_inlined = yes; then
+  $4
+else
+  $5
+fi
+AC_MSG_RESULT($libc_compiler_builtin_inlined)])
diff --git a/configure b/configure
index 088bef0515..0b50df94f5 100755
--- a/configure
+++ b/configure
@@ -3741,6 +3741,15 @@ case "$machine-$host_os" in
     ;;
 esac
 
+# Configure for i686 if the user asks for i386. We don't support
+# i386 any more but it continues to be common for users to configure
+# 32-bit x86 as i386. We build for i686 instead.
+if test "$machine" = i386; then
+  machine="i686"
+  echo "\
+*** WARNING: Support for i386 is deprecated. Building for i686 instead."
+fi
+
 submachine=
 
 # Check whether --with-cpu was given.
diff --git a/configure.in b/configure.in
index bbdf156b09..d93ca5ca98 100644
--- a/configure.in
+++ b/configure.in
@@ -390,6 +390,15 @@ case "$machine-$host_os" in
     ;;
 esac
 
+# Configure for i686 if the user asks for i386. We don't support
+# i386 any more but it continues to be common for users to configure
+# 32-bit x86 as i386. We build for i686 instead.
+if test "$machine" = i386; then
+  machine="i686"
+  echo "\
+*** WARNING: Support for i386 is deprecated. Building for i686 instead."
+fi
+
 submachine=
 AC_ARG_WITH([cpu],
 	    AS_HELP_STRING([--with-cpu=CPU], [select code for CPU variant]),
diff --git a/sysdeps/i386/configure b/sysdeps/i386/configure
index d81b613a81..a1a0fe7bad 100644
--- a/sysdeps/i386/configure
+++ b/sysdeps/i386/configure
@@ -32,6 +32,45 @@ $as_echo "$ac_res" >&6; }
 # This file is generated from configure.in by Autoconf.  DO NOT EDIT!
  # Local configure fragment for sysdeps/i386.
 
+# The GNU C Library can't be built for i386.  There are several reasons for
+# this restriction.  The primary reason is that i386 lacks the atomic
+# operations required to support the current NPTL implementation.  While it is
+# possible that such atomic operations could be emulated in the kernel to date
+# no such work has been done to enable this.  Even with NPTL disabled you still
+# have no atomic.h implementation.  Given the declining use of i386 we disable
+# support for building with `-march=i386' or `-mcpu=i386.' We don't explicitly
+# check for i386, instead we make sure the compiler has support for inlining
+# the builtin __sync_val_compare_and_swap. If it does then we should have no
+# problem building for i386.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler support of inlined builtin function __sync_val_compare_and_swap" >&5
+$as_echo_n "checking for compiler support of inlined builtin function __sync_val_compare_and_swap... " >&6; }
+libc_compiler_builtin_inlined=no
+cat > conftest.c <<EOF
+int _start (void) { int a, b, c; __sync_val_compare_and_swap (&a, b, c); return 0; }
+EOF
+if ! { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
+		     -O0 -nostdlib -nostartfiles
+		     -S conftest.c -o - | fgrep "__sync_val_compare_and_swap"
+		     1>&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+then
+  libc_compiler_builtin_inlined=yes
+fi
+rm -f conftest*
+if test $libc_compiler_builtin_inlined = yes; then
+  libc_cv_unsupported_i386=no
+else
+  as_fn_error $? "
+*** Building with -march=i386/-mcpu=i386 is not supported.
+*** Please use host i786, i686, i586, or i486." "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_compiler_builtin_inlined" >&5
+$as_echo "$libc_compiler_builtin_inlined" >&6; }
+
 
 ac_fn_c_check_header_compile "$LINENO" "cpuid.h" "ac_cv_header_cpuid_h" "/* No default includes.  */
 "
diff --git a/sysdeps/i386/configure.in b/sysdeps/i386/configure.in
index 9967a160ba..56a7c1fbcc 100644
--- a/sysdeps/i386/configure.in
+++ b/sysdeps/i386/configure.in
@@ -1,6 +1,25 @@
 GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
 # Local configure fragment for sysdeps/i386.
 
+# The GNU C Library can't be built for i386.  There are several reasons for
+# this restriction.  The primary reason is that i386 lacks the atomic
+# operations required to support the current NPTL implementation.  While it is
+# possible that such atomic operations could be emulated in the kernel to date
+# no such work has been done to enable this.  Even with NPTL disabled you still
+# have no atomic.h implementation.  Given the declining use of i386 we disable
+# support for building with `-march=i386' or `-mcpu=i386.' We don't explicitly
+# check for i386, instead we make sure the compiler has support for inlining
+# the builtin __sync_val_compare_and_swap. If it does then we should have no
+# problem building for i386.
+LIBC_COMPILER_BUILTIN_INLINED(
+  [__sync_val_compare_and_swap],
+  [int a, b, c; __sync_val_compare_and_swap (&a, b, c);],
+  [-O0],
+  [libc_cv_unsupported_i386=no],
+  [AC_MSG_ERROR([
+*** Building with -march=i386/-mcpu=i386 is not supported.
+*** Please use host i786, i686, i586, or i486.])])
+
 AC_CHECK_HEADER([cpuid.h], ,
   [AC_MSG_ERROR([gcc must provide the <cpuid.h> header])],
   [/* No default includes.  */])