You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/net-dns/bind-tools/files/sparc-pause-instruction.patch

136 lines
4.0 KiB

From a5ad6b16c5c0bfd333758d707a6397be79a92914 Mon Sep 17 00:00:00 2001
From: Sergei Trofimovich <slyfox@gentoo.org>
Date: Thu, 8 Aug 2019 08:33:10 +0100
Subject: [PATCH] configure.ac: autodetect 'pause' instruction presence on
sparc
The change fixes the following build failure on sparc T3 and older CPUs:
```
sparc-unknown-linux-gnu-gcc ... -O2 -mcpu=niagara2 ... -c rwlock.c
{standard input}: Assembler messages:
{standard input}:398: Error: Architecture mismatch on "pause ".
{standard input}:398: (Requires v9e|v9v|v9m|m8; requested architecture is v9b.)
make[1]: *** [Makefile:280: rwlock.o] Error 1
```
`pause` insutruction exists only on `-mcpu=niagara4` (`T4`) and upper.
The change adds `pause` configure-time autodetection and uses it if available.
config.h.in got new `HAVE_SPARC_PAUSE` knob. Fallback is a fall-through no-op.
Build-tested on:
- sparc-unknown-linux-gnu-gcc (no `pause`, build succeeds)
- sparc-unknown-linux-gnu-gcc -mcpu=niagara4 (`pause`, build succeeds)
Reported-by: Rolf Eike Beer
Bug: https://bugs.gentoo.org/691708
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
---
config.h.in | 3 +++
configure | 33 +++++++++++++++++++++++++++++++++
configure.ac | 14 ++++++++++++++
lib/isc/rwlock.c | 2 +-
4 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/config.h.in b/config.h.in
index 91508e5d91..eeba105ec6 100644
--- a/config.h.in
+++ b/config.h.in
@@ -357,6 +357,9 @@
/* Define to 1 if you have the `setresuid' function. */
#undef HAVE_SETRESUID
+/* define if the SPARC pause instruction is available */
+#undef HAVE_SPARC_PAUSE
+
/* define if struct stat has st_mtim.tv_nsec field */
#undef HAVE_STAT_NSEC
diff --git a/configure b/configure
index d336f6aa24..757dacb06e 100755
--- a/configure
+++ b/configure
@@ -13872,6 +13872,39 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; #(
;;
esac
+#
+# Check for pause support on SPARC processors
+#
+case $host in #(
+ sparc*) :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pause instruction support" >&5
+$as_echo_n "checking for pause instruction support... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+__asm__ __volatile__ ("pause")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_SPARC_PAUSE 1" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; #(
+ *) :
+ ;;
+esac
+
for ac_func in sysctlbyname
do :
ac_fn_c_check_func "$LINENO" "sysctlbyname" "ac_cv_func_sysctlbyname"
diff --git a/configure.ac b/configure.ac
index 90aafae8d0..b04c651966 100644
--- a/configure.ac
+++ b/configure.ac
@@ -415,6 +415,20 @@ AS_CASE([$host],
[define if the ARM yield instruction is available])],
[AC_MSG_RESULT([no])])])
+#
+# Check for pause support on SPARC processors
+#
+AS_CASE([$host],
+ [sparc*],
+ [AC_MSG_CHECKING([for pause instruction support])
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[]],
+ [[__asm__ __volatile__ ("pause")]])],
+ [AC_MSG_RESULT([yes])
+ AC_DEFINE([HAVE_SPARC_PAUSE], [1],
+ [define if the SPARC pause instruction is available])],
+ [AC_MSG_RESULT([no])])])
+
AC_CHECK_FUNCS([sysctlbyname])
#
diff --git a/lib/isc/rwlock.c b/lib/isc/rwlock.c
index a6ea35feed..e313a912e0 100644
--- a/lib/isc/rwlock.c
+++ b/lib/isc/rwlock.c
@@ -152,7 +152,7 @@ isc_rwlock_destroy(isc_rwlock_t *rwl) {
# define isc_rwlock_pause() __asm__ __volatile__ ("yield")
#elif defined(sun) && (defined(__sparc) || defined(__sparc__))
# define isc_rwlock_pause() smt_pause()
-#elif defined(__sparc) || defined(__sparc__)
+#elif (defined(__sparc) || defined(__sparc__)) && HAVE_SPARC_PAUSE
# define isc_rwlock_pause() __asm__ __volatile__ ("pause")
#elif defined(__ppc__) || defined(_ARCH_PPC) || \
defined(_ARCH_PWR) || defined(_ARCH_PWR2) || defined(_POWER)
--
2.21.0