Skip to content

LLDB build broken on mingw with libstdc++ with posix threads #162801

@mstorsjo

Description

@mstorsjo

Since #145621, building LLDB for windows/mingw fails, if using libstdc++ configured with posix threads. (This is commonly the default configuration of libstdc++.) CC @ashgti

Building fails with errors like these:

/home/martin/code/llvm-project/lldb/source/Host/windows/MainLoopWindows.cpp: In destructor ‘virtual {anonymous}::PipeEvent::~PipeEvent()’:
/home/martin/code/llvm-project/lldb/source/Host/windows/MainLoopWindows.cpp:61:66: error: invalid conversion from ‘std::thread::native_handle_type’ {aka ‘long long unsigned int’} to ‘HANDLE’ {aka ‘void*’} [-fpermissive]
   61 |       } while (WaitForSingleObject(m_monitor_thread.native_handle(), 1) ==
      |                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
      |                                                                  |
      |                                                                  std::thread::native_handle_type {aka long long unsigned int}
In file included from /home/martin/gcc-mingw/x86_64-w64-mingw32/include/winbase.h:35,
                 from /home/martin/gcc-mingw/x86_64-w64-mingw32/include/windows.h:70,
                 from /home/martin/code/llvm-project/lldb/include/lldb/Host/windows/windows.h:19,
                 from /home/martin/code/llvm-project/lldb/include/lldb/Host/SocketAddress.h:15,
                 from /home/martin/code/llvm-project/lldb/include/lldb/Host/Socket.h:20,
                 from /home/martin/code/llvm-project/lldb/source/Host/windows/MainLoopWindows.cpp:11:
/home/martin/gcc-mingw/x86_64-w64-mingw32/include/synchapi.h:115:55: note:   initializing argument 1 of ‘DWORD WaitForSingleObject(HANDLE, DWORD)’
  115 |   WINBASEAPI DWORD WINAPI WaitForSingleObject (HANDLE hHandle, DWORD dwMilliseconds);
      |                                                ~~~~~~~^~~~~~

When libstdc++ is configured with posix threads, the native thread handle isn't a win32 HANDLE, but a pthread_t.

It's possible to try to inspect the C++ standard libraries to see which way they are configured, but this is not a stable API or something a consumer is supposed to inspect; see b4130be for an earlier attempt at doing the same elsewhere, which ended up being backed out in 87f4bc0 as libc++ changed the internal interface that was inspected.

Instead of mixing std::thread and native Windows APIs like WaitForSingleObject, is it possible to achieve the same with standard C++ std::thread methods?

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions