[v3,gdb/build] Fix build breaker on mingw-w64

Message ID 20241204132504.32739-1-tdevries@suse.de
State Committed
Headers
Series [v3,gdb/build] Fix build breaker on mingw-w64 |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 fail Patch failed to apply
linaro-tcwg-bot/tcwg_gdb_check--master-arm fail Patch failed to apply

Commit Message

Tom de Vries Dec. 4, 2024, 1:25 p.m. UTC
  From: Simon Marchi <simark@simark.ca>

The mingw-w64 build breaks currently:
...
    In file included from gdb/cli/cli-cmds.c:58:
    gdbsupport/eintr.h: In function ‘pid_t gdb::waitpid(pid_t, int*, int)’:
    gdbsupport/eintr.h:77:35: error: ‘::waitpid’ has not been declared; \
                                     did you mean ‘gdb::waitpid’?
       77 |   return gdb::handle_eintr (-1, ::waitpid, pid, wstatus, options);
          |                                   ^~~~~~~
          |                                   gdb::waitpid
    gdbsupport/eintr.h:75:1: note: ‘gdb::waitpid’ declared here
       75 | waitpid (pid_t pid, int *wstatus, int options)
          | ^~~~~~~
...

This is a regression since commit 658a03e9e85 ("[gdbsupport] Add
gdb::{waitpid,read,write,close}"), which moved the use of ::waitpid from
run_under_shell, where it was used conditionally:
...
 #if defined(CANT_FORK) || \
       (!defined(HAVE_WORKING_VFORK) && !defined(HAVE_WORKING_FORK))
   ...
 #else
   ...
       int ret = gdb::handle_eintr (-1, ::waitpid, pid, &status, 0);
...
to gdb::waitpid, where it's used unconditionally:
...
inline pid_t
waitpid (pid_t pid, int *wstatus, int options)
{
  return gdb::handle_eintr (-1, ::waitpid, pid, wstatus, options);
}
...

Likewise for ::wait.

Guard these uses with HAVE_WAITPID and HAVE_WAIT.

Reproduced and tested by doing a mingw-w64 cross-build on x86_64-linux.

Reported-By: Simon Marchi <simark@simark.ca>
Co-Authored-By: Tom de Vries <tdevries@suse.de>
---
 gdb/config.in           |  3 ---
 gdb/configure           |  1 -
 gdb/configure.ac        |  1 -
 gdbsupport/config.in    |  6 ++++++
 gdbsupport/configure    | 16 ++++++++++++++++
 gdbsupport/configure.ac |  5 +++++
 gdbsupport/eintr.h      |  4 ++++
 7 files changed, 31 insertions(+), 5 deletions(-)


base-commit: 624fafc58befdaca88f744877d7c2d99b411e190
  

Comments

Tom Tromey Dec. 4, 2024, 6:50 p.m. UTC | #1
>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:

Tom> Guard these uses with HAVE_WAITPID and HAVE_WAIT.

Tom> Reproduced and tested by doing a mingw-w64 cross-build on x86_64-linux.

Looks good to me.
Approved-By: Tom Tromey <tom@tromey.com>

Tom
  

Patch

diff --git a/gdb/config.in b/gdb/config.in
index 187b42ca29b..db63aeaec75 100644
--- a/gdb/config.in
+++ b/gdb/config.in
@@ -586,9 +586,6 @@ 
 /* Define to 1 if you have the <vfork.h> header file. */
 #undef HAVE_VFORK_H
 
-/* Define to 1 if you have the `waitpid' function. */
-#undef HAVE_WAITPID
-
 /* Define to 1 if you have the <wait.h> header file. */
 #undef HAVE_WAIT_H
 
diff --git a/gdb/configure b/gdb/configure
index 138c2a153b7..de750f4fafe 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -29924,7 +29924,6 @@  for ac_func in  \
   sigsetmask \
   ttrace \
   use_default_colors \
-  waitpid \
   wresize \
 
 do :
diff --git a/gdb/configure.ac b/gdb/configure.ac
index d638b8f3c8e..230c0be79c7 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -1389,7 +1389,6 @@  AC_CHECK_FUNCS([ \
   sigsetmask \
   ttrace \
   use_default_colors \
-  waitpid \
   wresize \
 ])
 
diff --git a/gdbsupport/config.in b/gdbsupport/config.in
index 8467072752a..0beacf22c05 100644
--- a/gdbsupport/config.in
+++ b/gdbsupport/config.in
@@ -319,6 +319,12 @@ 
 /* Define to 1 if you have the <vfork.h> header file. */
 #undef HAVE_VFORK_H
 
+/* Define to 1 if you have the `wait' function. */
+#undef HAVE_WAIT
+
+/* Define to 1 if you have the `waitpid' function. */
+#undef HAVE_WAITPID
+
 /* Define to 1 if you have the <wait.h> header file. */
 #undef HAVE_WAIT_H
 
diff --git a/gdbsupport/configure b/gdbsupport/configure
index 87980f6870f..67a48c47305 100755
--- a/gdbsupport/configure
+++ b/gdbsupport/configure
@@ -13948,6 +13948,22 @@  else
 fi
 
 
+for ac_func in  \
+    waitpid \
+    wait
+
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
 # Check the return and argument types of ptrace.
 
 
diff --git a/gdbsupport/configure.ac b/gdbsupport/configure.ac
index b30b4365f53..92e2a852111 100644
--- a/gdbsupport/configure.ac
+++ b/gdbsupport/configure.ac
@@ -56,6 +56,11 @@  AM_CONDITIONAL(SELFTEST, $enable_unittests)
 AM_CONDITIONAL(HAVE_PIPE_OR_PIPE2,
    [test x$ac_cv_func_pipe = xyes -o x$ac_cv_func_pipe2 = xyes ])
 
+AC_CHECK_FUNCS([ \
+    waitpid \
+    wait
+  ])
+
 # Check the return and argument types of ptrace.
 GDB_AC_PTRACE
 
diff --git a/gdbsupport/eintr.h b/gdbsupport/eintr.h
index 3980e3f5ac1..4cab8f9d48d 100644
--- a/gdbsupport/eintr.h
+++ b/gdbsupport/eintr.h
@@ -71,11 +71,13 @@  handle_eintr (ErrorValType errval, const Fun &f, const Args &... args)
   return ret;
 }
 
+#ifdef HAVE_WAITPID
 inline pid_t
 waitpid (pid_t pid, int *wstatus, int options)
 {
   return gdb::handle_eintr (-1, ::waitpid, pid, wstatus, options);
 }
+#endif /* HAVE_WAITPID */
 
 inline int
 open (const char *pathname, int flags)
@@ -83,11 +85,13 @@  open (const char *pathname, int flags)
   return gdb::handle_eintr (-1, ::open, pathname, flags);
 }
 
+#ifdef HAVE_WAIT
 inline pid_t
 wait (int *wstatus)
 {
   return gdb::handle_eintr (-1, ::wait, wstatus);
 }
+#endif /* HAVE_WAIT */
 
 inline int
 close (int fd)