summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2021-02-09 23:13:24 -0500
committerBen Gamari <ben@smart-cactus.org>2021-02-09 23:17:35 -0500
commitb5c4820e813aaedb490a9de212c4da8ceb94e2e1 (patch)
tree46b5a74dc7aabab9f4996477513298d9ca7508e8
parent17a89b1bdc2a30116c0efba71d93314b85358c6a (diff)
downloadhaskell-wip/T19119.tar.gz
Check for libatomic dependency for atomic operationswip/T19119
Some platforms (e.g. RISC-V) require linking against libatomic for some (e.g. sub-word-sized) atomic operations. Fixes #19119.
-rw-r--r--configure.ac21
-rw-r--r--rts/rts.cabal.in5
2 files changed, 26 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index d69ff312b8..67c645a3d0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1211,6 +1211,27 @@ AC_CHECK_FUNC(pthread_create,
AC_DEFINE_UNQUOTED([NEED_PTHREAD_LIB], [$need_lpthread],
[Define 1 if we need to link code using pthreads with -lpthread])
+AC_MSG_CHECKING(whether -latomic is needed for sub-word-sized atomic operations)
+AC_CHECK_FUNC(atomic_fetch_or,
+ [
+ AC_MSG_RESULT(no)
+ AC_SUBST([CabalNeedAtomic],[False])
+ need_latomic=0
+ ],
+ [
+ AC_CHECK_LIB(atomic, atomic_fetch_or,
+ [
+ AC_MSG_RESULT(yes)
+ AC_SUBST([CabalNeedAtomic],[True])
+ need_latomic=1
+ ],
+ [
+ AC_SUBST([CabalNeedAtomic],[False])
+ AC_MSG_ERROR([sub-word-sized atomic operations not available.])
+ need_latomic=0
+ ])
+ ])
+
dnl ** pthread_setname_np is a recent addition to glibc, and OS X has
dnl a different single-argument version.
AC_CHECK_LIB(pthread, pthread_setname_np)
diff --git a/rts/rts.cabal.in b/rts/rts.cabal.in
index ed727111ca..b41e3538b0 100644
--- a/rts/rts.cabal.in
+++ b/rts/rts.cabal.in
@@ -18,6 +18,8 @@ flag libbfd
default: @CabalHaveLibbfd@
flag mingwex
default: @CabalMingwex@
+flag need-atomic
+ default: @CabalNeedLibatomic@
flag libdw
default: @CabalHaveLibdw@
flag libnuma
@@ -120,6 +122,9 @@ library
if flag(need-pthread)
-- for pthread_getthreadid_np, pthread_create, ...
extra-libraries: pthread
+ if flag(need-libatomic)
+ -- for sub-word-sized atomic operations (#19119)
+ extra-libraries: atomic
if flag(libbfd)
-- for debugging
extra-libraries: bfd iberty