[binutils-gdb] gdb/testsuite: Add mechanism to compile Windows native programs on Cygwin
Pedro Alves via Gdb-cvs <[email protected]> Fri, 12 Jun 2026 13:59:20 +0000 (GMT)
| Newsgroups | gmane.comp.gdb.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c04f1f54f6cb17dd23fe183ca748271c10475c03 commit c04f1f54f6cb17dd23fe183ca748271c10475c03 Author: Pedro Alves <[email protected]> Date: Sat May 23 03:08:31 2026 +0100 gdb/testsuite: Add mechanism to compile Windows native programs on Cygwin This adds a new "win32" option to gdb_compile that lets us compile native Windows programs when testing Cygwin. Will be used in a following patch. The testsuite tries to find the compiler to use automatically. You can also explicitly set it with WIN32_CC_FOR_TARGET. Change-Id: I86e954494cf7f88164cdf1c9127be46d5437986f Diff: --- gdb/testsuite/README | 22 ++++++++++ gdb/testsuite/lib/gdb.exp | 104 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 124 insertions(+), 2 deletions(-) diff --git a/gdb/testsuite/README b/gdb/testsuite/README index 60fd322ea4d..479e81f90f5 100644 --- a/gdb/testsuite/README +++ b/gdb/testsuite/README @@ -414,6 +414,28 @@ Example: make check-gdb TESTS="gdb.multi/multi-arch.exp" RUNTESTFLAGS="ARM_CC_FOR_TARGET=arm-linux-gnueabihf-gcc" +WIN32_CC_FOR_TARGET + +The Cygwin ports of GDB and GDBserver include basic support for +debugging native Windows programs. Some tests exercise this +particular feature. + +By default, the testsuite tries to find a compiler capable of +generating native Windows executables. If no compiler is found, or if +the executable generated by the found compiler can't be executed +correctly, the tests are marked UNSUPPORTED. The list of compiler +names the testsuite tries can be found in +gdb/testsuite/lib/gdb.exp:win32_cc_for_target. + +You can set WIN32_CC_FOR_TARGET to override the search and explicitly +specify the compiler to use. This variable should contain the command +line for the compiler, including the full path to it, if the compiler +is not in $PATH. + +Example: + + make check-gdb TESTS="gdb.base/exitsignal.exp" RUNTESTFLAGS="WIN32_CC_FOR_TARGET=x86_64-w64-mingw32-gcc" + Race detection ************** diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index e8c77cec243..7b1feeaac84 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -6340,6 +6340,10 @@ proc gdb_can_simple_compile_nodebug {name code {type object} {compile_flags ""} global gdb_saved_set_unbuffered_mode_obj set gdb_saved_set_unbuffered_mode_obj "" +# The name of the set_unbuffered_mode_saved.o object. Stored in a +# global variable so it can be overridden in some cases. +set gdb_saved_set_unbuffered_mode_obj_name set_unbuffered_mode_saved.o + # Escape STR sufficiently for use on host commandline. proc escape_for_host { str } { @@ -6413,6 +6417,7 @@ proc quote_for_host { args } { # Fortran 90, Go or Rust. # - debug: Build with debug information. # - optimize: Build with optimization. +# - win32: Build a native Windows program. Cygwin only. proc gdb_compile {source dest type options} { global GDB_TESTCASE_OPTIONS @@ -6424,6 +6429,11 @@ proc gdb_compile {source dest type options} { set outdir [file dirname $dest] + # Handle compiling native Windows programs when testing Cygwin. + if { [istarget *-*-cygwin*] && [lsearch -exact $options win32] != -1} { + return [gdb_compile_win32 $source $dest $type $options] + } + # GDB doesn't support minimal symbols in AIX, so fail the compilation # if nodebug is requested for an AIX target. if { [istarget *-*-aix*] && [lsearch -exact $options nodebug] != -1} { @@ -6847,9 +6857,11 @@ proc gdb_compile {source dest type options} { return $result } if {[is_remote host]} { - set gdb_saved_set_unbuffered_mode_obj set_unbuffered_mode_saved.o + set gdb_saved_set_unbuffered_mode_obj \ + $::gdb_saved_set_unbuffered_mode_obj_name } else { - set gdb_saved_set_unbuffered_mode_obj ${objdir}/set_unbuffered_mode_saved.o + set gdb_saved_set_unbuffered_mode_obj \ + ${objdir}/$::gdb_saved_set_unbuffered_mode_obj_name } # Link a copy of the output object, because the # original may be automatically deleted. @@ -7215,6 +7227,38 @@ proc gdb_compile_openmp {source dest type options} { return [gdb_compile $source $dest $type $options] } +# Build a native Windows program from SOURCE. See prefatory comment +# for gdb_compile, above, for discussion of the parameters to this +# proc. This is meant to be used on Cygwin, to smoke test debugging +# native Windows programs with the Cygwin native backend. + +proc gdb_compile_win32 {source dest type options} { + if {![istarget *-*-cygwin*]} { + error "cygwin procedure called on non-cygwin target" + } + + save_vars { + ::target_triplet + ::CC_FOR_TARGET + ::gdb_saved_set_unbuffered_mode_obj + ::gdb_saved_set_unbuffered_mode_obj_name + } { + # So we trigger the set_unbuffered_mode_obj paths. + set ::target_triplet "x86_64-w64-mingw32" + + # We need a Win32-specific compilation of the + # set_unbuffered_mode object. + set ::gdb_saved_set_unbuffered_mode_obj "" + set ::gdb_saved_set_unbuffered_mode_obj_name \ + set_unbuffered_mode_saved_win32.o + + # Do this last, as this tries compiling internally. + set ::CC_FOR_TARGET [win32_cc_for_target] + + return [gdb_compile $source $dest $type $options] + } +} + # Send a command to GDB. # For options for TYPE see gdb_stdin_log_write @@ -11465,6 +11509,62 @@ gdb_caching_proc arm_cc_for_target {} { return "" } +# Return the compiler that can generate native Windows executables. +# Used when testing basic native Windows support on Cygwin. If +# WIN32_CC_FOR_TARGET is set, use that. If not, try a few common +# compiler names, making sure that the executable they produce can +# run. Note, this assumes global state has been set to target native +# Windows programs. See gdb_compile_win32. + +gdb_caching_proc win32_cc_for_target {} { + if {[info exists ::WIN32_CC_FOR_TARGET]} { + # If the user specified the compiler explicitly, then don't + # check whether the resulting binary runs outside GDB. Assume + # that it does, and if it turns out it doesn't, then the user + # should get loud FAILs, instead of UNSUPPORTED. + return $::WIN32_CC_FOR_TARGET + } + + # Fallback to a few common compiler names. Also confirm the + # produced binary actually runs on the system before declaring + # we've found the right compiler. + + # Only one compiler for now. + set compilers { + x86_64-w64-mingw32-gcc + } + + save_vars { + ::CC_FOR_TARGET + } { + foreach compiler $compilers { + if {![is_remote host] && [which $compiler] == 0} { + # Avoid "default_target_compile: Can't find + # $compiler." warning issued from gdb_compile. + continue + } + + set ::CC_FOR_TARGET $compiler + + set src { int main() { return 0; } } + if {[gdb_simple_compile win32-test-prog $src executable]} { + set target_obj [gdb_remote_download target $obj] + set result [remote_exec target $target_obj] + set status [lindex $result 0] + set output [lindex $result 1] + + file delete $obj + + if { $output == "" && $status == 0} { + return $compiler + } + } + } + } + + return "" +} + # Step until the pattern REGEXP is found. Step at most # MAX_STEPS times, but stop stepping once REGEXP is found. # CURRENT matches current location