Re: [patch] Fix `return' of long/long-long results with no debuginfo

Pedro Alves
2009-03-18T04:20:49Z

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;
+}