mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-24 04:00:07 +08:00
Fix calling convention of thread entry point
For i686 the CreateThread entry point function needs the WINAPI (stdcall) calling convention: ../../gdb/windows-nat.c: In constructor 'windows_nat_target::windows_nat_target()': ../../gdb/windows-nat.c:450:56: error: invalid user-defined conversion from 'windows_nat_target::windows_nat_target()::<lambda(LPVOID)>' to 'LPTHREAD_START_ROUTINE' {aka 'long unsigned int (__attribute__((stdcall)) *)(void*)'} [-fpermissive] 450 | HANDLE bg_thread = CreateThread (nullptr, 64 * 1024, fn, this, 0, nullptr); | ^~ ../../gdb/windows-nat.c:444:13: note: candidate is: 'constexpr windows_nat_target::windows_nat_target()::<lambda(LPVOID)>::operator DWORD (*)(LPVOID)() const' (near match) 444 | auto fn = [] (LPVOID self) -> DWORD | ^ ../../gdb/windows-nat.c:444:13: note: no known conversion from 'DWORD (*)(LPVOID)' {aka 'long unsigned int (*)(void*)'} to 'LPTHREAD_START_ROUTINE' {aka 'long unsigned int (__attribute__((stdcall)) *)(void*)'} Since it's not possible to change the calling convention of a lambda, I've moved it to a separate function.
This commit is contained in:
@ -344,6 +344,9 @@ private:
|
|||||||
BOOL windows_continue (DWORD continue_status, int id, int killed,
|
BOOL windows_continue (DWORD continue_status, int id, int killed,
|
||||||
bool last_call = false);
|
bool last_call = false);
|
||||||
|
|
||||||
|
/* Helper function to start process_thread. */
|
||||||
|
static DWORD WINAPI process_thread_starter (LPVOID self);
|
||||||
|
|
||||||
/* This function implements the background thread that starts
|
/* This function implements the background thread that starts
|
||||||
inferiors and waits for events. */
|
inferiors and waits for events. */
|
||||||
void process_thread ();
|
void process_thread ();
|
||||||
@ -404,13 +407,8 @@ windows_nat_target::windows_nat_target ()
|
|||||||
m_response_event (CreateEvent (nullptr, false, false, nullptr)),
|
m_response_event (CreateEvent (nullptr, false, false, nullptr)),
|
||||||
m_wait_event (make_serial_event ())
|
m_wait_event (make_serial_event ())
|
||||||
{
|
{
|
||||||
auto fn = [] (LPVOID self) -> DWORD
|
HANDLE bg_thread = CreateThread (nullptr, 64 * 1024,
|
||||||
{
|
process_thread_starter, this, 0, nullptr);
|
||||||
((windows_nat_target *) self)->process_thread ();
|
|
||||||
return 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
HANDLE bg_thread = CreateThread (nullptr, 64 * 1024, fn, this, 0, nullptr);
|
|
||||||
CloseHandle (bg_thread);
|
CloseHandle (bg_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -453,6 +451,13 @@ wait_for_single (HANDLE handle, DWORD howlong)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DWORD WINAPI
|
||||||
|
windows_nat_target::process_thread_starter (LPVOID self)
|
||||||
|
{
|
||||||
|
((windows_nat_target *) self)->process_thread ();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
windows_nat_target::process_thread ()
|
windows_nat_target::process_thread ()
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user