From 5da31b995224ef8b2f85d0b3294cafa2826390e0 Mon Sep 17 00:00:00 2001 From: Richard Earnshaw Date: Mon, 27 Jan 2025 13:52:05 +0000 Subject: [PATCH] arm: libbacktrace: Check if the compiler supports __sync atomics Older versions of the Arm architecture lack support for __sync operations directly in hardware and require calls into appropriate operating-system hooks. But such hooks obviously don't exist in a freestanding environment. Consquently, it is incorrect to assume during configure that such functions will exist and we need a configure-time check to determine whether or not these routines will work. libbacktrace: * configure.ac: Always check if the compiler supports __sync operations. * configure: Regenerated. --- configure | 23 +++++++++++++++++++++++ configure.ac | 10 ++++++++++ 2 files changed, 33 insertions(+) diff --git a/configure b/configure index 738ce1a..ad1f3a9 100755 --- a/configure +++ b/configure @@ -12209,6 +12209,29 @@ else if test -n "${with_target_subdir}"; then case "${host}" in hppa*-*-hpux*) libbacktrace_cv_sys_sync=no ;; + arm*-*-eabi*) + # Older versions of the Arm architecture lack the necessary instructions + # for these constructs, so check whether we can use them. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int i; +int +main () +{ +__sync_bool_compare_and_swap (&i, i, i); + __sync_lock_test_and_set (&i, 1); + __sync_lock_release (&i); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + libbacktrace_cv_sys_sync=yes +else + libbacktrace_cv_sys_sync=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext;; *) libbacktrace_cv_sys_sync=yes ;; esac else diff --git a/configure.ac b/configure.ac index 3c0b9bd..df23b3d 100644 --- a/configure.ac +++ b/configure.ac @@ -189,6 +189,16 @@ AC_CACHE_CHECK([__sync extensions], [if test -n "${with_target_subdir}"; then case "${host}" in hppa*-*-hpux*) libbacktrace_cv_sys_sync=no ;; + arm*-*-eabi*) + # Older versions of the Arm architecture lack the necessary instructions + # for these constructs, so check whether we can use them. + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([int i;], + [__sync_bool_compare_and_swap (&i, i, i); + __sync_lock_test_and_set (&i, 1); + __sync_lock_release (&i);])], + [libbacktrace_cv_sys_sync=yes], + [libbacktrace_cv_sys_sync=no]);; *) libbacktrace_cv_sys_sync=yes ;; esac else