From bdbf421cd2aa91716fab7fa7b6a312ab5a576212 Mon Sep 17 00:00:00 2001 From: redi Date: Sun, 9 Sep 2012 17:20:42 +0000 Subject: [PATCH] 2012-09-09 Ulrich Drepper Dominique d'Humieres Jack Howarth PR bootstrap/54419 * acinclude.m4: Define GLIBCXX_CHECK_X86_RDRAND. * configure.ac: Use GLIBCXX_CHECK_X86_RDRAND to test for rdrand support in assembler. * src/c++11/random.cc (__x86_rdrand): Depend on _GLIBCXX_X86_RDRAND. (random_device::_M_init): Likewise. (random_device::_M_getval): Likewise. * configure: Regenerated. * config.h.in: Regenerated. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191111 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 14 ++++++++++++++ libstdc++-v3/acinclude.m4 | 20 +++++++++++++++++++ libstdc++-v3/config.h.in | 3 +++ libstdc++-v3/configure | 42 ++++++++++++++++++++++++++++++++++++++++ libstdc++-v3/configure.ac | 3 +++ libstdc++-v3/src/c++11/random.cc | 6 +++--- 6 files changed, 85 insertions(+), 3 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index bd87dec..34a9d76 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,4 +1,18 @@ 2012-09-09 Ulrich Drepper + Dominique d'Humieres + Jack Howarth + + PR bootstrap/54419 + * acinclude.m4: Define GLIBCXX_CHECK_X86_RDRAND. + * configure.ac: Use GLIBCXX_CHECK_X86_RDRAND to test for rdrand + support in assembler. + * src/c++11/random.cc (__x86_rdrand): Depend on _GLIBCXX_X86_RDRAND. + (random_device::_M_init): Likewise. + (random_device::_M_getval): Likewise. + * configure: Regenerated. + * config.h.in: Regenerated. + +2012-09-09 Ulrich Drepper * src/c++11/random.cc (random_device::_M_init): Use new macro signature_INTEL_ebx to check for Intel processors. diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index 1179407..267302d 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -3360,6 +3360,26 @@ AC_DEFUN([AC_LC_MESSAGES], [ ]) dnl +dnl Check whether rdrand is supported in the assembler. +AC_DEFUN([GLIBCXX_CHECK_X86_RDRAND], [ + AC_MSG_CHECKING([for rdrand support in assembler]) + AC_CACHE_VAL($ac_cv_x86_rdrand, [ + ac_cv_x86_rdrand=no + case "$target" in + i?86-*-* | \ + x86_64-*-*) + AC_TRY_COMPILE(, [asm("rdrand %eax");], + [ac_cv_x86_rdrand=yes], [ac_cv_x86_rdrand=no]) + esac + ]) + if test $ac_cv_x86_rdrand = yes; then + AC_DEFINE(_GLIBCXX_X86_RDRAND, 1, + [ Defined if as can handle rdrand. ]) + fi + AC_MSG_RESULT($ac_cv_x86_rdrand) +]) + +dnl dnl Check whether get_nprocs is available in , and define _GLIBCXX_USE_GET_NPROCS. dnl AC_DEFUN([GLIBCXX_CHECK_GET_NPROCS], [ diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in index 3a29967..075c9f8 100644 --- a/libstdc++-v3/config.h.in +++ b/libstdc++-v3/config.h.in @@ -845,6 +845,9 @@ /* Define if code specialized for wchar_t should be used. */ #undef _GLIBCXX_USE_WCHAR_T +/* Defined if as can handle rdrand. */ +#undef _GLIBCXX_X86_RDRAND + /* Define to 1 if mutex_timedlock is available. */ #undef _GTHREAD_USE_MUTEX_TIMEDLOCK diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index 9ea8042..d55a9ef 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -70621,6 +70621,48 @@ $as_echo "#define _GLIBCXX_LONG_DOUBLE_COMPAT 1" >>confdefs.h esac +# Check if assembler supports rdrand opcode. + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rdrand support in assembler" >&5 +$as_echo_n "checking for rdrand support in assembler... " >&6; } + if { as_var=$ac_cv_x86_rdrand; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + + ac_cv_x86_rdrand=no + case "$target" in + i?86-*-* | \ + x86_64-*-*) + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +asm("rdrand %eax"); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_x86_rdrand=yes +else + ac_cv_x86_rdrand=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + esac + +fi + + if test $ac_cv_x86_rdrand = yes; then + +$as_echo "#define _GLIBCXX_X86_RDRAND 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_x86_rdrand" >&5 +$as_echo "$ac_cv_x86_rdrand" >&6; } + + # This depends on GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE. if $GLIBCXX_IS_NATIVE ; then diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac index 5c86bb9..555f380 100644 --- a/libstdc++-v3/configure.ac +++ b/libstdc++-v3/configure.ac @@ -330,6 +330,9 @@ case "$target" in esac GLIBCXX_CONDITIONAL(GLIBCXX_LDBL_COMPAT, test $ac_ldbl_compat = yes) +# Check if assembler supports rdrand opcode. +GLIBCXX_CHECK_X86_RDRAND + # This depends on GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE. GLIBCXX_CONFIGURE_TESTSUITE diff --git a/libstdc++-v3/src/c++11/random.cc b/libstdc++-v3/src/c++11/random.cc index 3b05318..4342df4 100644 --- a/libstdc++-v3/src/c++11/random.cc +++ b/libstdc++-v3/src/c++11/random.cc @@ -50,7 +50,7 @@ namespace std _GLIBCXX_VISIBILITY(default) return __ret; } -#if defined __i386__ || defined __x86_64__ +#if (defined __i386__ || defined __x86_64__) && defined _GLIBCXX_X86_RDRAND unsigned int __attribute__ ((target("rdrnd"))) __x86_rdrand(void) @@ -75,7 +75,7 @@ namespace std _GLIBCXX_VISIBILITY(default) if (token == "default") { -#if defined __i386__ || defined __x86_64__ +#if (defined __i386__ || defined __x86_64__) && defined _GLIBCXX_X86_RDRAND unsigned int eax, ebx, ecx, edx; // Check availability of cpuid and, for now at least, also the // CPU signature for Intel's @@ -118,7 +118,7 @@ namespace std _GLIBCXX_VISIBILITY(default) random_device::result_type random_device::_M_getval() { -#if (defined __i386__ || defined __x86_64__) +#if (defined __i386__ || defined __x86_64__) && defined _GLIBCXX_X86_RDRAND if (! _M_file) return __x86_rdrand(); #endif -- 2.7.4