From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1814) id DC0B13858D39; Wed, 19 Oct 2022 13:54:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DC0B13858D39 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1666187653; bh=Z3uWkFkS3+IO72UG1fOihkCl1cCfhcuxjjs3ZJa6pdw=; h=From:To:Subject:Date:From; b=sLwAfu5kVrif0oKwSiEsGCb+RESNi67sLJ8ACoTUDnNJmEdLENUHL5R0o2SKeyEU3 wk+oYJIFwl0plCcSAIrTPIS3kX7mzGy98zVb4yPzq+OlR1LoRy3cLh41P7K1FZtXAR HZ5mllEn8zitr2LNsgQj/XtKHUEyEbe5s5s45AiM= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Yong To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r13-3381] gcc: Add 'mcf' thread model support from mcfgthread X-Act-Checkin: gcc X-Git-Author: LIU Hao X-Git-Refname: refs/heads/master X-Git-Oldrev: f3b957ea8b9dadfb1ed30f24f463529684b7a36a X-Git-Newrev: f036d759ecee538555fa8c6b11963e4033732463 Message-Id: <20221019135413.DC0B13858D39@sourceware.org> Date: Wed, 19 Oct 2022 13:54:13 +0000 (GMT) List-Id: https://gcc.gnu.org/g:f036d759ecee538555fa8c6b11963e4033732463 commit r13-3381-gf036d759ecee538555fa8c6b11963e4033732463 Author: LIU Hao Date: Sat Apr 16 00:46:23 2022 +0800 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 . config/ChangeLog: * gthr.m4 (GCC_AC_THREAD_HEADER): Add new case for `mcf` thread model gcc/ChangeLog: * config/i386/mingw-mcfgthread.h: New file * config/i386/mingw32.h: Add builtin macro and default libraries for mcfgthread when thread model is `mcf` * config.gcc: Include 'i386/mingw-mcfgthread.h' when thread model is `mcf` * configure.ac: Recognize `mcf` as a valid thread model * config.in: Regenerate * configure: Regenerate 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 * configure: Regenerate 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 * configure: Regenerate Diff: --- config/gthr.m4 | 1 + gcc/config.gcc | 3 +++ gcc/config.in | 10 ++++++---- gcc/config/i386/mingw-mcfgthread.h | 1 + gcc/config/i386/mingw32.h | 13 ++++++++++++- gcc/configure | 2 +- 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 +++++- libgcc/configure | 1 + libstdc++-v3/configure | 13 +++++++------ libstdc++-v3/libsupc++/atexit_thread.cc | 20 ++++++++++++++++++++ libstdc++-v3/libsupc++/guard.cc | 31 +++++++++++++++++++++++++++++++ 16 files changed, 98 insertions(+), 15 deletions(-) diff --git a/config/gthr.m4 b/config/gthr.m4 index 4b937306ad0..11996247f15 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 2af30b4a6ec..2fbf2e6fa69 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -2096,6 +2096,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.in b/gcc/config.in index cc217b94e0c..5e41748a354 100644 --- a/gcc/config.in +++ b/gcc/config.in @@ -1451,6 +1451,12 @@ #endif +/* Define to 1 if you have the `getauxval' function. */ +#ifndef USED_FOR_TARGET +#undef HAVE_GETAUXVAL +#endif + + /* Define to 1 if you have the `getchar_unlocked' function. */ #ifndef USED_FOR_TARGET #undef HAVE_GETCHAR_UNLOCKED @@ -2678,7 +2684,3 @@ #undef vfork #endif -/* Define to 1 if you have the `getauxval' function. */ -#ifndef USED_FOR_TARGET -#undef HAVE_GETAUXVAL -#endif diff --git a/gcc/config/i386/mingw-mcfgthread.h b/gcc/config/i386/mingw-mcfgthread.h new file mode 100644 index 00000000000..7d4eda3ed49 --- /dev/null +++ b/gcc/config/i386/mingw-mcfgthread.h @@ -0,0 +1 @@ +#define TARGET_USING_MCFGTHREAD 1 diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h index d3ca0cd0279..b5f31c3da0a 100644 --- a/gcc/config/i386/mingw32.h +++ b/gcc/config/i386/mingw32.h @@ -32,6 +32,10 @@ along with GCC; see the file COPYING3. If not see | MASK_STACK_PROBE | MASK_ALIGN_DOUBLE \ | MASK_MS_BITFIELD_LAYOUT) +#ifndef TARGET_USING_MCFGTHREAD +#define TARGET_USING_MCFGTHREAD 0 +#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 +54,8 @@ along with GCC; see the file COPYING3. If not see builtin_define_std ("WIN64"); \ builtin_define ("_WIN64"); \ } \ + if (TARGET_USING_MCFGTHREAD) \ + builtin_define ("__USING_MCFGTHREAD__"); \ } \ while (0) @@ -181,11 +187,16 @@ along with GCC; see the file COPYING3. If not see #else #define SHARED_LIBGCC_SPEC " -lgcc " #endif +#if TARGET_USING_MCFGTHREAD +#define MCFGTHREAD_SPEC " -lmcfgthread -lkernel32 -lntdll " +#else +#define MCFGTHREAD_SPEC "" +#endif #undef REAL_LIBGCC_SPEC #define REAL_LIBGCC_SPEC \ "%{mthreads:-lmingwthrd} -lmingw32 \ " SHARED_LIBGCC_SPEC " \ - -lmoldname -lmingwex -lmsvcrt -lkernel32" + -lmoldname -lmingwex -lmsvcrt -lkernel32 " MCFGTHREAD_SPEC #undef STARTFILE_SPEC #define STARTFILE_SPEC "%{shared|mdll:dllcrt2%O%s} \ diff --git a/gcc/configure b/gcc/configure index 99ba76522d6..2ce51a8a458 100755 --- a/gcc/configure +++ b/gcc/configure @@ -12900,7 +12900,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/gcc/configure.ac b/gcc/configure.ac index e48fcbfe18e..e1ef2ecf026 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 33f8c91ce77..86a59475b6e 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 0fbf9a34f17..eb23abe89f5 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 00000000000..58131bb7ca9 --- /dev/null +++ b/libgcc/config/i386/gthr-mcf.h @@ -0,0 +1 @@ +#include diff --git a/libgcc/config/i386/t-mingw-mcfgthread b/libgcc/config/i386/t-mingw-mcfgthread new file mode 100644 index 00000000000..c5b817f09b7 --- /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 6236c78e466..6871498cf60 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/libgcc/configure b/libgcc/configure index 61f3ace2891..be5d45f1755 100755 --- a/libgcc/configure +++ b/libgcc/configure @@ -5699,6 +5699,7 @@ case $target_thread_file 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 diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index 6077e693058..a90097523ab 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -15855,6 +15855,7 @@ case $target_thread_file 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 @@ -16062,7 +16063,7 @@ $as_echo "$glibcxx_cv_atomic_long_long" >&6; } # Fake what AC_TRY_COMPILE does. cat > conftest.$ac_ext << EOF -#line 16065 "configure" +#line 16066 "configure" int main() { typedef bool atomic_type; @@ -16097,7 +16098,7 @@ $as_echo "$glibcxx_cv_atomic_bool" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 16100 "configure" +#line 16101 "configure" int main() { typedef short atomic_type; @@ -16132,7 +16133,7 @@ $as_echo "$glibcxx_cv_atomic_short" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 16135 "configure" +#line 16136 "configure" int main() { // NB: _Atomic_word not necessarily int. @@ -16168,7 +16169,7 @@ $as_echo "$glibcxx_cv_atomic_int" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 16171 "configure" +#line 16172 "configure" int main() { typedef long long atomic_type; @@ -16324,7 +16325,7 @@ $as_echo "mutex" >&6; } # unnecessary for this test. cat > conftest.$ac_ext << EOF -#line 16327 "configure" +#line 16328 "configure" int main() { _Decimal32 d1; @@ -16366,7 +16367,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # unnecessary for this test. cat > conftest.$ac_ext << EOF -#line 16369 "configure" +#line 16370 "configure" template struct same { typedef T2 type; }; diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc index a2693d0424e..2f936ab02ce 100644 --- a/libstdc++-v3/libsupc++/atexit_thread.cc +++ b/libstdc++-v3/libsupc++/atexit_thread.cc @@ -25,6 +25,24 @@ #include #include #include "bits/gthr.h" + +#ifdef __USING_MCFGTHREAD__ + +#include + +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 @@ -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 abb57117cdf..0f81a22c684 100644 --- a/libstdc++-v3/libsupc++/guard.cc +++ b/libstdc++-v3/libsupc++/guard.cc @@ -28,6 +28,35 @@ #include #include #include + +#ifdef __USING_MCFGTHREAD__ + +#include + +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 #include #include @@ -458,3 +487,5 @@ namespace __cxxabiv1 #endif } } + +#endif // __USING_MCFGTHREAD__