diff --git a/autoconf/configure.ac b/autoconf/configure.ac index 0368f805852..bffee5fad26 100644 --- a/autoconf/configure.ac +++ b/autoconf/configure.ac @@ -1757,13 +1757,16 @@ AC_CHECK_FUNCS([log log2 log10 exp exp2]) AC_CHECK_FUNCS([getpagesize getrusage getrlimit setrlimit gettimeofday ]) AC_CHECK_FUNCS([isatty mkdtemp mkstemp ]) AC_CHECK_FUNCS([mktemp posix_spawn pread realpath sbrk setrlimit ]) -AC_CHECK_FUNCS([strerror strerror_r setenv arc4random ]) +AC_CHECK_FUNCS([strerror strerror_r setenv ]) AC_CHECK_FUNCS([strtoll strtoq sysconf malloc_zone_statistics ]) AC_CHECK_FUNCS([setjmp longjmp sigsetjmp siglongjmp writev]) AC_CHECK_FUNCS([futimes futimens]) AC_C_PRINTF_A AC_FUNC_RAND48 +dnl Check for arc4random accessible via AC_INCLUDES_DEFAULT. +AC_CHECK_DECLS([arc4random]) + dnl Check the declaration "Secure API" on Windows environments. AC_CHECK_DECLS([strerror_s]) diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake index c58e5bd97b0..93aeae10032 100755 --- a/cmake/config-ix.cmake +++ b/cmake/config-ix.cmake @@ -117,7 +117,7 @@ if( NOT PURE_WINDOWS ) endif() # function checks -check_symbol_exists(arc4random "stdlib.h" HAVE_ARC4RANDOM) +check_symbol_exists(arc4random "stdlib.h" HAVE_DECL_ARC4RANDOM) check_symbol_exists(backtrace "execinfo.h" HAVE_BACKTRACE) check_symbol_exists(getpagesize unistd.h HAVE_GETPAGESIZE) check_symbol_exists(getrusage sys/resource.h HAVE_GETRUSAGE) diff --git a/configure b/configure index 76440ed1499..2166b691a59 100755 --- a/configure +++ b/configure @@ -18527,8 +18527,7 @@ done - -for ac_func in strerror strerror_r setenv arc4random +for ac_func in strerror strerror_r setenv do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 @@ -19161,6 +19160,93 @@ _ACEOF fi +{ echo "$as_me:$LINENO: checking whether arc4random is declared" >&5 +echo $ECHO_N "checking whether arc4random is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_arc4random+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef arc4random + char *p = (char *) arc4random; + return !p; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_arc4random=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_arc4random=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_arc4random" >&5 +echo "${ECHO_T}$ac_cv_have_decl_arc4random" >&6; } +if test $ac_cv_have_decl_arc4random = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ARC4RANDOM 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ARC4RANDOM 0 +_ACEOF + + +fi + + + { echo "$as_me:$LINENO: checking whether strerror_s is declared" >&5 echo $ECHO_N "checking whether strerror_s is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_strerror_s+set}" = set; then diff --git a/include/llvm/Config/config.h.in b/include/llvm/Config/config.h.in index da5b6c9f648..856569656ba 100644 --- a/include/llvm/Config/config.h.in +++ b/include/llvm/Config/config.h.in @@ -33,9 +33,6 @@ /* Directory where gcc is installed. */ #undef GCC_INSTALL_PREFIX -/* Define to 1 if you have the `arc4random' function. */ -#undef HAVE_ARC4RANDOM - /* Define to 1 if you have the `argz_append' function. */ #undef HAVE_ARGZ_APPEND @@ -75,6 +72,10 @@ /* Define to 1 if you have the header file. */ #undef HAVE_CXXABI_H +/* Define to 1 if you have the declaration of `arc4random', and to 0 if you + don't. */ +#undef HAVE_DECL_ARC4RANDOM + /* Define to 1 if you have the declaration of `FE_ALL_EXCEPT', and to 0 if you don't. */ #undef HAVE_DECL_FE_ALL_EXCEPT diff --git a/lib/Support/Unix/Process.inc b/lib/Support/Unix/Process.inc index c5778e746b7..1fc7c969e0c 100644 --- a/lib/Support/Unix/Process.inc +++ b/lib/Support/Unix/Process.inc @@ -343,7 +343,7 @@ const char *Process::ResetColor() { return "\033[0m"; } -#if !defined(HAVE_ARC4RANDOM) +#if !defined(HAVE_DECL_ARC4RANDOM) || !HAVE_DECL_ARC4RANDOM static unsigned GetRandomNumberSeed() { // Attempt to get the initial seed from /dev/urandom, if possible. if (FILE *RandomSource = ::fopen("/dev/urandom", "r")) { @@ -364,7 +364,7 @@ static unsigned GetRandomNumberSeed() { #endif unsigned llvm::sys::Process::GetRandomNumber() { -#if defined(HAVE_ARC4RANDOM) +#if defined(HAVE_DECL_ARC4RANDOM) && HAVE_DECL_ARC4RANDOM return arc4random(); #else static int x = (::srand(GetRandomNumberSeed()), 0);