From a23cf0c2ece4812232cf9434bdc77fbb70ae3f6b Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 20 Sep 2023 11:29:53 -0600 Subject: [PATCH] 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 --- gdb/arm-tdep.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 62412d92f85..a9c43b27265 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 -- 2.30.2