diff options
author | Tom Tromey <tromey@adacore.com> | 2023-09-20 11:29:53 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2023-10-30 07:45:39 -0600 |
commit | a23cf0c2ece4812232cf9434bdc77fbb70ae3f6b (patch) | |
tree | 70069e09a1eb494e393d281563ee6d4cd2b16103 | |
parent | 47231c30a0475092cd452d6062ed06ee904e28f8 (diff) | |
download | gdb-a23cf0c2ece4812232cf9434bdc77fbb70ae3f6b.zip gdb-a23cf0c2ece4812232cf9434bdc77fbb70ae3f6b.tar.gz gdb-a23cf0c2ece4812232cf9434bdc77fbb70ae3f6b.tar.bz2 |
Fix fixed-point "return" on ARM
On a big-endian ARM machine, the "return" command resulted in the
wrong value being returned when the function had a fixed-point return
type. This patch fixes the problem by unpacking and repacking the
fixed-point type appropriately.
Approved-By: Luis Machado <luis.machado@arm.com>
-rw-r--r-- | gdb/arm-tdep.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 62412d9..a9c43b2 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -9170,16 +9170,28 @@ arm_store_return_value (struct type *type, struct regcache *regs, || type->code () == TYPE_CODE_BOOL || type->code () == TYPE_CODE_PTR || TYPE_IS_REFERENCE (type) - || type->code () == TYPE_CODE_ENUM) + || type->code () == TYPE_CODE_ENUM + || is_fixed_point_type (type)) { if (type->length () <= 4) { /* Values of one word or less are zero/sign-extended and returned in r0. */ bfd_byte tmpbuf[ARM_INT_REGISTER_SIZE]; - LONGEST val = unpack_long (type, valbuf); - store_signed_integer (tmpbuf, ARM_INT_REGISTER_SIZE, byte_order, val); + if (is_fixed_point_type (type)) + { + gdb_mpz unscaled; + unscaled.read (gdb::make_array_view (valbuf, type->length ()), + byte_order, type->is_unsigned ()); + unscaled.write (gdb::make_array_view (tmpbuf, sizeof (tmpbuf)), + byte_order, type->is_unsigned ()); + } + else + { + LONGEST val = unpack_long (type, valbuf); + store_signed_integer (tmpbuf, ARM_INT_REGISTER_SIZE, byte_order, val); + } regs->cooked_write (ARM_A1_REGNUM, tmpbuf); } else |