From: Tom de Vries via Gdb-patches <gdb-patches@sourceware.org>
To: Joel Brobecker <brobecker@adacore.com>
Cc: Tom Tromey <tom@tromey.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH][gdb/testsuite] Fix gdb.ada/literals.exp with aarch64
Date: Thu, 28 Jul 2022 16:21:35 +0200 [thread overview]
Message-ID: <c8e37b4e-c8cd-94c4-cec3-931d937d563c@suse.de> (raw)
In-Reply-To: <YuKKvZ9XRV8gBHoD@adacore.com>
[-- Attachment #1: Type: text/plain, Size: 2128 bytes --]
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 ;)
Thanks,
- Tom
[-- Attachment #2: 0001-gdb-testsuite-Fix-gdb.ada-literals.exp-with-aarch64.patch --]
[-- Type: text/x-patch, Size: 2886 bytes --]
[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"
next prev parent reply other threads:[~2022-07-28 14:21 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 [this message]
2022-07-28 16:28 ` Joel Brobecker via Gdb-patches
2022-07-29 22:24 ` Joel Brobecker via Gdb-patches
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=c8e37b4e-c8cd-94c4-cec3-931d937d563c@suse.de \
--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