libphobos: Fix compilation dependencies on s390x-linux-musl
authorIain Buclaw <ibuclaw@gdcproject.org>
Mon, 20 Apr 2020 16:20:12 +0000 (18:20 +0200)
committerIain Buclaw <ibuclaw@gdcproject.org>
Tue, 21 Apr 2020 12:19:13 +0000 (14:19 +0200)
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>
libphobos/ChangeLog
libphobos/configure
libphobos/configure.ac
libphobos/libdruntime/gcc/sections/elf_shared.d
libphobos/m4/druntime/libraries.m4

index 959817eb760c6ada4be416dc88665744eb640536..3b89f9b00d90deabeec25b3700d454291d55ce58 100644 (file)
@@ -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.
index 06b5d0047c5f7e50dd35e036596a5f2d38d4ce29..2658cc1728afa3a779e449221fcca487598e6616 100755 (executable)
@@ -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'
index 805e168881f95f71634f449e1ff7201e2722d00a..9de36c84be712fe7e39b4de799845516f27b895c 100644 (file)
@@ -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
 
index 7ff87a8cec77f7377f78f939956b624daa98a910..59e2dd60a1feddfdc67a73d2023fa7fc5a504b87 100644 (file)
@@ -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.
index 9e8e210df5a6ef1906441c006d944a6771e12276..957bf98b442f6df5325418da041ade762d7be027 100644 (file)
@@ -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
+])