This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFC PATCH] Read pseudo registers from frame instead of regcache


Simon Marchi wrote:

> The problem: Reading pseudo registers from an upper stack frame does not
> work.  The raw registers needed to compose the pseudo registers are
> always read from the current thread's regcache, which is effectively
> frame #0's registers.

I think this may have been by design at some point.  The idea being:
for the innermost frame, you construct your register set using the ptrace
(or whatever) interface, possibly using arch-specific constructions
(the "pseudo" registers).  But for higher frames, you construct *all*
registers directly via the unwinding logic.

For example, on a platform where a floating-point register was extended
to a vector register at some point, your ptrace interface may be split
between the original FP part, and the "remaining" piece, so to construct
the full vector register, you'd have to make two ptrace requests and
combine them (using a "pseudo" register).  But if you want to find the
value of the vector register in a higher frame, there will be unwind
info for the full vector register, and not the two pieces.

(This construct actually exists on Intel as well, e.g. with the ymmh
register parts.  However, since ymm is not call-saved in the Linux ABI,
we don't have unwind info either way ... In some other ABI, this could
be an actual problem, however.)

So this change:

> -  /* Ask this frame to unwind its register.  */
> -  value = frame->unwind->prev_register (frame, &frame->prologue_cache, regnum);
> +  struct value *value;
> +  if (regnum < gdbarch_num_regs (gdbarch))
> +    {
> +      /* This is a raw register, we can directly ask the next frame to unwind
> +         the register.  */
> +      value = next_frame->unwind->prev_register (next_frame,
> +						 &next_frame->prologue_cache,
> +						 regnum);
> +    }
> +  else if (gdbarch_pseudo_register_read_value_p (gdbarch))
> +    {
> +      /* This is a pseudo register, we don't know how how what raw registers
> +         this pseudo register is made of.  Ask the gdbarch to read the value,
> +         it will itself ask the next frame to unwind the values of the raw
> +         registers it needs to compose the value of the pseudo register.  */
> +      value = gdbarch_pseudo_register_read_value (gdbarch, next_frame, regnum);
> +    }

in effect changes what unwind info GDB expects.  Now maybe it is still the
correct change, but this at least needs a review on how pseudo register
unwind info is currently handled across all architectures ...

Bye,
Ulrich

-- 
  Dr. Ulrich Weigand
  GNU/Linux compilers and toolchain
  Ulrich.Weigand@de.ibm.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]