Attached are revised patches. These are exported from trunk.
There is a change since my last message: * A new Makefile variable `SHLIB_MCFGTHREAD_LIBS` has been introduced, to keep the other thread models from being affected. After applying these patches, configure scripts in these subdirectories need to be regenerated: * gcc * libgcc * libatomic * libstdc++-v3 The patch for libgfortran fixes * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105764I have successfully bootstrapped GCC 12 with these patches, on i686-w64-mingw32 (with MSVCRT) and x86_64-w64-mingw32 (with MSVCRT and UCRT). No errors have been observed so far.
Once these patches land in GCC, we can start the work in mingw-w64 basing on `__USING_MCFGTHREAD__`. -- Best regards, LIU Hao
From e1ab15fc95ac8180156feed410cacb64a41a9567 Mon Sep 17 00:00:00 2001 From: LIU Hao <lh_mo...@126.com> Date: Fri, 27 May 2022 23:12:48 +0800 Subject: [PATCH 1/3] libgfortran: Use `__gthread_t` instead of `pthread_t` It used to cause errors if a thread model other than `posix` was selected, which looks like a leftover from a79878585a1c5e32bafbc6d1e73f91fd6e4293bf. libgfortran/ChangeLog: * io/async.h (struct async_unit): Use `__gthread_t` instead of `pthread_t`. --- libgfortran/io/async.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libgfortran/io/async.h b/libgfortran/io/async.h index efd542a45e82..d57722a95e44 100644 --- a/libgfortran/io/async.h +++ b/libgfortran/io/async.h @@ -351,7 +351,7 @@ typedef struct async_unit struct adv_cond work; struct adv_cond emptysignal; struct st_parameter_dt *pdt; - pthread_t thread; + __gthread_t thread; struct transfer_queue *head; struct transfer_queue *tail; -- 2.37.3
From 0376949aae74b92a7ba327881672e038c3c0d825 Mon Sep 17 00:00:00 2001 From: LIU Hao <lh_mo...@126.com> Date: Sun, 2 Oct 2022 00:57:08 +0800 Subject: [PATCH 2/3] libstdc++/thread: Implement `_GLIBCXX_NPROCS` for Windows This makes `std::thread::hardware_concurrency()` return the number of logical processors, instead of zero. libstdc++-v3/ChangeLog: * src/c++11/thread.cc (get_nprocs): Add new implementation for native Windows targets --- libstdc++-v3/src/c++11/thread.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc index 707a4ad415b9..b39d9f4a9e29 100644 --- a/libstdc++-v3/src/c++11/thread.cc +++ b/libstdc++-v3/src/c++11/thread.cc @@ -68,6 +68,15 @@ static inline int get_nprocs() #elif defined(_GLIBCXX_USE_SC_NPROC_ONLN) # include <unistd.h> # define _GLIBCXX_NPROCS sysconf(_SC_NPROC_ONLN) +#elif defined(_WIN32) +# include <windows.h> +static inline int get_nprocs() +{ + SYSTEM_INFO sysinfo; + GetSystemInfo(&sysinfo); + return (int)sysinfo.dwNumberOfProcessors; +} +# define _GLIBCXX_NPROCS get_nprocs() #else # define _GLIBCXX_NPROCS 0 #endif -- 2.37.3
From d69cbaca07cd7b0e2d725574c8d5913b1c5e0bd5 Mon Sep 17 00:00:00 2001 From: LIU Hao <lh_mo...@126.com> Date: Sat, 16 Apr 2022 00:46:23 +0800 Subject: [PATCH 3/3] gcc: Add 'mcf' thread model support from mcfgthread This patch adds the new thread model `mcf`, which implements mutexes and condition variables with the mcfgthread library. Source code for mcfgthread is available at <https://github.com/lhmouse/mcfgthread>. config/ChangeLog: * gthr.m4 (GCC_AC_THREAD_HEADER): Add new case for `mcf` thread model gcc/config/ChangeLog: * i386/mingw-mcfgthread.h: New file * i386/mingw32.h: Add builtin macro and default libraries for mcfgthread when thread model is `mcf` gcc/ChangeLog: * config.gcc: Include 'i386/mingw-mcfgthread.h' when thread model is `mcf` * configure.ac: Recognize `mcf` as a valid thread model libatomic/ChangeLog: * configure.tgt: Add new case for `mcf` thread model libgcc/ChangeLog: * config.host: Add new cases for `mcf` thread model * config/i386/gthr-mcf.h: New file * config/i386/t-mingw-mcfgthread: New file * config/i386/t-slibgcc-cygming: Add mcfgthread for libgcc DLL libstdc++-v3/ChangeLog: * libsupc++/atexit_thread.cc (__cxa_thread_atexit): Use implementation from mcfgthread if available * libsupc++/guard.cc (__cxa_guard_acquire, __cxa_guard_release, __cxa_guard_abort): Use implementations from mcfgthread if available --- config/gthr.m4 | 1 + gcc/config.gcc | 3 +++ gcc/config/i386/mingw-mcfgthread.h | 1 + gcc/config/i386/mingw32.h | 11 ++++++++- gcc/configure.ac | 2 +- libatomic/configure.tgt | 2 +- libgcc/config.host | 6 +++++ libgcc/config/i386/gthr-mcf.h | 1 + libgcc/config/i386/t-mingw-mcfgthread | 1 + libgcc/config/i386/t-slibgcc-cygming | 6 ++++- libstdc++-v3/libsupc++/atexit_thread.cc | 20 ++++++++++++++++ libstdc++-v3/libsupc++/guard.cc | 31 +++++++++++++++++++++++++ 12 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 gcc/config/i386/mingw-mcfgthread.h create mode 100644 libgcc/config/i386/gthr-mcf.h create mode 100644 libgcc/config/i386/t-mingw-mcfgthread diff --git a/config/gthr.m4 b/config/gthr.m4 index 4b937306ad08..11996247f150 100644 --- a/config/gthr.m4 +++ b/config/gthr.m4 @@ -22,6 +22,7 @@ case $1 in tpf) thread_header=config/s390/gthr-tpf.h ;; vxworks) thread_header=config/gthr-vxworks.h ;; win32) thread_header=config/i386/gthr-win32.h ;; + mcf) thread_header=config/i386/gthr-mcf.h ;; esac AC_SUBST(thread_header) ]) diff --git a/gcc/config.gcc b/gcc/config.gcc index 35dfc00fe4d9..d82396f50309 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -2090,6 +2090,9 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) if test x$enable_threads = xposix ; then tm_file="${tm_file} i386/mingw-pthread.h" fi + if test x$enable_threads = xmcf ; then + tm_file="${tm_file} i386/mingw-mcfgthread.h" + fi tm_file="${tm_file} i386/mingw32.h" # This makes the logic if mingw's or the w64 feature set has to be used case ${target} in diff --git a/gcc/config/i386/mingw-mcfgthread.h b/gcc/config/i386/mingw-mcfgthread.h new file mode 100644 index 000000000000..ec381a7798f1 --- /dev/null +++ b/gcc/config/i386/mingw-mcfgthread.h @@ -0,0 +1 @@ +#define TARGET_USE_MCFGTHREAD 1 diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h index d3ca0cd0279d..307a803b92c2 100644 --- a/gcc/config/i386/mingw32.h +++ b/gcc/config/i386/mingw32.h @@ -32,6 +32,14 @@ along with GCC; see the file COPYING3. If not see | MASK_STACK_PROBE | MASK_ALIGN_DOUBLE \ | MASK_MS_BITFIELD_LAYOUT) +#ifndef TARGET_USE_MCFGTHREAD +#define CPP_MCFGTHREAD() ((void)0) +#define LIB_MCFGTHREAD "" +#else +#define CPP_MCFGTHREAD() (builtin_define("__USING_MCFGTHREAD__")) +#define LIB_MCFGTHREAD " -lmcfgthread " +#endif + /* See i386/crtdll.h for an alternative definition. _INTEGRAL_MAX_BITS is for compatibility with native compiler. */ #define EXTRA_OS_CPP_BUILTINS() \ @@ -50,6 +58,7 @@ along with GCC; see the file COPYING3. If not see builtin_define_std ("WIN64"); \ builtin_define ("_WIN64"); \ } \ + CPP_MCFGTHREAD(); \ } \ while (0) @@ -185,7 +194,7 @@ along with GCC; see the file COPYING3. If not see #define REAL_LIBGCC_SPEC \ "%{mthreads:-lmingwthrd} -lmingw32 \ " SHARED_LIBGCC_SPEC " \ - -lmoldname -lmingwex -lmsvcrt -lkernel32" + -lmoldname -lmingwex -lmsvcrt " LIB_MCFGTHREAD " -lkernel32 -lntdll" #undef STARTFILE_SPEC #define STARTFILE_SPEC "%{shared|mdll:dllcrt2%O%s} \ diff --git a/gcc/configure.ac b/gcc/configure.ac index b6bafa8b7d69..0641b8a61dae 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -1991,7 +1991,7 @@ case ${enable_threads} in target_thread_file='single' ;; aix | dce | lynx | mipssde | posix | rtems | \ - single | tpf | vxworks | win32) + single | tpf | vxworks | win32 | mcf) target_thread_file=${enable_threads} ;; *) diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt index 33f8c91ce771..86a59475b6e7 100644 --- a/libatomic/configure.tgt +++ b/libatomic/configure.tgt @@ -159,7 +159,7 @@ case "${target}" in *-*-mingw*) # OS support for atomic primitives. case ${target_thread_file} in - win32) + win32 | mcf) config_path="${config_path} mingw" ;; posix) diff --git a/libgcc/config.host b/libgcc/config.host index 9dcc2538dc86..44a8218a31d3 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -825,6 +825,9 @@ i[34567]86-*-mingw*) posix) tmake_file="i386/t-mingw-pthread $tmake_file" ;; + mcf) + tmake_file="i386/t-mingw-mcfgthread $tmake_file" + ;; esac # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h if test x$ac_cv_sjlj_exceptions = xyes; then @@ -849,6 +852,9 @@ x86_64-*-mingw*) posix) tmake_file="i386/t-mingw-pthread $tmake_file" ;; + mcf) + tmake_file="i386/t-mingw-mcfgthread $tmake_file" + ;; esac # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h if test x$ac_cv_sjlj_exceptions = xyes; then diff --git a/libgcc/config/i386/gthr-mcf.h b/libgcc/config/i386/gthr-mcf.h new file mode 100644 index 000000000000..58131bb7ca92 --- /dev/null +++ b/libgcc/config/i386/gthr-mcf.h @@ -0,0 +1 @@ +#include <mcfgthread/gthr.h> diff --git a/libgcc/config/i386/t-mingw-mcfgthread b/libgcc/config/i386/t-mingw-mcfgthread new file mode 100644 index 000000000000..c5b817f09b71 --- /dev/null +++ b/libgcc/config/i386/t-mingw-mcfgthread @@ -0,0 +1 @@ +SHLIB_MCFGTHREAD_LIBS = -lmcfgthread -lkernel32 -lntdll diff --git a/libgcc/config/i386/t-slibgcc-cygming b/libgcc/config/i386/t-slibgcc-cygming index 6236c78e4668..6871498cf60e 100644 --- a/libgcc/config/i386/t-slibgcc-cygming +++ b/libgcc/config/i386/t-slibgcc-cygming @@ -27,6 +27,9 @@ endif ifndef SHLIB_PTHREAD_LDFLAG SHLIB_PTHREAD_LDFLAG = endif +ifndef SHLIB_MCFGTHREAD_LIBS +SHLIB_MCFGTHREAD_LIBS = +endif SHLIB_LINK = $(LN_S) -f $(SHLIB_MAP) $(SHLIB_MAP).def && \ if [ ! -d $(SHLIB_DIR) ]; then \ @@ -37,7 +40,8 @@ SHLIB_LINK = $(LN_S) -f $(SHLIB_MAP) $(SHLIB_MAP).def && \ $(SHLIB_MAP).def \ -Wl,--out-implib,$(SHLIB_DIR)/$(SHLIB_IMPLIB).tmp \ -o $(SHLIB_DIR)/$(SHLIB_SONAME).tmp @multilib_flags@ \ - $(SHLIB_OBJS) ${SHLIB_PTHREAD_LDFLAG} $(SHLIB_LC) && \ + $(SHLIB_OBJS) ${SHLIB_PTHREAD_LDFLAG} $(SHLIB_LC) \ + $(SHLIB_MCFGTHREAD_LIBS) && \ if [ -f $(SHLIB_DIR)/$(SHLIB_SONAME) ]; then \ mv -f $(SHLIB_DIR)/$(SHLIB_SONAME) \ $(SHLIB_DIR)/$(SHLIB_SONAME).backup; \ diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc index a2693d0424e1..2f936ab02ce2 100644 --- a/libstdc++-v3/libsupc++/atexit_thread.cc +++ b/libstdc++-v3/libsupc++/atexit_thread.cc @@ -25,6 +25,24 @@ #include <cstdlib> #include <new> #include "bits/gthr.h" + +#ifdef __USING_MCFGTHREAD__ + +#include <mcfgthread/cxa.h> + +namespace __cxxabiv1 { + +extern "C" int +__cxa_thread_atexit (void (_GLIBCXX_CDTOR_CALLABI *dtor)(void *), + void *obj, void *dso_handle) _GLIBCXX_NOTHROW +{ + return __MCF_cxa_thread_atexit (dtor, obj, dso_handle); +} + +} // namespace __cxxabiv1 + +#else // __USING_MCFGTHREAD__ + #ifdef _GLIBCXX_THREAD_ATEXIT_WIN32 #define WIN32_LEAN_AND_MEAN #include <windows.h> @@ -173,3 +191,5 @@ __cxxabiv1::__cxa_thread_atexit (void (_GLIBCXX_CDTOR_CALLABI *dtor)(void *), } #endif /* _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL */ + +#endif // __USING_MCFGTHREAD__ diff --git a/libstdc++-v3/libsupc++/guard.cc b/libstdc++-v3/libsupc++/guard.cc index abb57117cdfd..0f81a22c6845 100644 --- a/libstdc++-v3/libsupc++/guard.cc +++ b/libstdc++-v3/libsupc++/guard.cc @@ -28,6 +28,35 @@ #include <cxxabi.h> #include <exception> #include <new> + +#ifdef __USING_MCFGTHREAD__ + +#include <mcfgthread/cxa.h> + +namespace __cxxabiv1 { + +extern "C" int +__cxa_guard_acquire (__guard* g) _GLIBCXX_NOTHROW + { + return __MCF_cxa_guard_acquire(g); + } + +extern "C" void +__cxa_guard_release (__guard* g) _GLIBCXX_NOTHROW + { + __MCF_cxa_guard_release(g); + } + +extern "C" void +__cxa_guard_abort (__guard* g) _GLIBCXX_NOTHROW + { + __MCF_cxa_guard_abort(g); + } + +} // namespace __cxxabiv1 + +#else // __USING_MCFGTHREAD__ + #include <ext/atomicity.h> #include <ext/concurrence.h> #include <bits/atomic_lockfree_defines.h> @@ -458,3 +487,5 @@ namespace __cxxabiv1 #endif } } + +#endif // __USING_MCFGTHREAD__ -- 2.37.3
OpenPGP_signature
Description: OpenPGP digital signature