diff options
author | Alan Hayward <alan.hayward@arm.com> | 2018-05-11 11:52:53 +0100 |
---|---|---|
committer | Simon Marchi <simon.marchi@ericsson.com> | 2018-05-31 16:09:22 -0400 |
commit | e7ae421e9dc3b412c6ee054fb8ac71ab9a2c7899 (patch) | |
tree | 414e1bed643a6911e4315b1a598081673f192472 | |
parent | 128c47da0e0766c3a1f21d0036c033c49620dd9c (diff) | |
download | gdb-e7ae421e9dc3b412c6ee054fb8ac71ab9a2c7899.zip gdb-e7ae421e9dc3b412c6ee054fb8ac71ab9a2c7899.tar.gz gdb-e7ae421e9dc3b412c6ee054fb8ac71ab9a2c7899.tar.bz2 |
Add aarch64 psuedo help functions
Reduce code copy/paste by adding two helper functions for
aarch64_pseudo_read_value and aarch64_pseudo_write
The patch does not change any functionality.
2018-05-11 Alan Hayward <alan.hayward@arm.com>
* aarch64-tdep.c (aarch64_pseudo_read_value_2): New helper func.
(aarch64_pseudo_write_2): Likewise.
(aarch64_pseudo_read_value): Use helper.
(aarch64_pseudo_write): Likewise.
-rw-r--r-- | gdb/aarch64-tdep.c | 173 |
1 files changed, 54 insertions, 119 deletions
diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index afd5be7..2779fe4 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -2247,109 +2247,67 @@ aarch64_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum, return group == all_reggroup; } +/* Inner version of aarch64_pseudo_read_value. */ + +static struct value * +aarch64_pseudo_read_value_2 (readable_regcache *regcache, int regnum_offset, + int regsize, struct value *result_value) +{ + gdb_byte reg_buf[V_REGISTER_SIZE]; + unsigned v_regnum = AARCH64_V0_REGNUM + regnum_offset; + + if (regcache->raw_read (v_regnum, reg_buf) != REG_VALID) + mark_value_bytes_unavailable (result_value, 0, + TYPE_LENGTH (value_type (result_value))); + else + memcpy (value_contents_raw (result_value), reg_buf, regsize); + return result_value; + } + /* Implement the "pseudo_register_read_value" gdbarch method. */ static struct value * -aarch64_pseudo_read_value (struct gdbarch *gdbarch, - readable_regcache *regcache, +aarch64_pseudo_read_value (struct gdbarch *gdbarch, readable_regcache *regcache, int regnum) { - gdb_byte reg_buf[V_REGISTER_SIZE]; - struct value *result_value; - gdb_byte *buf; + struct value *result_value = allocate_value (register_type (gdbarch, regnum)); - result_value = allocate_value (register_type (gdbarch, regnum)); VALUE_LVAL (result_value) = lval_register; VALUE_REGNUM (result_value) = regnum; - buf = value_contents_raw (result_value); regnum -= gdbarch_num_regs (gdbarch); if (regnum >= AARCH64_Q0_REGNUM && regnum < AARCH64_Q0_REGNUM + 32) - { - enum register_status status; - unsigned v_regnum; - - v_regnum = AARCH64_V0_REGNUM + regnum - AARCH64_Q0_REGNUM; - status = regcache->raw_read (v_regnum, reg_buf); - if (status != REG_VALID) - mark_value_bytes_unavailable (result_value, 0, - TYPE_LENGTH (value_type (result_value))); - else - memcpy (buf, reg_buf, Q_REGISTER_SIZE); - return result_value; - } + return aarch64_pseudo_read_value_2 (regcache, regnum - AARCH64_Q0_REGNUM, + Q_REGISTER_SIZE, result_value); if (regnum >= AARCH64_D0_REGNUM && regnum < AARCH64_D0_REGNUM + 32) - { - enum register_status status; - unsigned v_regnum; - - v_regnum = AARCH64_V0_REGNUM + regnum - AARCH64_D0_REGNUM; - status = regcache->raw_read (v_regnum, reg_buf); - if (status != REG_VALID) - mark_value_bytes_unavailable (result_value, 0, - TYPE_LENGTH (value_type (result_value))); - else - memcpy (buf, reg_buf, D_REGISTER_SIZE); - return result_value; - } + return aarch64_pseudo_read_value_2 (regcache, regnum - AARCH64_D0_REGNUM, + D_REGISTER_SIZE, result_value); if (regnum >= AARCH64_S0_REGNUM && regnum < AARCH64_S0_REGNUM + 32) - { - enum register_status status; - unsigned v_regnum; - - v_regnum = AARCH64_V0_REGNUM + regnum - AARCH64_S0_REGNUM; - status = regcache->raw_read (v_regnum, reg_buf); - if (status != REG_VALID) - mark_value_bytes_unavailable (result_value, 0, - TYPE_LENGTH (value_type (result_value))); - else - memcpy (buf, reg_buf, S_REGISTER_SIZE); - return result_value; - } + return aarch64_pseudo_read_value_2 (regcache, regnum - AARCH64_S0_REGNUM, + S_REGISTER_SIZE, result_value); if (regnum >= AARCH64_H0_REGNUM && regnum < AARCH64_H0_REGNUM + 32) - { - enum register_status status; - unsigned v_regnum; - - v_regnum = AARCH64_V0_REGNUM + regnum - AARCH64_H0_REGNUM; - status = regcache->raw_read (v_regnum, reg_buf); - if (status != REG_VALID) - mark_value_bytes_unavailable (result_value, 0, - TYPE_LENGTH (value_type (result_value))); - else - memcpy (buf, reg_buf, H_REGISTER_SIZE); - return result_value; - } + return aarch64_pseudo_read_value_2 (regcache, regnum - AARCH64_H0_REGNUM, + H_REGISTER_SIZE, result_value); if (regnum >= AARCH64_B0_REGNUM && regnum < AARCH64_B0_REGNUM + 32) - { - enum register_status status; - unsigned v_regnum; - - v_regnum = AARCH64_V0_REGNUM + regnum - AARCH64_B0_REGNUM; - status = regcache->raw_read (v_regnum, reg_buf); - if (status != REG_VALID) - mark_value_bytes_unavailable (result_value, 0, - TYPE_LENGTH (value_type (result_value))); - else - memcpy (buf, reg_buf, B_REGISTER_SIZE); - return result_value; - } + return aarch64_pseudo_read_value_2 (regcache, regnum - AARCH64_B0_REGNUM, + B_REGISTER_SIZE, result_value); gdb_assert_not_reached ("regnum out of bound"); } -/* Implement the "pseudo_register_write" gdbarch method. */ +/* Inner version of aarch64_pseudo_write. */ static void -aarch64_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache, - int regnum, const gdb_byte *buf) +aarch64_pseudo_write_2 (struct regcache *regcache, int regnum_offset, + int regsize, const gdb_byte *buf) { gdb_byte reg_buf[V_REGISTER_SIZE]; + unsigned v_regnum = AARCH64_V0_REGNUM + regnum_offset; /* Ensure the register buffer is zero, we want gdb writes of the various 'scalar' pseudo registers to behavior like architectural @@ -2357,61 +2315,38 @@ aarch64_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache, zero. */ memset (reg_buf, 0, sizeof (reg_buf)); + memcpy (reg_buf, buf, regsize); + regcache->raw_write (v_regnum, reg_buf); +} + +/* Implement the "pseudo_register_write" gdbarch method. */ + +static void +aarch64_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache, + int regnum, const gdb_byte *buf) +{ + regnum -= gdbarch_num_regs (gdbarch); if (regnum >= AARCH64_Q0_REGNUM && regnum < AARCH64_Q0_REGNUM + 32) - { - /* pseudo Q registers */ - unsigned v_regnum; - - v_regnum = AARCH64_V0_REGNUM + regnum - AARCH64_Q0_REGNUM; - memcpy (reg_buf, buf, Q_REGISTER_SIZE); - regcache->raw_write (v_regnum, reg_buf); - return; - } + return aarch64_pseudo_write_2 (regcache, regnum - AARCH64_Q0_REGNUM, + Q_REGISTER_SIZE, buf); if (regnum >= AARCH64_D0_REGNUM && regnum < AARCH64_D0_REGNUM + 32) - { - /* pseudo D registers */ - unsigned v_regnum; - - v_regnum = AARCH64_V0_REGNUM + regnum - AARCH64_D0_REGNUM; - memcpy (reg_buf, buf, D_REGISTER_SIZE); - regcache->raw_write (v_regnum, reg_buf); - return; - } + return aarch64_pseudo_write_2 (regcache, regnum - AARCH64_D0_REGNUM, + D_REGISTER_SIZE, buf); if (regnum >= AARCH64_S0_REGNUM && regnum < AARCH64_S0_REGNUM + 32) - { - unsigned v_regnum; - - v_regnum = AARCH64_V0_REGNUM + regnum - AARCH64_S0_REGNUM; - memcpy (reg_buf, buf, S_REGISTER_SIZE); - regcache->raw_write (v_regnum, reg_buf); - return; - } + return aarch64_pseudo_write_2 (regcache, regnum - AARCH64_S0_REGNUM, + S_REGISTER_SIZE, buf); if (regnum >= AARCH64_H0_REGNUM && regnum < AARCH64_H0_REGNUM + 32) - { - /* pseudo H registers */ - unsigned v_regnum; - - v_regnum = AARCH64_V0_REGNUM + regnum - AARCH64_H0_REGNUM; - memcpy (reg_buf, buf, H_REGISTER_SIZE); - regcache->raw_write (v_regnum, reg_buf); - return; - } + return aarch64_pseudo_write_2 (regcache, regnum - AARCH64_H0_REGNUM, + H_REGISTER_SIZE, buf); if (regnum >= AARCH64_B0_REGNUM && regnum < AARCH64_B0_REGNUM + 32) - { - /* pseudo B registers */ - unsigned v_regnum; - - v_regnum = AARCH64_V0_REGNUM + regnum - AARCH64_B0_REGNUM; - memcpy (reg_buf, buf, B_REGISTER_SIZE); - regcache->raw_write (v_regnum, reg_buf); - return; - } + return aarch64_pseudo_write_2 (regcache, regnum - AARCH64_B0_REGNUM, + B_REGISTER_SIZE, buf); gdb_assert_not_reached ("regnum out of bound"); } |