https://gcc.gnu.org/g:66a41a0a9626a9b2f8de3cdb6ba82561b50cd9e8
commit r15-9182-g66a41a0a9626a9b2f8de3cdb6ba82561b50cd9e8 Author: Iain Sandoe <i...@sandoe.co.uk> Date: Sun Mar 16 09:32:12 2025 +0000 libgcobol: Only use random_r if it is available [PR119295] We do not have a replacement at the moment, so fall back to using regular random and friends. PR cobol/119295 libgcobol/ChangeLog: * config.h.in: Regenerate. * configure: Regenerate. * configure.ac: Configure random_r and friends * intrinsic.cc (__gg__random): Use random_r when available. (__gg__random_next): Likewise. Signed-off-by: Iain Sandoe <i...@sandoe.co.uk> Diff: --- libgcobol/config.h.in | 12 ++++++++++++ libgcobol/configure | 35 +++++++++++++++++++++++++++++++++-- libgcobol/configure.ac | 3 +++ libgcobol/intrinsic.cc | 27 ++++++++++++++++++++++----- 4 files changed, 70 insertions(+), 7 deletions(-) diff --git a/libgcobol/config.h.in b/libgcobol/config.h.in index a7e5675c43c8..b201266e0610 100644 --- a/libgcobol/config.h.in +++ b/libgcobol/config.h.in @@ -9,6 +9,9 @@ /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV +/* Define to 1 if you have the `initstate_r' function. */ +#undef HAVE_INITSTATE_R + /* Define to 1 if you have the <inttypes.h> header file. */ #undef HAVE_INTTYPES_H @@ -18,6 +21,15 @@ /* Define to 1 if you have the <memory.h> header file. */ #undef HAVE_MEMORY_H +/* Define to 1 if you have the `random_r' function. */ +#undef HAVE_RANDOM_R + +/* Define to 1 if you have the `setstate_r' function. */ +#undef HAVE_SETSTATE_R + +/* Define to 1 if you have the `srandom_r' function. */ +#undef HAVE_SRANDOM_R + /* Define to 1 if you have the <stdint.h> header file. */ #undef HAVE_STDINT_H diff --git a/libgcobol/configure b/libgcobol/configure index 1db4e792e030..44190d7e2fe0 100755 --- a/libgcobol/configure +++ b/libgcobol/configure @@ -629,6 +629,7 @@ ac_includes_default="\ # include <unistd.h> #endif" +ac_func_list= ac_unique_file="Makefile.am" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE @@ -2515,6 +2516,10 @@ $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi +as_fn_append ac_func_list " random_r" +as_fn_append ac_func_list " srandom_r" +as_fn_append ac_func_list " initstate_r" +as_fn_append ac_func_list " setstate_r" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false @@ -12901,7 +12906,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 12904 "configure" +#line 12909 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -13007,7 +13012,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 13010 "configure" +#line 13015 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -16354,6 +16359,32 @@ fi +# These are GLIBC + + + + for ac_func in $ac_func_list +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + + + + + + + + if test "${multilib}" = "yes"; then multilib_arg="--enable-multilib" else diff --git a/libgcobol/configure.ac b/libgcobol/configure.ac index e27621d03680..383b4134b130 100644 --- a/libgcobol/configure.ac +++ b/libgcobol/configure.ac @@ -215,6 +215,9 @@ AM_CONDITIONAL([ENABLE_DARWIN_AT_RPATH], [test x$enable_darwin_at_rpath = xyes]) AC_SUBST(enable_shared) AC_SUBST(enable_static) +# These are GLIBC +AC_CHECK_FUNCS_ONCE(random_r srandom_r initstate_r setstate_r) + if test "${multilib}" = "yes"; then multilib_arg="--enable-multilib" else diff --git a/libgcobol/intrinsic.cc b/libgcobol/intrinsic.cc index 16bf84be620b..4bce481b0c04 100644 --- a/libgcobol/intrinsic.cc +++ b/libgcobol/intrinsic.cc @@ -44,6 +44,8 @@ #include <langinfo.h> #include <string.h> +#include "config.h" + #include "ec.h" #include "common-defs.h" #include "io.h" @@ -3409,9 +3411,13 @@ __gg__trim( cblc_field_t *dest, } } +#if HAVE_INITSTATE_R && HAVE_SRANDOM_R && HAVE_RANDOM_R static struct random_data *buf = NULL; static char *state = NULL; static const size_t state_len = 256; +#else +static unsigned seed = 0; +#endif extern "C" void @@ -3420,6 +3426,9 @@ __gg__random( cblc_field_t *dest, size_t input_offset, size_t input_size) { + int32_t retval_31; + int rdigits; +#if HAVE_INITSTATE_R && HAVE_SRANDOM_R && HAVE_RANDOM_R // This creates a thread-safe pseudo-random number generator // using input as the seed @@ -3436,16 +3445,21 @@ __gg__random( cblc_field_t *dest, __gg__clock_gettime(CLOCK_REALTIME, &ts); initstate_r( ts.tv_nsec, state, state_len, buf); } - - int rdigits; int seed = (int)__gg__binary_value_from_qualified_field(&rdigits, input, input_offset, input_size); srandom_r(seed, buf); - int32_t retval_31; random_r(buf, &retval_31); +#else + seed = (unsigned)__gg__binary_value_from_qualified_field(&rdigits, + input, + input_offset, + input_size); + srandom (seed); + retval_31 = random (); +#endif // We are going to convert this to a value between zero and not quite one: double retval = double(retval_31) / double(0x80000000UL); __gg__double_to_target( dest, @@ -3457,6 +3471,8 @@ extern "C" void __gg__random_next(cblc_field_t *dest) { + int32_t retval_31; +#if HAVE_INITSTATE_R && HAVE_SRANDOM_R && HAVE_RANDOM_R // The return value is between zero and not quite one if( !buf ) @@ -3469,9 +3485,10 @@ __gg__random_next(cblc_field_t *dest) __gg__clock_gettime(CLOCK_REALTIME, &ts); initstate_r( ts.tv_nsec, state, state_len, buf); } - int32_t retval_31; random_r(buf, &retval_31); - +#else + retval_31 = random (); +#endif // We are going to convert this to a value between zero and not quite one: double retval = double(retval_31) / double(0x80000000UL); __gg__double_to_target( dest,