Re: [PATCH v3] Enable tracing of pseudo-registers on ARM

Pedro Alves
2016-02-19T20:22:08Z

On 02/19/2016 07:28 PM, Antoine Tremblay wrote:

> +/* Map the pseudo register number REG to the proper register number. */
> +
> +static int
> +arm_pseudo_register_to_register (struct gdbarch *gdbarch, int reg)
> +{

> + /* Get the remote/tdesc register number. */
> + double_regnum = gdbarch_remote_register_number (gdbarch, double_regnum);

Hmm, I don't think it should be the responsibility of this function to
map gdb to remote numbers though. Here I think we should just map
gdb pseudo to gdb raw.

> +
> + return double_regnum;
> +}
> +
> +/* Implementation of the ax_pseudo_register_collect gdbarch function. */
> +
> +static int
> +arm_ax_pseudo_register_collect (struct gdbarch *gdbarch,
> + struct agent_expr *ax, int reg)
> +{
> + int rawnum = arm_pseudo_register_to_register (gdbarch, reg);
> +
> + /* Error. */
> + if (rawnum < 0)
> + return 1;
> +
> + ax_reg_mask (ax, rawnum);

Hmm, seems to me that gdb raw -> target raw mapping should be
either here, or perhaps even in ax_reg / ax_reg_mask?

Consider the case of an expression requiring the collection of
a _raw_ register, thus not even reaching here. Looking at
ax-gdb.c/ax-general.c I don't see where is anything mapping gdb raw numbers
to remote/tdesc numbers? So how does _that_ work? Are the register masks that gdb
is computing actually wrong for the target, and things just happen
to work because gdbserver ignores them and always collects all registers?

Thanks,
Pedro Alves