Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Joel Brobecker via Gdb-patches <gdb-patches@sourceware.org>
To: Tom de Vries <tdevries@suse.de>
Cc: Tom Tromey <tom@tromey.com>,
	gdb-patches@sourceware.org,
	Joel Brobecker <brobecker@adacore.com>
Subject: Re: [PATCH][gdb/testsuite] Fix gdb.ada/literals.exp with aarch64
Date: Fri, 29 Jul 2022 15:24:42 -0700	[thread overview]
Message-ID: <YuReKg5NFKG+5v5D@adacore.com> (raw)
In-Reply-To: <c8e37b4e-c8cd-94c4-cec3-931d937d563c@suse.de>

Hi Tom,

On Thu, Jul 28, 2022 at 04:21:35PM +0200, Tom de Vries wrote:
> On 7/28/22 15:10, Joel Brobecker wrote:
> > > > Thanks for the patch.
> > > > 
> > > > My question is whether it actually makes sense that -1 be
> > > > a valid output for the print command above. I tried the addition
> > > > of ...
> > > > 
> > > >       | /* Note: Interprets ULLONG_MAX as -1.  */
> > > >       | yylval.typed_val.type = type_long_long (par_state);
> > > > 
> > > > ... to a patch of yours:
> > > > 
> > > >       | commit ac3afe36d73c84096685fece885d70b28bc9629f
> > > >       | Author: Tom de Vries <tdevries@suse.de>
> > > >       | Date:   Sat Jun 4 13:17:33 2022 +0200
> > > >       | Subject: [gdb/ada] Fix literal truncation
> > > >       |
> > > >       | Make sure we error out on overflow instead of truncating in all cases.
> > > >       |
> > > >       | Tested on x86_64-linux, with a build with --enable-targets=all.
> > > > 
> > > > Do you remember why we do this? Intuitively, you'd expect that GDB
> > > > would behave the same regardless of whether it selects type "long"
> > > > or "long long" for its processing, as long as both types are 64-bit.
> > > > 
> > > 
> > > I have no idea.  AFAICT it's been in gdb since the "Add base ada language
> > > files" commit from 2002 that we avoid "unsigned long long".
> > > 
> > > I've taken care to preserve the behaviour in the commit you refer to (and
> > > this patch), since I don't have the knowledge to decide that things should
> > > be different.
> > > 
> > > > With the above, we can take this patch as an intermediate remedy,
> > > > but I think we might need to dig deeper into why we use a signed
> > > > type in the case of long long but not long, particularly when both
> > > > types are the same size.
> > > > 
> > > > WDYT?
> > > > 
> > > 
> > > I'd be happy to write a patch to change the behaviour of gdb.  But somebody
> > > knowledgeable in Ada needs to specify what that needs to be.
> > 
> > We're really outside of the Ada language. Would you mind checking
> > what the C language does? I think it would make sense to do the same,
> > here. E.g., on x86_64-linux, I get:
> > 
> >      (gdb) p 0xffffffffffffffff
> >      $1 = 18446744073709551615
> > 
> 
> Ack, that's what the C language does.
> 
> This patch changes gdb to print 18446744073709551615 for ada as well.
> 
> So, pick your favorite patch ;)

TomT kindly tested your patch on a number of platforms for us,
and everything looked good on those. I propose we go with your
second patch which changes the behavior to match what we do
in C (I looked at the patch, and it looks good to me, so approved).

Thank you!

> 
> Thanks,
> - Tom

> [gdb/testsuite] Fix gdb.ada/literals.exp with aarch64
> 
> On aarch64-linux, I run into:
> ...
> (gdb) print 16#ffffffffffffffff#^M
> $7 = 18446744073709551615^M
> (gdb) FAIL: gdb.ada/literals.exp: print 16#ffffffffffffffff#
> ...
> while on x86_64-linux instead, I get:
> ...
> (gdb) print 16#ffffffffffffffff#^M
> $7 = -1^M
> (gdb) PASS: gdb.ada/literals.exp: print 16#ffffffffffffffff#
> ...
> 
> We can easily reproduce this on x86_64-linux using:
> ...
> $ gdb -q -batch -ex "set lang ada" -ex "set arch i386" \
>   -ex "print 16#ffffffffffffffff#"
> $1 = -1
> $ gdb -q -batch -ex "set lang ada" -ex "set arch aarch64" \
>   -ex "print 16#ffffffffffffffff#"
> $1 = 18446744073709551615
> ...
> 
> With i386, we have:
> ...
> (gdb) p int_bits
> $3 = 32
> (gdb) p long_bits
> $4 = 32
> (gdb) p long_long_bits
> $5 = 64
> ...
> and so in processInt we hit the fits-in-unsigned-long-long case where we use
> as type long long:
> ...
>       /* Note: Interprets ULLONG_MAX as -1.  */
>       yylval.typed_val.type = type_long_long (par_state);
> ...
> 
> With aarch64, we have instead:
> ...
> (gdb) p int_bits
> $1 = 32
> (gdb) p long_bits
> $2 = 64
> (gdb) p long_long_bits
> $3 = 64
> ...
> and so in processInt we hit the fits-in-unsigned-long case where we use
> as type unsigned long:
> ...
>       yylval.typed_val.type
>         = builtin_type (par_state->gdbarch ())->builtin_unsigned_long;
> ...
> 
> It's not clear why for ada we're using long long for the
> fits-in-unsigned-long-long case.
> 
> Fix this by using unsigned long long for the fits-in-unsigned-long-long case,
> meaning the new reference output is 18446744073709551615 instead of -1.
> 
> Tested on x86_64-linux.
> 
> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29416
> 
> ---
>  gdb/ada-lex.l                      | 4 ++--
>  gdb/testsuite/gdb.ada/literals.exp | 2 +-
>  2 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/gdb/ada-lex.l b/gdb/ada-lex.l
> index 002eb811e41..ed88d502e9f 100644
> --- a/gdb/ada-lex.l
> +++ b/gdb/ada-lex.l
> @@ -498,8 +498,8 @@ processInt (struct parser_state *par_state, const char *base0,
>      yylval.typed_val.type = type_long_long (par_state);
>    else if (fits_in_type (1, value, long_long_bits, false))
>      {
> -      /* Note: Interprets ULLONG_MAX as -1.  */
> -      yylval.typed_val.type = type_long_long (par_state);
> +      yylval.typed_val.type
> +	= builtin_type (par_state->gdbarch ())->builtin_unsigned_long_long;
>        /* See unsigned long case above.  */
>        if (value & LONGEST_SIGN)
>  	yylval.typed_val.val =
> diff --git a/gdb/testsuite/gdb.ada/literals.exp b/gdb/testsuite/gdb.ada/literals.exp
> index a6ac89b540f..6badc857292 100644
> --- a/gdb/testsuite/gdb.ada/literals.exp
> +++ b/gdb/testsuite/gdb.ada/literals.exp
> @@ -36,4 +36,4 @@ gdb_test "print 16#f#e1" " = 240"
>  gdb_test "print 16#1#e10" " = 1099511627776"
>  
>  gdb_test "print/x 16#7fffffffffffffff#" " = 0x7fffffffffffffff"
> -gdb_test "print 16#ffffffffffffffff#" " = -1"
> +gdb_test "print 16#ffffffffffffffff#" " = 18446744073709551615"


-- 
Joel

      parent reply	other threads:[~2022-07-29 22:25 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-27 10:34 Tom de Vries via Gdb-patches
2022-07-27 13:31 ` Luis Machado via Gdb-patches
2022-07-27 17:06 ` Joel Brobecker via Gdb-patches
2022-07-27 21:03   ` Tom de Vries via Gdb-patches
2022-07-28 13:10     ` Joel Brobecker via Gdb-patches
2022-07-28 14:21       ` Tom de Vries via Gdb-patches
2022-07-28 16:28         ` Joel Brobecker via Gdb-patches
2022-07-29 22:24         ` Joel Brobecker via Gdb-patches [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YuReKg5NFKG+5v5D@adacore.com \
    --to=gdb-patches@sourceware.org \
    --cc=brobecker@adacore.com \
    --cc=tdevries@suse.de \
    --cc=tom@tromey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox