diff options
author | Pedro Alves <palves@redhat.com> | 2008-06-27 16:42:19 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2008-06-27 16:42:19 +0000 |
commit | f747e0ce0af7f5429fead10867abeb97ac1e6dde (patch) | |
tree | 561535bc1b945dac565b4055a6f6ff7dff482fd5 /gdb/testsuite/lib | |
parent | 7ccc1c74d815b3b3a8bae8afb5f4eacb438b29c5 (diff) | |
download | gdb-f747e0ce0af7f5429fead10867abeb97ac1e6dde.zip gdb-f747e0ce0af7f5429fead10867abeb97ac1e6dde.tar.gz gdb-f747e0ce0af7f5429fead10867abeb97ac1e6dde.tar.bz2 |
* lib/gdb.exp (gdb_saved_set_unbuffered_mode_obj): New global.
(gdb_compile): If target is *-*-cygwin* or *-*-mingw*, and we're
compiling an executable, link in an object that forces unbuffered
output.
* lib/set_unbuffered_mode.c: New file.
Diffstat (limited to 'gdb/testsuite/lib')
-rw-r--r-- | gdb/testsuite/lib/gdb.exp | 45 | ||||
-rw-r--r-- | gdb/testsuite/lib/set_unbuffered_mode.c | 28 |
2 files changed, 73 insertions, 0 deletions
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index e9b63f5..72081a8 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -1536,11 +1536,18 @@ proc gdb_wrapper_init { args } { set gdb_wrapper_initialized 1 } +# Some targets need to always link a special object in. Save its path here. +global gdb_saved_set_unbuffered_mode_obj +set gdb_saved_set_unbuffered_mode_obj "" + proc gdb_compile {source dest type options} { global GDB_TESTCASE_OPTIONS; global gdb_wrapper_file; global gdb_wrapper_flags; global gdb_wrapper_initialized; + global srcdir + global objdir + global gdb_saved_set_unbuffered_mode_obj set outdir [file dirname $dest] @@ -1627,6 +1634,44 @@ proc gdb_compile {source dest type options} { set options [lreplace $options $nowarnings $nowarnings $flag] } + if { $type == "executable" } { + if { ([istarget "*-*-mingw*"] + || [istarget "*-*-cygwin*"])} { + # Force output to unbuffered mode, by linking in an object file + # with a global contructor that calls setvbuf. + # + # Compile the special object seperatelly for two reasons: + # 1) Insulate it from $options. + # 2) Avoid compiling it for every gdb_compile invocation, + # which is time consuming, especially if we're remote + # host testing. + # + if { $gdb_saved_set_unbuffered_mode_obj == "" } { + verbose "compiling gdb_saved_set_unbuffered_obj" + set unbuf_src ${srcdir}/lib/set_unbuffered_mode.c + set unbuf_obj ${objdir}/set_unbuffered_mode.o + + set result [gdb_compile "${unbuf_src}" "${unbuf_obj}" object {nowarnings}] + if { $result != "" } { + return $result + } + + set gdb_saved_set_unbuffered_mode_obj ${objdir}/set_unbuffered_mode_saved.o + # Link a copy of the output object, because the + # original may be automatically deleted. + remote_exec host "cp -f $unbuf_obj $gdb_saved_set_unbuffered_mode_obj" + } else { + verbose "gdb_saved_set_unbuffered_obj already compiled" + } + + # Rely on the internal knowledge that the global ctors are ran in + # reverse link order. In that case, we can use ldflags to + # avoid copying the object file to the host multiple + # times. + lappend options "ldflags=$gdb_saved_set_unbuffered_mode_obj" + } + } + set result [target_compile $source $dest $type $options]; # Prune uninteresting compiler (and linker) output. diff --git a/gdb/testsuite/lib/set_unbuffered_mode.c b/gdb/testsuite/lib/set_unbuffered_mode.c new file mode 100644 index 0000000..aa91801 --- /dev/null +++ b/gdb/testsuite/lib/set_unbuffered_mode.c @@ -0,0 +1,28 @@ +/* Copyright (C) 2008 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +/* Force outputs to unbuffered mode. */ + +#include <stdio.h> + +static int __gdb_set_unbuffered_output (void) __attribute__ ((constructor)); +static int +__gdb_set_unbuffered_output (void) +{ + setvbuf (stdout, NULL, _IONBF, BUFSIZ); + setvbuf (stderr, NULL, _IONBF, BUFSIZ); +} |