Bug 31574 - [gdb, 32-bit] FAIL: gdb.ada/verylong.exp: print x
Summary: [gdb, 32-bit] FAIL: gdb.ada/verylong.exp: print x
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: testsuite (show other bugs)
Version: HEAD
: P2 normal
Target Milestone: 15.1
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2024-03-29 07:51 UTC by Tom de Vries
Modified: 2024-04-02 14:16 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
Project(s) to access:
ssh public key:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Tom de Vries 2024-03-29 07:51:23 UTC
In an armhf container on an aarch64-linux host, I run into:
...
PASS: gdb.ada/verylong.exp: compilation prog.adb
FAIL: gdb.ada/verylong.exp: print x
FAIL: gdb.ada/verylong.exp: print x / 2
FAIL: gdb.ada/verylong.exp: print (x / 4) * 2
PASS: gdb.ada/verylong.exp: print x - x
FAIL: gdb.ada/verylong.exp: print x - 99 + 1
FAIL: gdb.ada/verylong.exp: print -x
FAIL: gdb.ada/verylong.exp: print +x
PASS: gdb.ada/verylong.exp: print 170141183460469231731687303715884105727
FAIL: gdb.ada/verylong.exp: print x = 170141183460469231731687303715884105727
...

In more detail:
...
(gdb) print x^M
$1 = 9223372036854775807^M
(gdb) FAIL: gdb.ada/verylong.exp: print x
...

A passing version on x86_64-linux looks like:
...
(gdb) print x^M
$1 = 170141183460469231731687303715884105727^M
(gdb) PASS: gdb.ada/verylong.exp: print x
...
Comment 1 Tom Tromey 2024-03-29 11:53:09 UTC
Maybe Long_Long_Long_Integer is a different size on this arch.
Comment 2 Tom de Vries 2024-03-29 11:57:06 UTC
(In reply to Tom Tromey from comment #1)
> Maybe Long_Long_Long_Integer is a different size on this arch.

Here ( https://gcc.gnu.org/onlinedocs/gnat_rm/Implementation-Defined-Characteristics.html ) I found:
...
‘Long_Long_Long_Integer’:
  128-bit signed (on 64-bit targets) 64-bit signed (on 32-bit targets)
...
Comment 3 Tom de Vries 2024-03-29 12:17:37 UTC
Tentative fix:
...
diff --git a/gdb/testsuite/gdb.ada/verylong.exp b/gdb/testsuite/gdb.ada/verylong.exp
index 28b65a10f64..4a3e0b9eeb2 100644
--- a/gdb/testsuite/gdb.ada/verylong.exp
+++ b/gdb/testsuite/gdb.ada/verylong.exp
@@ -29,15 +29,29 @@ clean_restart ${testfile}
 set bp_location [gdb_get_line_number "START" ${testdir}/prog.adb]
 runto "prog.adb:$bp_location"
 
-gdb_test "print x" " = 170141183460469231731687303715884105727"
-gdb_test "print x / 2" " = 85070591730234615865843651857942052863"
-gdb_test "print (x / 4) * 2" " = 85070591730234615865843651857942052862"
+set lll_int_size 0
+gdb_test_multiple "ptype Long_Long_Long_Integer" "" {
+    -re -wrap "type = <8-byte integer>" {
+       set lll_int_size 8
+       set max 9223372036854775807
+    }
+    -re -wrap "type = <16-byte integer>" {
+       set lll_int_size 16
+       set max 170141183460469231731687303715884105727
+    }
+}
+
+require {expr $lll_int_size == 8 || $lll_int_size == 16}
+
+gdb_test "print x" " = $max"
+gdb_test "print x / 2" " = [expr $max / 2]"
+gdb_test "print (x / 4) * 2" " = [expr ($max / 4) * 2]"
 gdb_test "print x - x" " = 0"
-gdb_test "print x - 99 + 1" " = 170141183460469231731687303715884105629"
-gdb_test "print -x" " = -170141183460469231731687303715884105727"
-gdb_test "print +x" " = 170141183460469231731687303715884105727"
+gdb_test "print x - 99 + 1" " = [expr $max - 99 + 1]"
+gdb_test "print -x" " = -$max"
+gdb_test "print +x" " = $max"
 
 gdb_test "print 170141183460469231731687303715884105727" \
     " = 170141183460469231731687303715884105727"
-gdb_test "print x = 170141183460469231731687303715884105727" \
+gdb_test "print x = $max" \
     " = true"
...
Comment 5 Sourceware Commits 2024-04-02 14:14:31 UTC
The master branch has been updated by Tom de Vries <vries@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d16a53152cc2dfd6e92fdf9ae288ff19dac49dd1

commit d16a53152cc2dfd6e92fdf9ae288ff19dac49dd1
Author: Tom de Vries <tdevries@suse.de>
Date:   Tue Apr 2 16:14:39 2024 +0200

    [gdb/testsuite] Fix gdb.ada/verylong.exp on 32-bit target
    
    In an aarch32-linux chroot on an aarch64-linux system, I run into:
    ...
    (gdb) print x^M
    $1 = 9223372036854775807^M
    (gdb) FAIL: gdb.ada/verylong.exp: print x
    ...
    
    A passing version on aarch64-linux looks like:
    ...
    (gdb) print x^M
    $1 = 170141183460469231731687303715884105727^M
    (gdb) PASS: gdb.ada/verylong.exp: print x
    ...
    
    The difference is caused by the size of the type Long_Long_Long_Integer, which
    is:
    - a 128-bit signed on 64-bit targets, and
    - a 64-bit signed on 32-bit target.
    
    Fix this by detecting the size of the Long_Long_Long_Integer type, and
    handling it.
    
    Tested on aarch64-linux and aarch32-linux.
    
    Approved-By: Tom Tromey <tom@tromey.com>
    
    PR testsuite/31574
    Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31574
    
    [1] https://gcc.gnu.org/onlinedocs/gnat_rm/Implementation-Defined-Characteristics.html
Comment 6 Tom de Vries 2024-04-02 14:16:05 UTC
Fixed.