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

Pierre Muller
2009-02-12T14:36:35Z

Concerning the test,
wouldn't it be better to set the return value to
another value than the one that is normally
returned by the function?
This would allow to FAIL on targets
where the substitution fails and the program
is just continued...

Just use some other value in func definition,
for instance
+static TYPE
+func (void)+{
+ return (TYPE) 31;
+}

I checked your patch, because I was worried
about the weird syntax
and thought that this would fail
on my old cygwin dejagnu, but it does
give me 10 PASS, even with the above modification.

Pierre Muller
Pascal language support maintainer for GDB

> -----Message d'origine-----
> De : gdb-patches-owner@sourceware.org [mailto:gdb-patches-
> owner@sourceware.org] De la part de Jan Kratochvil
> Envoyé : Thursday, February 12, 2009 10:42 AM
> À : Mark Kettenis
> Cc : drow@false.org; gdb-patches@sourceware.org
> Objet : Re: [patch] Fix `return' of long/long-long results with no
> debuginfo
>
> On Wed, 11 Feb 2009 23:44:21 +0100, Mark Kettenis wrote:
> > Thinking a bit more of this now, things all depend on the calling
> > convention. I'm not convinced casting to `long long' is safe in all
> > cases, especially on 32-bit big-endian machines. It really might do
> > the wrong thing there, exposing garbage or the wrong 32 bits of the
> > 64-bit value.
> >
> > The 'int' case is really special in a sense, very much because of the
> > K&R heritage. It has to work for all types that are sizeof(int) or
> > smaller.
>
> OK to check-in this patch?
>
> Regression-tested on x86_64-unknown-linux-gnu.
>
>
> Thanks,
> Jan
>
>
> gdb/
> 2009-02-12 Mark Kettenis <kettenis@gnu.org>
>
> * stack.c (return_command): Returned type for functions with no
> debug
> info is now the type of user specified expression.
>
> gdb/testsuite/
> 2009-02-12 Jan Kratochvil <jan.kratochvil@redhat.com>
>
> * gdb.base/return-nodebug.exp, gdb.base/return-nodebug.c: New.
>
> --- gdb/stack.c 11 Feb 2009 16:07:28 -0000 1.185
> +++ gdb/stack.c 12 Feb 2009 09:24:18 -0000
> @@ -1806,6 +1806,8 @@ return_command (char *retval_exp, int fr
> the cast fail, this call throws an error. */
> if (thisfun != NULL)
> return_type = TYPE_TARGET_TYPE (SYMBOL_TYPE (thisfun));
> + else
> + return_type = value_type (return_value);
> if (return_type == NULL)
> return_type = builtin_type (get_frame_arch (thisframe))-
> >builtin_int;
> CHECK_TYPEDEF (return_type);
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ gdb/testsuite/gdb.base/return-nodebug.c 12 Feb 2009 09:24:18 -
> 0000
> @@ -0,0 +1,40 @@
> +/* 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/>. */
> +
> +#include <stdio.h>
> +
> +static TYPE
> +func (void)
> +{
> + return (TYPE) -1;
> +}
> +
> +static void
> +marker (void)
> +{
> +}
> +
> +int
> +main (void)
> +{
> + printf ("result=" FORMAT "\n", CAST func ());
> +
> + /* Cannot `next' with no debug info. */
> + marker ();
> +
> + return 0;
> +}
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ gdb/testsuite/gdb.base/return-nodebug.exp 12 Feb 2009 09:24:18 -
> 0000
> @@ -0,0 +1,55 @@
> +# Copyright (C) 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/>.
> +
> +proc do_test {type} {
> + set typenospace [string map {{ } -} $type]
> +
> + global pf_prefix
> + set old_prefix $pf_prefix
> + lappend pf_prefix "$typenospace:"
> +
> + if {[runto "func"]} {
> + # Test return from a function with no debug info (symbol; still
> it may
> + # have a minimal-symbol) if it does not crash.
> + # Cast of the result to the proper width must be done
> explicitely.
> + gdb_test "return ($type) -1" "#0 .* main \\(.*" \
> + "return from function with no debug info" \
> + "Make selected stack frame return now\\? \\(y or n\\) "
> "y"
> +
> + # 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"
> + }
> +
> + set pf_prefix $old_prefix
> +}
> +
> +foreach case {{{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]
> +
> + 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
> + }
> +}