This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [patch] Fix `return' of long/long-long results with no debuginfo
- From: Pedro Alves <pedro at codesourcery dot com>
- To: gdb-patches at sourceware dot org
- Cc: Jan Kratochvil <jan dot kratochvil at redhat dot com>, Eli Zaretskii <eliz at gnu dot org>, Joel Brobecker <brobecker at adacore dot com>, tromey at redhat dot com, mark dot kettenis at xs4all dot nl, drow at false dot org
- Date: Wed, 18 Mar 2009 04:20:37 +0000
- Subject: Re: [patch] Fix `return' of long/long-long results with no debuginfo
- References: <m3ljrkg703.fsf@fleche.redhat.com> <uwsarrc2g.fsf@gnu.org> <20090315092137.GA14577@host0.dyn.jankratochvil.net>
Unfortunatelly, this test is failing against gdbserver:
Running ../../../src/gdb/testsuite/gdb.base/return-nodebug.exp ...
FAIL: gdb.base/return-nodebug.exp: signed-char: full width of the returned result
FAIL: gdb.base/return-nodebug.exp: short: full width of the returned result
FAIL: gdb.base/return-nodebug.exp: int: full width of the returned result
FAIL: gdb.base/return-nodebug.exp: long: full width of the returned result
FAIL: gdb.base/return-nodebug.exp: long-long: full width of the returned result
The issue is that it relies on parsing the output of printf, which
doesn't work against remote targets that don't implement some kind
of semi-hosting io, like gdbserver.
( as a side, but related note, tests that need to rely on inferior output,
should be guarded with "if [target_info exists gdb,noinferiorio]" )
What do you think we rewrite test to not rely on printf at all, like below?
This passes for me on native x86_64-linux, and against x86_64-linux gdbserver.
--
Pedro Alves
2009-03-18 Pedro Alves <pedro@codesourcery.com>
* return-nodebug.c: Don't include stdio.h.
(init): Delete.
(func): Delete definition and provide extern declaration.
(t): New.
(main): Don't call printf. Call func and store its result in t.
* return-nodebug1.c: New.
* return-nodebug.exp: Don't expect stdio output. Instead, print
the global variable t. Drop printf formatters and cast types from
foreach loop. Don't use prepare_for_testing. Compile
return-nodebug.c and return-nodebug1.c in separate steps. Don't
define FORMAT or CAST.
---
gdb/testsuite/gdb.base/return-nodebug.c | 22 ++-------------
gdb/testsuite/gdb.base/return-nodebug.exp | 44 ++++++++++++++++++++----------
gdb/testsuite/gdb.base/return-nodebug1.c | 22 +++++++++++++++
3 files changed, 56 insertions(+), 32 deletions(-)
Index: src/gdb/testsuite/gdb.base/return-nodebug.c
===================================================================
--- src.orig/gdb/testsuite/gdb.base/return-nodebug.c 2009-03-18 03:11:16.000000000 +0000
+++ src/gdb/testsuite/gdb.base/return-nodebug.c 2009-03-18 03:49:06.000000000 +0000
@@ -15,34 +15,20 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-#include <stdio.h>
-
-static TYPE
-init (void)
-{
- return 0;
-}
-
-static TYPE
-func (void)
-{
- return 31;
-}
+extern TYPE func (void);
static void
marker (void)
{
}
+TYPE t;
+
int
main (void)
{
- /* Preinitialize registers to 0 to avoid false PASS by leftover garbage. */
- init ();
-
- printf ("result=" FORMAT "\n", CAST func ());
+ t = func ();
- /* Cannot `next' with no debug info. */
marker ();
return 0;
Index: src/gdb/testsuite/gdb.base/return-nodebug.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/return-nodebug.exp 2009-03-18 02:58:19.000000000 +0000
+++ src/gdb/testsuite/gdb.base/return-nodebug.exp 2009-03-18 03:52:58.000000000 +0000
@@ -34,28 +34,44 @@ proc do_test {type} {
"return from function with no debug info with a cast" \
"Make selected stack frame return now\\? \\(y or n\\) " "y"
+ gdb_test "advance marker" "marker \\(.*" \
+ "advance to marker"
+
# And if it returned the full width of the result.
- gdb_test "adv marker" "\r\nresult=-1\r\n.* in marker \\(.*" \
- "full width of the returned result"
+ gdb_test "print /d t" " = -1"
}
set pf_prefix $old_prefix
}
-foreach case {{{signed char} %d (int)} \
- {{short} %d (int)} \
- {{int} %d} \
- {{long} %ld} \
- {{long long} %lld}} {
- set type [lindex $case 0]
- set format [lindex $case 1]
- set cast [lindex $case 2]
-
+foreach type {{signed char} {short} {int} {long} {long long}} {
set typeesc [string map {{ } {\ }} $type]
set typenospace [string map {{ } -} $type]
- if {[prepare_for_testing return-nodebug.exp "return-nodebug-$typenospace" "return-nodebug.c" \
- [list "additional_flags=-DFORMAT=\"$format\" -DTYPE=$typeesc -DCAST=$cast"]] == 0} {
- do_test $type
+ set testfile "return-nodebug"
+ set srcfile ${testfile}.c
+ set srcfile1 ${testfile}1.c
+ set binfile ${objdir}/${subdir}/${testfile}-${typenospace}
+
+ set additional_flags "additional_flags=-DTYPE=$typeesc"
+
+ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}-${typenospace}0.o" object [list debug $additional_flags]] != "" } {
+ continue
+ }
+
+ # This one is compiled without debug info.
+ if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile}-${typenospace}1.o" object [list $additional_flags]] != "" } {
+ continue
+ }
+
+ if { [gdb_compile "${binfile}0.o ${binfile}1.o" "${binfile}" executable {debug}] != "" } {
+ continue
}
+
+ gdb_exit
+ gdb_start
+ gdb_reinitialize_dir $srcdir/$subdir
+ gdb_load ${binfile}
+
+ do_test $type
}
Index: src/gdb/testsuite/gdb.base/return-nodebug1.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ src/gdb/testsuite/gdb.base/return-nodebug1.c 2009-03-18 03:12:13.000000000 +0000
@@ -0,0 +1,22 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2009 Free Software Foundation, Inc.
+
+ 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/>. */
+
+TYPE
+func (void)
+{
+ return 31;
+}