diff options
author | Hannes Domani <ssbssa@yahoo.de> | 2024-06-11 20:36:51 +0200 |
---|---|---|
committer | Hannes Domani <ssbssa@yahoo.de> | 2024-07-05 21:43:03 +0200 |
commit | 2de28d2f451e378069662d6a65f4129fd939cff9 (patch) | |
tree | 9853a3319570da99196dbaf496c5a008f3a56ddb /gdb | |
parent | cec2e207d08127bf5458a220f741020aff4148da (diff) | |
download | gdb-2de28d2f451e378069662d6a65f4129fd939cff9.zip gdb-2de28d2f451e378069662d6a65f4129fd939cff9.tar.gz gdb-2de28d2f451e378069662d6a65f4129fd939cff9.tar.bz2 |
Fix 64-bit shifts where long only has 32-bit size
On systems where long has 32-bit size you get these failures:
print 1 << (unsigned long long) 0xffffffffffffffff
Cannot export value 18446744073709551615 as 32-bits unsigned integer (must be between 0 and 4294967295)
(gdb) FAIL: gdb.base/bitshift.exp: lang=c: max-uint64: print 1 << (unsigned long long) 0xffffffffffffffff
print 1 >> (unsigned long long) 0xffffffffffffffff
Cannot export value 18446744073709551615 as 32-bits unsigned integer (must be between 0 and 4294967295)
(gdb) FAIL: gdb.base/bitshift.exp: lang=c: max-uint64: print 1 >> (unsigned long long) 0xffffffffffffffff
print -1 << (unsigned long long) 0xffffffffffffffff
Cannot export value 18446744073709551615 as 32-bits unsigned integer (must be between 0 and 4294967295)
(gdb) FAIL: gdb.base/bitshift.exp: lang=c: max-uint64: print -1 << (unsigned long long) 0xffffffffffffffff
print -1 >> (unsigned long long) 0xffffffffffffffff
Cannot export value 18446744073709551615 as 32-bits unsigned integer (must be between 0 and 4294967295)
(gdb) FAIL: gdb.base/bitshift.exp: lang=c: max-uint64: print -1 >> (unsigned long long) 0xffffffffffffffff
Fixed by changing the number-of-bits variable to ULONGEST.
Approved-By: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/testsuite/gdb.base/bitshift.exp | 12 | ||||
-rw-r--r-- | gdb/valarith.c | 8 |
2 files changed, 16 insertions, 4 deletions
diff --git a/gdb/testsuite/gdb.base/bitshift.exp b/gdb/testsuite/gdb.base/bitshift.exp index d6e2521..cab82e1 100644 --- a/gdb/testsuite/gdb.base/bitshift.exp +++ b/gdb/testsuite/gdb.base/bitshift.exp @@ -363,6 +363,18 @@ proc test_shifts {} { test_rshift_tl $lang \ "print -1 >> [make_uint64 $lang 0xffffffffffffffff]" " = -1" } + + # Check if shift value isn't silently truncated to 32bit. + with_test_prefix "lower-32bit-zero" { + test_lshift_tl $lang \ + "print 1 << [make_uint64 $lang 0x100000000]" " = 0" + test_rshift_tl $lang \ + "print 1 >> [make_uint64 $lang 0x100000000]" " = 0" + test_lshift_tl $lang \ + "print -1 << [make_uint64 $lang 0x100000000]" " = 0" + test_rshift_tl $lang \ + "print -1 >> [make_uint64 $lang 0x100000000]" " = -1" + } } } diff --git a/gdb/valarith.c b/gdb/valarith.c index 6160b0e..a95d108 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -1086,7 +1086,7 @@ type_length_bits (type *type) static bool check_valid_shift_count (enum exp_opcode op, type *result_type, type *shift_count_type, const gdb_mpz &shift_count, - unsigned long &nbits) + ULONGEST &nbits) { if (!shift_count_type->is_unsigned ()) { @@ -1112,7 +1112,7 @@ check_valid_shift_count (enum exp_opcode op, type *result_type, } } - nbits = shift_count.as_integer<unsigned long> (); + nbits = shift_count.as_integer<ULONGEST> (); if (nbits >= type_length_bits (result_type)) { /* In Go, shifting by large amounts is defined. Be silent and @@ -1291,7 +1291,7 @@ scalar_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) case BINOP_LSH: { - unsigned long nbits; + ULONGEST nbits; if (!check_valid_shift_count (op, result_type, type2, v2, nbits)) v = 0; else @@ -1301,7 +1301,7 @@ scalar_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) case BINOP_RSH: { - unsigned long nbits; + ULONGEST nbits; if (!check_valid_shift_count (op, result_type, type2, v2, nbits)) { /* Pretend the too-large shift was decomposed in a |