sve: Fix return command when using V registers in a SVE-enabled target
authorLuis Machado <luis.machado@arm.com>
Thu, 30 Mar 2023 14:16:53 +0000 (15:16 +0100)
committerLuis Machado <luis.machado@arm.com>
Wed, 4 Oct 2023 15:23:39 +0000 (16:23 +0100)
commit89c4ee8398e3915c6685bb74057eb5644cf36959
tree8715b6a65694a141e735c41d28b73b378f122c00
parent78d6a7e98ccf5f788f23d49cbd95c45da7ee4660
sve: Fix return command when using V registers in a SVE-enabled target

In a target without SVE support, the V registers have a size of 16 bytes,
otherwise they may have a size bigger than 16 bytes (depending on the current
vector length for the Z registers, as they overlap the V registers).

In aarch64-tdep.c:aarch64_store_return_value, the code is laid
out in a way that allocates the buffer with the size of the register, but
only updates the amount of bytes for the particular type we're returning.

This may cause a situation where we have a register size of 32 bytes but
are returning a floating point value of 8 bytes.  The temporary buffer
will therefore have 32 bytes, but we'll only update 8 bytes of it.

When we write the entire register back, it will have potentially 24 bytes
of garbage in it.

Fix this by first reading the original contents of the register and then
overriding only the bytes that we need for the return value.

Tested on aarch64-linux Ubuntu 22.04/20.04.

Reviewed-by: Thiago Jung Bauermann <thiago.bauermann@linaro.org>
gdb/aarch64-tdep.c