summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--config.h.in3
-rwxr-xr-xconfigure40
-rw-r--r--configure.in22
-rw-r--r--include/libc-symbols.h5
5 files changed, 71 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 5c35704456..a63aaeea85 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 1998-10-26  Ulrich Drepper  <drepper@cygnus.com>
 
+	* include/libc-symbols.h: If HAVE_BUILTIN_EXPECT is not defined
+	define __builtin_expect as a macro substituting to the first
+	argument.
+	* config.h.in: Define HAVE_BUILTIN_EXPECT.
+	* configure.in: Add test for __builtin_expect.
+
 	* sysdeps/unix/sysv/linux/bits/types.h: Include
 	bits/pthreadtypes.h only not for POSIX 199506.
 	* sysdeps/unix/sysv/linux/alpha/bits/types.h: Likewise.
diff --git a/config.h.in b/config.h.in
index f15e5c7b06..dc1d5bc846 100644
--- a/config.h.in
+++ b/config.h.in
@@ -59,6 +59,9 @@
    with static variable. */
 #undef	HAVE_DWARF2_UNWIND_INFO_STATIC
 
+/* Define if the compiler supports __builtin_expect.  */
+#undef	HAVE_BUILTIN_EXPECT
+
 /* Define if the regparm attribute shall be used for local functions
    (gcc on ix86 only).  */
 #undef	USE_REGPARMS
diff --git a/configure b/configure
index 24a2d7f753..b06bb24084 100755
--- a/configure
+++ b/configure
@@ -2683,6 +2683,36 @@ EOF
   ;;
 esac
 
+echo $ac_n "checking for __builtin_expect""... $ac_c" 1>&6
+echo "configure:2688: checking for __builtin_expect" >&5
+if eval "test \"`echo '$''{'libc_cv_gcc_builtin_expect'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.c <<EOF
+#line 2693 "configure"
+int foo (int a)
+{
+  a = __builtin_expect (a, 10);
+  return a == 10 ? 0 : 1;
+}
+EOF
+if { ac_try='${CC-cc} $CFLAGS -nostdlib -nostartfiles
+			    -o conftest conftest.c -lgcc >&5'; { (eval echo configure:2701: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+  libc_cv_gcc_builtin_expect=yes
+else
+  libc_cv_gcc_builtin_expect=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$libc_cv_gcc_builtin_expect" 1>&6
+if test "$libc_cv_gcc_builtin_expect" = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_BUILTIN_EXPECT 1
+EOF
+
+fi
+
 ### End of automated tests.
 ### Now run sysdeps configure fragments.
 
@@ -2728,7 +2758,7 @@ if test "$uname" = "sysdeps/generic"; then
   fi
 
   echo $ac_n "checking OS release for uname""... $ac_c" 1>&6
-echo "configure:2732: checking OS release for uname" >&5
+echo "configure:2762: checking OS release for uname" >&5
 if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2750,7 +2780,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6
   uname_release="$libc_cv_uname_release"
 
   echo $ac_n "checking OS version for uname""... $ac_c" 1>&6
-echo "configure:2754: checking OS version for uname" >&5
+echo "configure:2784: checking OS version for uname" >&5
 if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2772,7 +2802,7 @@ else
 fi
 
 echo $ac_n "checking stdio selection""... $ac_c" 1>&6
-echo "configure:2776: checking stdio selection" >&5
+echo "configure:2806: checking stdio selection" >&5
 
 case $stdio in
 libio) cat >> confdefs.h <<\EOF
@@ -2786,7 +2816,7 @@ echo "$ac_t""$stdio" 1>&6
 # Test for old glibc 2.0.x headers so that they can be removed properly
 # Search only in includedir.
 echo $ac_n "checking for old glibc 2.0.x headers""... $ac_c" 1>&6
-echo "configure:2790: checking for old glibc 2.0.x headers" >&5
+echo "configure:2820: checking for old glibc 2.0.x headers" >&5
 if eval test -f "${includedir}/elfclass.h" -a -f "${includedir}/fcntlbits.h"
 then
   old_glibc_headers=yes
@@ -2840,7 +2870,7 @@ if test $shared = default; then
 fi
 
 echo $ac_n "checking whether -fPIC is default""... $ac_c" 1>&6
-echo "configure:2844: checking whether -fPIC is default" >&5
+echo "configure:2874: checking whether -fPIC is default" >&5
 if eval "test \"`echo '$''{'pic_default'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
diff --git a/configure.in b/configure.in
index d256af08da..40d9f55a16 100644
--- a/configure.in
+++ b/configure.in
@@ -987,6 +987,28 @@ static)
   ;;
 esac
 
+dnl Check whether compiler understands __builtin_expect.
+AC_CACHE_CHECK(for __builtin_expect, libc_cv_gcc_builtin_expect,
+[cat > conftest.c <<EOF
+#line __oline__ "configure"
+int foo (int a)
+{
+  a = __builtin_expect (a, 10);
+  return a == 10 ? 0 : 1;
+}
+EOF
+dnl No \ in command here because it ends up inside ''.
+if AC_TRY_COMMAND([${CC-cc} $CFLAGS -nostdlib -nostartfiles
+			    -o conftest conftest.c -lgcc >&AC_FD_CC]); then
+  libc_cv_gcc_builtin_expect=yes
+else
+  libc_cv_gcc_builtin_expect=no
+fi
+rm -f conftest*])
+if test "$libc_cv_gcc_builtin_expect" = yes; then
+  AC_DEFINE(HAVE_BUILTIN_EXPECT)
+fi
+
 ### End of automated tests.
 ### Now run sysdeps configure fragments.
 
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index 4684cb7f4a..5d15791fda 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -226,6 +226,11 @@ extern const char _libc_intl_domainname[];
 # define internal_function	/* empty */
 #endif
 
+/* Prepare for the case that `__builtin_expect' is not available.  */
+#ifndef HAVE_BUILTIN_EXPECT
+# define __builtin_expect(expr, val) (expr)
+#endif
+
 /* When a reference to SYMBOL is encountered, the linker will emit a
    warning message MSG.  */
 #ifdef HAVE_GNU_LD