diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | config.h.in | 3 | ||||
-rwxr-xr-x | configure | 40 | ||||
-rw-r--r-- | configure.in | 22 | ||||
-rw-r--r-- | include/libc-symbols.h | 5 |
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 |