summaryrefslogtreecommitdiff
path: root/libphobos
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2020-04-20 18:20:12 +0200
committerIain Buclaw <ibuclaw@gdcproject.org>2020-04-21 14:19:13 +0200
commitac1a0a388cd9529b4ba8b10d8ccd8099a2a95b23 (patch)
treef99abc45fa3539cbc1ff479320b4de061f1a781d /libphobos
parent187bdbd5645ff5271bee436e0c854a11b69e9570 (diff)
libphobos: Fix compilation dependencies on s390x-linux-musl
libphobos/ChangeLog: * configure: Regenerate. * configure.ac: Call DRUNTIME_LIBRARIES_UCONTEXT. * m4/druntime/libraries.m4 (DRUNTIME_LIBRARIES_UCONTEXT): Define to search libraries for swapcontext. * libdruntime/gcc/sections/elf_shared.d (getTLSRange): Always use __tls_get_addr on Musl. Co-Authored-By: Mathias Lang <pro.mathias.lang@gmail.com>
Diffstat (limited to 'libphobos')
-rw-r--r--libphobos/ChangeLog10
-rwxr-xr-xlibphobos/configure73
-rw-r--r--libphobos/configure.ac1
-rw-r--r--libphobos/libdruntime/gcc/sections/elf_shared.d4
-rw-r--r--libphobos/m4/druntime/libraries.m424
5 files changed, 111 insertions, 1 deletions
diff --git a/libphobos/ChangeLog b/libphobos/ChangeLog
index 959817eb760..3b89f9b00d9 100644
--- a/libphobos/ChangeLog
+++ b/libphobos/ChangeLog
@@ -1,3 +1,13 @@
+2020-04-21 Mathias Lang <pro.mathias.lang@gmail.com>
+ Iain Buclaw <ibuclaw@gdcproject.org>
+
+ * configure: Regenerate.
+ * configure.ac: Call DRUNTIME_LIBRARIES_UCONTEXT.
+ * m4/druntime/libraries.m4 (DRUNTIME_LIBRARIES_UCONTEXT): Define to
+ search libraries for swapcontext.
+ * libdruntime/gcc/sections/elf_shared.d (getTLSRange): Always use
+ __tls_get_addr on Musl.
+
2020-04-20 Iain Buclaw <ibuclaw@gdcproject.org>
* configure: Regenerate.
diff --git a/libphobos/configure b/libphobos/configure
index 06b5d0047c5..2658cc1728a 100755
--- a/libphobos/configure
+++ b/libphobos/configure
@@ -15047,6 +15047,79 @@ $as_echo "$druntime_cv_lib_sockets" >&6; }
LIBS="$LIBS $druntime_cv_lib_sockets"
+ # Keep this in sync with core/thread.d, set druntime_fiber_asm_external to
+ # "yes" for targets that have 'version = AsmExternal'.
+ druntime_fiber_asm_external=no
+ case "$target_cpu" in
+ aarch64* | \
+ arm* | \
+ i[34567]86|x86_64 | \
+ powerpc)
+ druntime_fiber_asm_external=yes
+ ;;
+ esac
+ if test "$druntime_fiber_asm_external" = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing swapcontext" >&5
+$as_echo_n "checking for library containing swapcontext... " >&6; }
+if ${ac_cv_search_swapcontext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char swapcontext ();
+int
+main ()
+{
+return swapcontext ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' c ucontext; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_swapcontext=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_swapcontext+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_swapcontext+:} false; then :
+
+else
+ ac_cv_search_swapcontext=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_swapcontext" >&5
+$as_echo "$ac_cv_search_swapcontext" >&6; }
+ac_res=$ac_cv_search_swapcontext
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+else
+ as_fn_error $? "swapcontext required but not found" "$LINENO" 5
+fi
+
+ fi
+
+
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
diff --git a/libphobos/configure.ac b/libphobos/configure.ac
index 805e168881f..9de36c84be7 100644
--- a/libphobos/configure.ac
+++ b/libphobos/configure.ac
@@ -143,6 +143,7 @@ DRUNTIME_LIBRARIES_ATOMIC
DRUNTIME_LIBRARIES_BACKTRACE
DRUNTIME_LIBRARIES_DLOPEN
DRUNTIME_LIBRARIES_NET
+DRUNTIME_LIBRARIES_UCONTEXT
DRUNTIME_LIBRARIES_ZLIB
DRUNTIME_INSTALL_DIRECTORIES
diff --git a/libphobos/libdruntime/gcc/sections/elf_shared.d b/libphobos/libdruntime/gcc/sections/elf_shared.d
index 7ff87a8cec7..59e2dd60a1f 100644
--- a/libphobos/libdruntime/gcc/sections/elf_shared.d
+++ b/libphobos/libdruntime/gcc/sections/elf_shared.d
@@ -1084,7 +1084,9 @@ void[] getTLSRange(size_t mod, size_t sz) nothrow @nogc
// base offset
auto ti = tls_index(mod, 0);
- version (IBMZ_Any)
+ version (CRuntime_Musl)
+ return (__tls_get_addr(&ti)-TLS_DTV_OFFSET)[0 .. sz];
+ else version (IBMZ_Any)
{
// IBM Z only provides __tls_get_offset instead of __tls_get_addr
// which returns an offset relative to the thread pointer.
diff --git a/libphobos/m4/druntime/libraries.m4 b/libphobos/m4/druntime/libraries.m4
index 9e8e210df5a..957bf98b442 100644
--- a/libphobos/m4/druntime/libraries.m4
+++ b/libphobos/m4/druntime/libraries.m4
@@ -212,3 +212,27 @@ AC_DEFUN([DRUNTIME_LIBRARIES_CLIB],
AC_SUBST(DCFG_HAVE_QSORT_R)
AC_LANG_POP([C])
])
+
+# DRUNTIME_LIBRARIES_UCONTEXT
+# ------------------------------
+# Autodetect and add ucontext library to LIBS if necessary.
+# This is only required if fiber_switchContext does not have
+# its own internal asm implementation.
+AC_DEFUN([DRUNTIME_LIBRARIES_UCONTEXT],
+[
+ # Keep this in sync with core/thread.d, set druntime_fiber_asm_external to
+ # "yes" for targets that have 'version = AsmExternal'.
+ druntime_fiber_asm_external=no
+ case "$target_cpu" in
+ aarch64* | \
+ arm* | \
+ i[[34567]]86|x86_64 | \
+ powerpc)
+ druntime_fiber_asm_external=yes
+ ;;
+ esac
+ if test "$druntime_fiber_asm_external" = no; then
+ AC_SEARCH_LIBS([swapcontext], [c ucontext], [],
+ AC_MSG_ERROR([swapcontext required but not found]))
+ fi
+])