]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
arm: libbacktrace: Check if the compiler supports __sync atomics
authorRichard Earnshaw <rearnsha@arm.com>
Mon, 27 Jan 2025 13:52:05 +0000 (13:52 +0000)
committerRichard Earnshaw <rearnsha@arm.com>
Tue, 28 Jan 2025 13:54:02 +0000 (13:54 +0000)
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.

libbacktrace/configure
libbacktrace/configure.ac

index db491a782349698a324eb726067d5e182d1ebe6b..0ecdd3ec0a3d97d6783a553be879fdf6fb6659a4 100755 (executable)
@@ -12760,6 +12760,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
index b700bf9d4f948a7008c304fc3efe5f698856d8d6..75b3a7536f1e8788e08377b50d0116f006e30ad8 100644 (file)
@@ -199,6 +199,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