aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/lib
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2008-06-27 16:42:19 +0000
committerPedro Alves <palves@redhat.com>2008-06-27 16:42:19 +0000
commitf747e0ce0af7f5429fead10867abeb97ac1e6dde (patch)
tree561535bc1b945dac565b4055a6f6ff7dff482fd5 /gdb/testsuite/lib
parent7ccc1c74d815b3b3a8bae8afb5f4eacb438b29c5 (diff)
downloadgdb-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.exp45
-rw-r--r--gdb/testsuite/lib/set_unbuffered_mode.c28
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);
+}