aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHannes Domani <ssbssa@yahoo.de>2022-11-28 19:22:38 +0100
committerHannes Domani <ssbssa@yahoo.de>2022-11-28 20:46:01 +0100
commit1d39fec4aeacc53f6eb696eaa846f8f07948fcf5 (patch)
treeff20b720736d4de897cb95a294be8b7565a52bcc
parent5975a5caceb238be7eddb3b279d51145a1628af8 (diff)
downloadgdb-1d39fec4aeacc53f6eb696eaa846f8f07948fcf5.zip
gdb-1d39fec4aeacc53f6eb696eaa846f8f07948fcf5.tar.gz
gdb-1d39fec4aeacc53f6eb696eaa846f8f07948fcf5.tar.bz2
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.
-rw-r--r--gdb/windows-nat.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index 5d50650..f61f6c1 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -344,6 +344,9 @@ private:
BOOL windows_continue (DWORD continue_status, int id, int killed,
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
inferiors and waits for events. */
void process_thread ();
@@ -404,13 +407,8 @@ windows_nat_target::windows_nat_target ()
m_response_event (CreateEvent (nullptr, false, false, nullptr)),
m_wait_event (make_serial_event ())
{
- auto fn = [] (LPVOID self) -> DWORD
- {
- ((windows_nat_target *) self)->process_thread ();
- return 0;
- };
-
- HANDLE bg_thread = CreateThread (nullptr, 64 * 1024, fn, this, 0, nullptr);
+ HANDLE bg_thread = CreateThread (nullptr, 64 * 1024,
+ process_thread_starter, this, 0, nullptr);
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
windows_nat_target::process_thread ()
{