Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix MinGW build with _WIN32_WINNT<0x600, GCC>=13, model=win32 #132

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

palves
Copy link

@palves palves commented Dec 10, 2024

unordered_dense.h fails to compile on Windows/MinGW with GCC >= 13 with thread model win32, and _WIN32_WINNT < 0x600 (Vista), in CFLAGS/CXXFLAGS. E.g., GDB defines _WIN32_WINNT to 0x501, and it fails to build with GCC 14.2 like so:

   CXX    ada-exp.o
 In file included from /opt/xpack-mingw-w64-gcc-14.2.0-1/x86_64-w64-mingw32/include/c++/14.2.0/shared_mutex:42,
		  from /opt/xpack-mingw-w64-gcc-14.2.0-1/x86_64-w64-mingw32/include/c++/14.2.0/memory_resource:66,
		  from /home/pedro/gdb/src/gdb/../gdbsupport/unordered_dense.h:104,
		  from /home/pedro/gdb/src/gdb/../gdbsupport/unordered_map.h:21,
		  from /home/pedro/gdb/src/gdb/gdbtypes.h:53,
		  from /home/pedro/gdb/src/gdb/expression.h:23,
		  from /home/pedro/gdb/src/gdb/ada-exp.y:40:
 /opt/xpack-mingw-w64-gcc-14.2.0-1/x86_64-w64-mingw32/include/c++/14.2.0/bits/std_mutex.h:164:5: error: '__gthread_cond_t' does not name a type; did you mean '__gthread_once_t'?
   164 |     __gthread_cond_t* native_handle() noexcept { return &_M_cond; }
       |     ^~~~~~~~~~~~~~~~
       |     __gthread_once_t
 (... snip other instances of same ...)

The problem is that unordered_dense.h includes <memory_resource>, which uses std::mutex, and thus needs to include <mutex>. (See https://quuxplusone.github.io/blog/2018/06/05/libcpp-memory-resource, "Notice that synchronized_pool_resource contains a mutex, which means that <memory_resource> effectively must include <mutex>.")

GCC 13 rewrote the win32 thread model support, and in that rewrite, support for __gthread_cond_t in std_mutex.h became conditional on _WIN32_WINNT >= 0x600.

GCC/libstdc++ also has <experimental/memory_resource> so with this patch, such a configuration takes that branch and succeeds, because <experimental/memory_resource> does not include <mutex>.

Tested with MinGW-w64 GCC 14.2, posix and win32 models.
Tested with MinGW-w64 GCC 10.1, posix and win32 models.
Tested with GNU/Linux GCC 11.4.0.

unordered_dense.h fails to compile on Windows/MinGW with GCC >= 13
with thread model win32, and _WIN32_WINNT < 0x600 (Vista), in
CFLAGS/CXXFLAGS.  E.g., GDB defines _WIN32_WINNT to 0x501, and it
fails to build with GCC 14.2 like so:

   CXX    ada-exp.o
 In file included from /opt/xpack-mingw-w64-gcc-14.2.0-1/x86_64-w64-mingw32/include/c++/14.2.0/shared_mutex:42,
		  from /opt/xpack-mingw-w64-gcc-14.2.0-1/x86_64-w64-mingw32/include/c++/14.2.0/memory_resource:66,
		  from /home/pedro/gdb/src/gdb/../gdbsupport/unordered_dense.h:104,
		  from /home/pedro/gdb/src/gdb/../gdbsupport/unordered_map.h:21,
		  from /home/pedro/gdb/src/gdb/gdbtypes.h:53,
		  from /home/pedro/gdb/src/gdb/expression.h:23,
		  from /home/pedro/gdb/src/gdb/ada-exp.y:40:
 /opt/xpack-mingw-w64-gcc-14.2.0-1/x86_64-w64-mingw32/include/c++/14.2.0/bits/std_mutex.h:164:5: error: '__gthread_cond_t' does not name a type; did you mean '__gthread_once_t'?
   164 |     __gthread_cond_t* native_handle() noexcept { return &_M_cond; }
       |     ^~~~~~~~~~~~~~~~
       |     __gthread_once_t
 (... snip other instances of same ...)

The problem is that unordered_dense.h includes <memory_resource>,
which uses std::mutex, and thus needs to include <mutex>.  (See
<https://quuxplusone.github.io/blog/2018/06/05/libcpp-memory-resource>,
"Notice that synchronized_pool_resource contains a mutex, which means
that <memory_resource> effectively must include <mutex>.")

GCC 13 rewrote the win32 thread model support, and in that rewrite,
support for __gthread_cond_t in std_mutex.h became conditional on
_WIN32_WINNT >= 0x600.

GCC/libstdc++ also has <experimental/memory_resource> so with this
patch, such a configuration takes that branch and succeeds, because
<experimental/memory_resource> does not include <mutex>.

Tested with MinGW-w64 GCC 14.2, posix and win32 models.
Tested with MinGW-w64 GCC 10.1, posix and win32 models.
Tested with GNU/Linux GCC 11.4.0.
@palves palves force-pushed the palves/mingw-win32-model branch from b931c00 to d6ce051 Compare December 10, 2024 21:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants