Map registers to remote numbers when encoding an ax_reg or ax_reg_mask operation
When encoding the agent expression operation ax_reg or ax_reg_mask, the register number used is internal to GDB. However GDBServer expects a tdesc based number. This usually does not cause a problem since at the moment, for raw registers GDBServer R trace action ignores the register mask and just collects all registers. It can be a problem, however with pseudo registers on some platforms if the tdesc number doesn't match the GDB internal register number. This is the case with ARM, the upcoming ARM tracepoint support, fails these test cases without this patch: gdb.trace/collection.exp: collect register locals collectively:* GDBSever would exit with: unhandled register size Since the register number is not mapped. This patch fixes these issues by calling gdbarch_remote_register_number before encoding the register number in the ax_reg or ax_reg_mask operation. Tested on x86 native-gdbserver no regressions observed. gdb/ChangeLog: * ax-general.c (ax_reg): Call gdbarch_remote_register_number. (ax_reg_mask): Likewise.
This commit is contained in:
parent
ef77d6af7c
commit
1eb7c2d886
2 changed files with 13 additions and 1 deletions
|
@ -1,3 +1,8 @@
|
|||
2016-02-25 Antoine Tremblay <antoine.tremblay@ericsson.com>
|
||||
|
||||
* ax-general.c (ax_reg): Call gdbarch_remote_register_number.
|
||||
(ax_reg_mask): Likewise.
|
||||
|
||||
2016-02-24 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* linux-nat.c (save_sigtrap) Delete.
|
||||
|
|
|
@ -308,6 +308,9 @@ ax_reg (struct agent_expr *x, int reg)
|
|||
}
|
||||
else
|
||||
{
|
||||
/* Get the remote register number. */
|
||||
reg = gdbarch_remote_register_number (x->gdbarch, reg);
|
||||
|
||||
/* Make sure the register number is in range. */
|
||||
if (reg < 0 || reg > 0xffff)
|
||||
error (_("GDB bug: ax-general.c (ax_reg): "
|
||||
|
@ -456,7 +459,11 @@ ax_reg_mask (struct agent_expr *ax, int reg)
|
|||
}
|
||||
else
|
||||
{
|
||||
int byte = reg / 8;
|
||||
int byte;
|
||||
|
||||
/* Get the remote register number. */
|
||||
reg = gdbarch_remote_register_number (ax->gdbarch, reg);
|
||||
byte = reg / 8;
|
||||
|
||||
/* Grow the bit mask if necessary. */
|
||||
if (byte >= ax->reg_mask_len)
|
||||
|
|
Loading…
Reference in a new issue