[11/11] Add SH_MAX_REGISTER_SIZE and SH64_MAX_REGISTER_SIZE
Commit Message
Max size set to 96bits, which I determined using the various sh*register_type() functions.
Tested on a --enable-targets=all build using make check with board files
unix and native-gdbserver.
I do not have a SH machine to test on.
Ok to commit?
Alan.
2017-04-04 Alan Hayward <alan.hayward@arm.com>
* sh-tdep.c (sh_pseudo_register_read): Use SH_MAX_REGISTER_SIZE.
(sh_pseudo_register_write): Likewise.
* sh64-tdep.c (SH_MAX_REGISTER_SIZE): Add.
(sh64_pseudo_register_read): Use SH64_MAX_REGISTER_SIZE..
(sh64_pseudo_register_write): Likewise.
* sh-tdep.h (SH64_MAX_REGISTER_SIZE): Add.
Comments
Alan Hayward <Alan.Hayward@arm.com> writes:
> diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c
> index 9b3692dc0c32ffcb53d99f0fc095303d2c221fcb..7e56864202fe9321edb7561c721ef912b3a4f8c5 100644
> --- a/gdb/sh-tdep.c
> +++ b/gdb/sh-tdep.c
> @@ -1648,7 +1648,7 @@ sh_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
> int reg_nr, gdb_byte *buffer)
> {
> int base_regnum;
> - gdb_byte temp_buffer[MAX_REGISTER_SIZE];
> + gdb_byte temp_buffer[SH_MAX_REGISTER_SIZE];
> enum register_status status;
>
> if (reg_nr == PSEUDO_BANK_REGNUM)
temp_buffer is used for double float register, which is from two fp
registers,
else if (reg_nr >= DR0_REGNUM && reg_nr <= DR_LAST_REGNUM)
{
base_regnum = dr_reg_base_num (gdbarch, reg_nr);
/* Build the value in the provided buffer. */
/* Read the real regs for which this one is an alias. */
status = pseudo_register_read_portions (gdbarch, regcache,
2, base_regnum, temp_buffer);
if (status == REG_VALID)
{
/* We must pay attention to the endiannes. */
sh_register_convert_to_virtual (gdbarch, reg_nr,
register_type (gdbarch, reg_nr),
temp_buffer, buffer);
}
Can you move "temp_buffer" into this block, and define it
gdb_byte temp_buffer[4 * 2] or temp_buffer[SH_FLOAT_REGISTER_SIZE * 2];
@@ -82,6 +82,9 @@ enum
FV_LAST_REGNUM = 79
};
+/* Big enough to hold the size of the largest register in bytes. */
+#define SH_MAX_REGISTER_SIZE 12
+
/* This structure describes a register in a core-file. */
struct sh_corefile_regmap
{
@@ -1648,7 +1648,7 @@ sh_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
int reg_nr, gdb_byte *buffer)
{
int base_regnum;
- gdb_byte temp_buffer[MAX_REGISTER_SIZE];
+ gdb_byte temp_buffer[SH_MAX_REGISTER_SIZE];
enum register_status status;
if (reg_nr == PSEUDO_BANK_REGNUM)
@@ -1687,7 +1687,7 @@ sh_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
int reg_nr, const gdb_byte *buffer)
{
int base_regnum, portion;
- gdb_byte temp_buffer[MAX_REGISTER_SIZE];
+ gdb_byte temp_buffer[SH_MAX_REGISTER_SIZE];
if (reg_nr == PSEUDO_BANK_REGNUM)
{
@@ -122,6 +122,9 @@ enum
FP_LAST_REGNUM = SIM_SH64_FR0_REGNUM + SIM_SH64_NR_FP_REGS - 1
};
+/* Big enough to hold the size of the largest register in bytes. */
+#define SH64_MAX_REGISTER_SIZE 12
+
static const char *
sh64_register_name (struct gdbarch *gdbarch, int reg_nr)
{
@@ -1528,7 +1531,7 @@ sh64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
int base_regnum;
int offset = 0;
- gdb_byte temp_buffer[MAX_REGISTER_SIZE];
+ gdb_byte temp_buffer[SH64_MAX_REGISTER_SIZE];
enum register_status status;
if (reg_nr >= DR0_REGNUM
@@ -1704,7 +1707,7 @@ sh64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
int base_regnum, portion;
int offset;
- gdb_byte temp_buffer[MAX_REGISTER_SIZE];
+ gdb_byte temp_buffer[SH64_MAX_REGISTER_SIZE];
if (reg_nr >= DR0_REGNUM
&& reg_nr <= DR_LAST_REGNUM)