286 lines
9.4 KiB
Diff
286 lines
9.4 KiB
Diff
|
From 30534f48c6ede142dad0008d1641392d82b8a137 Mon Sep 17 00:00:00 2001
|
||
|
From: Liu Hao <lh_mouse@126.com>
|
||
|
Date: Mon, 18 Apr 2016 11:50:55 +0800
|
||
|
Subject: [PATCH] Added 'mcf' thread model support from mcfgthread.
|
||
|
|
||
|
Signed-off-by: Liu Hao <lh_mouse@126.com>
|
||
|
---
|
||
|
config/gthr.m4 | 1 +
|
||
|
gcc/config.gcc | 3 +++
|
||
|
gcc/config/i386/mingw-mcfgthread.h | 1 +
|
||
|
gcc/config/i386/mingw-w64.h | 2 +-
|
||
|
gcc/config/i386/mingw32.h | 11 ++++++++++-
|
||
|
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 | 2 ++
|
||
|
libgcc/configure | 1 +
|
||
|
libstdc++-v3/configure | 1 +
|
||
|
libstdc++-v3/libsupc++/atexit_thread.cc | 18 ++++++++++++++++++
|
||
|
libstdc++-v3/libsupc++/guard.cc | 23 +++++++++++++++++++++++
|
||
|
15 files changed, 71 insertions(+), 5 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 7b29f1f3327..82e21fe1709 100644
|
||
|
--- a/config/gthr.m4
|
||
|
+++ b/config/gthr.m4
|
||
|
@@ -21,6 +21,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 858b878d4b3..6f745790d64 100644
|
||
|
--- a/gcc/config.gcc
|
||
|
+++ b/gcc/config.gcc
|
||
|
@@ -1722,6 +1722,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 00000000000..ec381a7798f
|
||
|
--- /dev/null
|
||
|
+++ b/gcc/config/i386/mingw-mcfgthread.h
|
||
|
@@ -0,0 +1 @@
|
||
|
+#define TARGET_USE_MCFGTHREAD 1
|
||
|
diff --git a/gcc/config/i386/mingw-w64.h b/gcc/config/i386/mingw-w64.h
|
||
|
index fe11333a2d1..cac85802f38 100644
|
||
|
--- a/gcc/config/i386/mingw-w64.h
|
||
|
+++ b/gcc/config/i386/mingw-w64.h
|
||
|
@@ -48,7 +48,7 @@ along with GCC; see the file COPYING3. If not see
|
||
|
"%{mwindows:-lgdi32 -lcomdlg32} " \
|
||
|
"%{fvtable-verify=preinit:-lvtv -lpsapi; \
|
||
|
fvtable-verify=std:-lvtv -lpsapi} " \
|
||
|
- "-ladvapi32 -lshell32 -luser32 -lkernel32"
|
||
|
+ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32"
|
||
|
|
||
|
#undef SPEC_32
|
||
|
#undef SPEC_64
|
||
|
diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h
|
||
|
index e04818966fa..7b75a372506 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)
|
||
|
|
||
|
@@ -93,7 +102,7 @@ along with GCC; see the file COPYING3. If not see
|
||
|
"%{mwindows:-lgdi32 -lcomdlg32} " \
|
||
|
"%{fvtable-verify=preinit:-lvtv -lpsapi; \
|
||
|
fvtable-verify=std:-lvtv -lpsapi} " \
|
||
|
- "-ladvapi32 -lshell32 -luser32 -lkernel32"
|
||
|
+ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32"
|
||
|
|
||
|
/* Weak symbols do not get resolved if using a Windows dll import lib.
|
||
|
Make the unwind registration references strong undefs. */
|
||
|
diff --git a/gcc/configure b/gcc/configure
|
||
|
index 954673c1c43..6b5667f1c70 100755
|
||
|
--- a/gcc/configure
|
||
|
+++ b/gcc/configure
|
||
|
@@ -11702,7 +11702,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 4c65d441e72..e6fa04ada4f 100644
|
||
|
--- a/gcc/configure.ac
|
||
|
+++ b/gcc/configure.ac
|
||
|
@@ -1593,7 +1593,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 eab2765d7fd..f4058b6f4a2 100644
|
||
|
--- a/libatomic/configure.tgt
|
||
|
+++ b/libatomic/configure.tgt
|
||
|
@@ -124,7 +124,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 2b139b8befc..fb18d2a042e 100644
|
||
|
--- a/libgcc/config.host
|
||
|
+++ b/libgcc/config.host
|
||
|
@@ -712,6 +712,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
|
||
|
@@ -736,6 +739,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..5ea2908361f
|
||
|
--- /dev/null
|
||
|
+++ b/libgcc/config/i386/gthr-mcf.h
|
||
|
@@ -0,0 +1 @@
|
||
|
+#include <mcfgthread/gthread.h>
|
||
|
diff --git a/libgcc/config/i386/t-mingw-mcfgthread b/libgcc/config/i386/t-mingw-mcfgthread
|
||
|
new file mode 100644
|
||
|
index 00000000000..4b9b10e32d6
|
||
|
--- /dev/null
|
||
|
+++ b/libgcc/config/i386/t-mingw-mcfgthread
|
||
|
@@ -0,0 +1,2 @@
|
||
|
+SHLIB_PTHREAD_CFLAG =
|
||
|
+SHLIB_PTHREAD_LDFLAG = -lmcfgthread
|
||
|
diff --git a/libgcc/configure b/libgcc/configure
|
||
|
index e7d6c75a6f7..664d0f852c4 100644
|
||
|
--- a/libgcc/configure
|
||
|
+++ b/libgcc/configure
|
||
|
@@ -5077,6 +5077,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 b5ae4213f94..c484d3aee5f 100755
|
||
|
--- a/libstdc++-v3/configure
|
||
|
+++ b/libstdc++-v3/configure
|
||
|
@@ -15177,6 +15177,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/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc
|
||
|
index e6520c1094f..3d6907796dd 100644
|
||
|
--- a/libstdc++-v3/libsupc++/atexit_thread.cc
|
||
|
+++ b/libstdc++-v3/libsupc++/atexit_thread.cc
|
||
|
@@ -25,6 +25,22 @@
|
||
|
#include <cstdlib>
|
||
|
#include <new>
|
||
|
#include "bits/gthr.h"
|
||
|
+
|
||
|
+#ifdef __USING_MCFGTHREAD__
|
||
|
+
|
||
|
+#include <mcfgthread/gthread.h>
|
||
|
+
|
||
|
+extern "C" int
|
||
|
+__cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *),
|
||
|
+ void *obj, void *dso_handle)
|
||
|
+ _GLIBCXX_NOTHROW
|
||
|
+{
|
||
|
+ return ::_MCFCRT_AtThreadExit((void (*)(_MCFCRT_STD intptr_t))dtor, (_MCFCRT_STD intptr_t)obj) ? 0 : -1;
|
||
|
+ (void)dso_handle;
|
||
|
+}
|
||
|
+
|
||
|
+#else // __USING_MCFGTHREAD__
|
||
|
+
|
||
|
#ifdef _GLIBCXX_THREAD_ATEXIT_WIN32
|
||
|
#define WIN32_LEAN_AND_MEAN
|
||
|
#include <windows.h>
|
||
|
@@ -163,3 +179,5 @@ __cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), void *obj, void */*dso_ha
|
||
|
}
|
||
|
|
||
|
#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 9b617998ffe..a441fdbb616 100644
|
||
|
--- a/libstdc++-v3/libsupc++/guard.cc
|
||
|
+++ b/libstdc++-v3/libsupc++/guard.cc
|
||
|
@@ -28,6 +28,27 @@
|
||
|
#include <cxxabi.h>
|
||
|
#include <exception>
|
||
|
#include <new>
|
||
|
+
|
||
|
+#ifdef __USING_MCFGTHREAD__
|
||
|
+
|
||
|
+#include <mcfgthread/gthread.h>
|
||
|
+
|
||
|
+namespace __cxxabiv1 {
|
||
|
+
|
||
|
+extern "C" int __cxa_guard_acquire(__guard *g){
|
||
|
+ return ::_MCFCRT_WaitForOnceFlagForever((::_MCFCRT_OnceFlag *)g) == ::_MCFCRT_kOnceResultInitial;
|
||
|
+}
|
||
|
+extern "C" void __cxa_guard_abort(__guard *g) throw() {
|
||
|
+ ::_MCFCRT_SignalOnceFlagAsAborted((::_MCFCRT_OnceFlag *)g);
|
||
|
+}
|
||
|
+extern "C" void __cxa_guard_release(__guard *g) throw() {
|
||
|
+ ::_MCFCRT_SignalOnceFlagAsFinished((::_MCFCRT_OnceFlag *)g);
|
||
|
+}
|
||
|
+
|
||
|
+}
|
||
|
+
|
||
|
+#else // __USING_MCFGTHREAD__
|
||
|
+
|
||
|
#include <ext/atomicity.h>
|
||
|
#include <ext/concurrence.h>
|
||
|
#if defined(__GTHREADS) && defined(__GTHREAD_HAS_COND) \
|
||
|
@@ -424,3 +445,5 @@ namespace __cxxabiv1
|
||
|
#endif
|
||
|
}
|
||
|
}
|
||
|
+
|
||
|
+#endif
|
||
|
--
|
||
|
2.12.1
|
||
|
|