Hello everyone.

This patch adds detection whether `libgcc` is available to `configure` and 
`Makefile` of `winpthreads` library. If `libgcc` is detected, the `fakelib` 
will not be used. This is needed when building `winpthreads` with second stage 
`aarch64-w64-mingw32` GCC because otherwise there are undefined references of 
to outline atomics LSE intrinsic functions. It has been previously discussed 
with the community that this kind of solution is preferred over adding fake 
implementation of outline atomics to the `fakelib` but I am open to find and 
implement any other consensual solution.

More details on the root cause of the outline atomics issue can be found at 
https://github.com/Windows-on-ARM-Experiments/mingw-woarm64-build/issues/208

---
 mingw-w64-libraries/winpthreads/Makefile.am  |  6 +-
 mingw-w64-libraries/winpthreads/Makefile.in  | 26 ++++----
 mingw-w64-libraries/winpthreads/configure    | 69 ++++++++++++++++++++
 mingw-w64-libraries/winpthreads/configure.ac |  7 ++
 4 files changed, 94 insertions(+), 14 deletions(-)

diff --git a/mingw-w64-libraries/winpthreads/Makefile.am 
b/mingw-w64-libraries/winpthreads/Makefile.am
index 54eca7b81..bbc91f8ad 100644
--- a/mingw-w64-libraries/winpthreads/Makefile.am
+++ b/mingw-w64-libraries/winpthreads/Makefile.am
@@ -19,7 +19,9 @@ AM_CFLAGS += -nologo
 libwinpthread_la_CPPFLAGS += -D_CRT_NONSTDC_NO_WARNINGS
 else
 libwinpthread_la_CPPFLAGS += -D__USE_MINGW_ANSI_STDIO=0
-libwinpthread_la_LDFLAGS += -L$(builddir)/fakelib -Wc,-no-pthread
+if !HAVE_LIBGCC
+libwinpthread_la_LDFLAGS += -L$(builddir)/fakelib
+
 EXTRA_libwinpthread_la_DEPENDENCIES = fakelib/libgcc.a  fakelib/libgcc_eh.a  
fakelib/libgcc_s.a
 
 # Break circular dep on bootstrap
@@ -28,6 +30,8 @@ fakelib_libgcc_a_SOURCES = src/libgcc/dll_dependency.S 
src/libgcc/dll_math.c
 fakelib_libgcc_s_a_SOURCES =
 fakelib_libgcc_eh_a_SOURCES =
 endif
+libwinpthread_la_LDFLAGS += -Wc,-no-pthread
+endif
 
 lib_LIBRARIES = 
 
diff --git a/mingw-w64-libraries/winpthreads/Makefile.in 
b/mingw-w64-libraries/winpthreads/Makefile.in
index e14a95843..4a02d5258 100644
--- a/mingw-w64-libraries/winpthreads/Makefile.in
+++ b/mingw-w64-libraries/winpthreads/Makefile.in
@@ -93,9 +93,10 @@ host_triplet = @host@
 @MSVC_TRUE@am__append_1 = -nologo
 @MSVC_TRUE@am__append_2 = -D_CRT_NONSTDC_NO_WARNINGS
 @MSVC_FALSE@am__append_3 = -D__USE_MINGW_ANSI_STDIO=0
-@MSVC_FALSE@am__append_4 = -L$(builddir)/fakelib -Wc,-no-pthread
-@COPY_STATIC_TRUE@am__append_5 = libpthread.a
-@COPY_SHARED_TRUE@am__append_6 = libpthread.dll.a
+@HAVE_LIBGCC_FALSE@@MSVC_FALSE@am__append_4 = -L$(builddir)/fakelib
+@MSVC_FALSE@am__append_5 = -Wc,-no-pthread
+@COPY_STATIC_TRUE@am__append_6 = libpthread.a
+@COPY_SHARED_TRUE@am__append_7 = libpthread.dll.a
 subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
@@ -153,9 +154,8 @@ fakelib_libgcc_a_LIBADD =
 am__fakelib_libgcc_a_SOURCES_DIST = src/libgcc/dll_dependency.S \
        src/libgcc/dll_math.c
 am__dirstamp = $(am__leading_dot)dirstamp
-@MSVC_FALSE@am_fakelib_libgcc_a_OBJECTS =  \
-@MSVC_FALSE@   src/libgcc/dll_dependency.$(OBJEXT) \
-@MSVC_FALSE@   src/libgcc/dll_math.$(OBJEXT)
+@HAVE_LIBGCC_FALSE@@MSVC_FALSE@am_fakelib_libgcc_a_OBJECTS = 
src/libgcc/dll_dependency.$(OBJEXT) \
+@HAVE_LIBGCC_FALSE@@MSVC_FALSE@        src/libgcc/dll_math.$(OBJEXT)
 fakelib_libgcc_a_OBJECTS = $(am_fakelib_libgcc_a_OBJECTS)
 fakelib_libgcc_eh_a_AR = $(AR) $(ARFLAGS)
 fakelib_libgcc_eh_a_LIBADD =
@@ -485,20 +485,20 @@ include_HEADERS = include/pthread.h include/sched.h 
include/semaphore.h include/
 libwinpthread_la_CPPFLAGS = -I$(srcdir)/include -DIN_WINPTHREAD \
        -DWINPTHREAD_DBG=1 $(am__append_2) $(am__append_3)
 libwinpthread_la_LDFLAGS = -no-undefined -version-info 1:0:0 \
-       $(am__append_4)
+       $(am__append_4) $(am__append_5)
 libwinpthread_la_SOURCES = \
   src/barrier.h  src/cond.h  src/misc.h  src/mutex.h  src/rwlock.h  
src/spinlock.h  src/thread.h  src/ref.h  src/sem.h  src/wpth_ver.h \
   src/barrier.c  src/cond.c  src/misc.c  src/mutex.c  src/rwlock.c  
src/spinlock.c  src/thread.c  src/ref.c  src/sem.c  src/sched.c \
   src/winpthread_internal.h  src/clock.c src/nanosleep.c src/version.rc
 
-@MSVC_FALSE@EXTRA_libwinpthread_la_DEPENDENCIES = fakelib/libgcc.a  
fakelib/libgcc_eh.a  fakelib/libgcc_s.a
+@HAVE_LIBGCC_FALSE@@MSVC_FALSE@EXTRA_libwinpthread_la_DEPENDENCIES = 
fakelib/libgcc.a  fakelib/libgcc_eh.a  fakelib/libgcc_s.a
 
 # Break circular dep on bootstrap
-@MSVC_FALSE@noinst_LIBRARIES = fakelib/libgcc.a  fakelib/libgcc_eh.a  
fakelib/libgcc_s.a
-@MSVC_FALSE@fakelib_libgcc_a_SOURCES = src/libgcc/dll_dependency.S 
src/libgcc/dll_math.c
-@MSVC_FALSE@fakelib_libgcc_s_a_SOURCES = 
-@MSVC_FALSE@fakelib_libgcc_eh_a_SOURCES = 
-lib_LIBRARIES = $(am__append_5) $(am__append_6)
+@HAVE_LIBGCC_FALSE@@MSVC_FALSE@noinst_LIBRARIES = fakelib/libgcc.a  
fakelib/libgcc_eh.a  fakelib/libgcc_s.a
+@HAVE_LIBGCC_FALSE@@MSVC_FALSE@fakelib_libgcc_a_SOURCES = 
src/libgcc/dll_dependency.S src/libgcc/dll_math.c
+@HAVE_LIBGCC_FALSE@@MSVC_FALSE@fakelib_libgcc_s_a_SOURCES = 
+@HAVE_LIBGCC_FALSE@@MSVC_FALSE@fakelib_libgcc_eh_a_SOURCES = 
+lib_LIBRARIES = $(am__append_6) $(am__append_7)
 @COPY_STATIC_TRUE@libpthread_a_SOURCES = 
 @COPY_STATIC_TRUE@libpthread_a_DEPENDENCIES = libwinpthread.la
 #FIXME: Use cp kludge until a better method presents itself
diff --git a/mingw-w64-libraries/winpthreads/configure 
b/mingw-w64-libraries/winpthreads/configure
index 3ae664eaf..b4a76c7a4 100755
--- a/mingw-w64-libraries/winpthreads/configure
+++ b/mingw-w64-libraries/winpthreads/configure
@@ -657,6 +657,8 @@ ac_subst_vars='am__EXEEXT_FALSE
 am__EXEEXT_TRUE
 LTLIBOBJS
 LIBOBJS
+HAVE_LIBGCC_FALSE
+HAVE_LIBGCC_TRUE
 COPY_STATIC_FALSE
 COPY_STATIC_TRUE
 COPY_SHARED_FALSE
@@ -13843,6 +13845,65 @@ fi
 # FIXME: Replace `main' with a function in `-lpthread':
 #AC_CHECK_LIB([pthread], [main])
 
+# Check if libgcc is available
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -lgcc" >&5
+printf %s "checking for main in -lgcc... " >&6; }
+if test ${ac_cv_lib_gcc_main+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgcc  $LIBS"
+if test x$ac_no_link = xyes; then
+  as_fn_error $? "link tests are not allowed after AC_NO_EXECUTABLES" 
"$LINENO" 5
+fi
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+int
+main (void)
+{
+return main ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_gcc_main=yes
+else $as_nop
+  ac_cv_lib_gcc_main=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gcc_main" >&5
+printf "%s\n" "$ac_cv_lib_gcc_main" >&6; }
+if test "x$ac_cv_lib_gcc_main" = xyes
+then :
+   if true ; then
+  HAVE_LIBGCC_TRUE=
+  HAVE_LIBGCC_FALSE='#'
+else
+  HAVE_LIBGCC_TRUE='#'
+  HAVE_LIBGCC_FALSE=
+fi
+
+else $as_nop
+   if false ; then
+  HAVE_LIBGCC_TRUE=
+  HAVE_LIBGCC_FALSE='#'
+else
+  HAVE_LIBGCC_TRUE='#'
+  HAVE_LIBGCC_FALSE=
+fi
+
+
+fi
+
+
 # Checks for header files.
 ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" 
"$ac_includes_default"
 if test "x$ac_cv_header_limits_h" = xyes
@@ -14077,6 +14138,14 @@ if test -z "${COPY_STATIC_TRUE}" && test -z 
"${COPY_STATIC_FALSE}"; then
   as_fn_error $? "conditional \"COPY_STATIC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${HAVE_LIBGCC_TRUE}" && test -z "${HAVE_LIBGCC_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_LIBGCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_LIBGCC_TRUE}" && test -z "${HAVE_LIBGCC_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_LIBGCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 
 : "${CONFIG_STATUS=./config.status}"
 ac_write_fail=0
diff --git a/mingw-w64-libraries/winpthreads/configure.ac 
b/mingw-w64-libraries/winpthreads/configure.ac
index 47be2d6cc..f80eb1094 100644
--- a/mingw-w64-libraries/winpthreads/configure.ac
+++ b/mingw-w64-libraries/winpthreads/configure.ac
@@ -45,6 +45,13 @@ AM_CONDITIONAL( [COPY_STATIC], 
[AS_VAR_TEST_SET([copy_static])] )
 # FIXME: Replace `main' with a function in `-lpthread':
 #AC_CHECK_LIB([pthread], [main])
 
+# Check if libgcc is available
+AC_CHECK_LIB(
+  [gcc], [main],
+  [AM_CONDITIONAL( [HAVE_LIBGCC], [true] )],
+  [AM_CONDITIONAL( [HAVE_LIBGCC], [false] )]
+)
+
 # Checks for header files.
 AC_CHECK_HEADERS([limits.h sys/timeb.h])
 
-- 
2.34.1


_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to