From 0225ef625554f270552ec5bacf5cd7039a7e8632 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Wed, 4 Dec 2024 21:29:52 +0100 Subject: [PATCH] [gdb/build] Fix build breaker on mingw-w64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Co-Authored-By: Tom de Vries --- 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(-) 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 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 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 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 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)