Mirror of the gdb mailing list
 help / color / mirror / Atom feed
* REGISTER_BYTE() and pseudos
@ 2002-05-15  9:36 Richard Earnshaw
  2002-05-15 10:06 ` Andrew Cagney
  0 siblings, 1 reply; 8+ messages in thread
From: Richard Earnshaw @ 2002-05-15  9:36 UTC (permalink / raw)
  To: gdb; +Cc: Richard.Earnshaw


What should REGISTER_BYTE() return for a pseudo that doesn't have space 
allocated in registers[]?

R.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: REGISTER_BYTE() and pseudos
  2002-05-15  9:36 REGISTER_BYTE() and pseudos Richard Earnshaw
@ 2002-05-15 10:06 ` Andrew Cagney
  2002-05-15 10:35   ` Elena Zannoni
  0 siblings, 1 reply; 8+ messages in thread
From: Andrew Cagney @ 2002-05-15 10:06 UTC (permalink / raw)
  To: Richard.Earnshaw, Elena Zannoni; +Cc: gdb

> What should REGISTER_BYTE() return for a pseudo that doesn't have space 
> allocated in registers[]?

It shouldn't matter.  However, check with Elena for what was done with 
the sh5.

Andrew




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: REGISTER_BYTE() and pseudos
  2002-05-15 10:06 ` Andrew Cagney
@ 2002-05-15 10:35   ` Elena Zannoni
  2002-05-15 10:46     ` Richard Earnshaw
  2002-05-15 11:08     ` Richard Earnshaw
  0 siblings, 2 replies; 8+ messages in thread
From: Elena Zannoni @ 2002-05-15 10:35 UTC (permalink / raw)
  To: Andrew Cagney; +Cc: Richard.Earnshaw, Elena Zannoni, gdb

Andrew Cagney writes:
 > > What should REGISTER_BYTE() return for a pseudo that doesn't have space 
 > > allocated in registers[]?
 > 
 > It shouldn't matter.  However, check with Elena for what was done with 
 > the sh5.
 > 
 > Andrew
 > 
 > 

Yeah, I was going to chime in, but I am behind on this thread.
Richard, look at the sh-tdep.c file. I checked in the sh5 work.  It
still needs another round of cleaning but ti should pretty much all be
there.

Elena


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: REGISTER_BYTE() and pseudos
  2002-05-15 10:35   ` Elena Zannoni
@ 2002-05-15 10:46     ` Richard Earnshaw
  2002-05-15 11:46       ` Elena Zannoni
  2002-05-15 11:08     ` Richard Earnshaw
  1 sibling, 1 reply; 8+ messages in thread
From: Richard Earnshaw @ 2002-05-15 10:46 UTC (permalink / raw)
  To: Elena Zannoni; +Cc: Andrew Cagney, Richard.Earnshaw, gdb


> Yeah, I was going to chime in, but I am behind on this thread.
> Richard, look at the sh-tdep.c file. I checked in the sh5 work.  It
> still needs another round of cleaning but ti should pretty much all be
> there.

OK, I'll have another look.  

The bit I'm worried about though is if we call something like 
generic_get_saved_register for a pseudo and we hit a call_dummy frame.  
The code in there goes:

      if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
        {
          if (lval)             /* found it in a CALL_DUMMY frame */
            *lval = not_lval;
          if (raw_buffer)
            memcpy (raw_buffer,
                    generic_find_dummy_frame (frame->pc, frame->frame) +
                    REGISTER_BYTE (regnum),
                    REGISTER_RAW_SIZE (regnum));
          return;

Which will try to look up the pseudo in the buffer even if it isn't there.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: REGISTER_BYTE() and pseudos
  2002-05-15 10:35   ` Elena Zannoni
  2002-05-15 10:46     ` Richard Earnshaw
@ 2002-05-15 11:08     ` Richard Earnshaw
  2002-05-15 11:45       ` Elena Zannoni
  2002-05-15 13:01       ` Andrew Cagney
  1 sibling, 2 replies; 8+ messages in thread
From: Richard Earnshaw @ 2002-05-15 11:08 UTC (permalink / raw)
  To: Elena Zannoni; +Cc: Andrew Cagney, Richard.Earnshaw, gdb

OK, I see what you are doing.  Basically, if a pseudo maps onto a real 
register somewhere in the regcache, you return the address of that.

However, what should be done if the pseudo doesn't exist as a single 
entry, or if it is a manipulation of a real register?  For example, on the 
ARM, the CPSR may be just a few bits retrieved from the PC.

Also, what would you do if you needed to address two non-adjacent 
registers?

R.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: REGISTER_BYTE() and pseudos
  2002-05-15 11:08     ` Richard Earnshaw
@ 2002-05-15 11:45       ` Elena Zannoni
  2002-05-15 13:01       ` Andrew Cagney
  1 sibling, 0 replies; 8+ messages in thread
From: Elena Zannoni @ 2002-05-15 11:45 UTC (permalink / raw)
  To: Richard.Earnshaw; +Cc: Elena Zannoni, Andrew Cagney, gdb

Richard Earnshaw writes:
 > OK, I see what you are doing.  Basically, if a pseudo maps onto a real 
 > register somewhere in the regcache, you return the address of that.
 > 
 > However, what should be done if the pseudo doesn't exist as a single 
 > entry, or if it is a manipulation of a real register?  For example, on the 
 > ARM, the CPSR may be just a few bits retrieved from the PC.
 > 
 > Also, what would you do if you needed to address two non-adjacent 
 > registers?
 > 
 > R.

Look at sh64_pseudo_register_read() and how FPSCR is treated.  FPSCR
is built as a collection of non-adjacent bits in various architectural
registers.

In theory sh64_pseudo_register_read shouldn't even be there.  All that
code should just be part of sh64_register_read.  Basically
sh64_register_read just does what it wants with the registers, almost
like if there was no difference between pseudos and real registers.

Same with sh64_register_write and sh64_pseudo_register_write.

Elena


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: REGISTER_BYTE() and pseudos
  2002-05-15 10:46     ` Richard Earnshaw
@ 2002-05-15 11:46       ` Elena Zannoni
  0 siblings, 0 replies; 8+ messages in thread
From: Elena Zannoni @ 2002-05-15 11:46 UTC (permalink / raw)
  To: Richard.Earnshaw; +Cc: Elena Zannoni, Andrew Cagney, gdb

Richard Earnshaw writes:
 > 
 > > Yeah, I was going to chime in, but I am behind on this thread.
 > > Richard, look at the sh-tdep.c file. I checked in the sh5 work.  It
 > > still needs another round of cleaning but ti should pretty much all be
 > > there.
 > 
 > OK, I'll have another look.  
 > 
 > The bit I'm worried about though is if we call something like 
 > generic_get_saved_register for a pseudo and we hit a call_dummy frame.  
 > The code in there goes:
 > 
 >       if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
 >         {
 >           if (lval)             /* found it in a CALL_DUMMY frame */
 >             *lval = not_lval;
 >           if (raw_buffer)
 >             memcpy (raw_buffer,
 >                     generic_find_dummy_frame (frame->pc, frame->frame) +
 >                     REGISTER_BYTE (regnum),
 >                     REGISTER_RAW_SIZE (regnum));
 >           return;
 > 
 > Which will try to look up the pseudo in the buffer even if it isn't there.

Hmmm, yes you are probably right. That case is likely broken then.

Elena


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: REGISTER_BYTE() and pseudos
  2002-05-15 11:08     ` Richard Earnshaw
  2002-05-15 11:45       ` Elena Zannoni
@ 2002-05-15 13:01       ` Andrew Cagney
  1 sibling, 0 replies; 8+ messages in thread
From: Andrew Cagney @ 2002-05-15 13:01 UTC (permalink / raw)
  To: Richard.Earnshaw; +Cc: Elena Zannoni, gdb

> OK, I see what you are doing.  Basically, if a pseudo maps onto a real 
> register somewhere in the regcache, you return the address of that.
> 
> However, what should be done if the pseudo doesn't exist as a single 
> entry, or if it is a manipulation of a real register?  For example, on the 
> ARM, the CPSR may be just a few bits retrieved from the PC.
> 
> Also, what would you do if you needed to address two non-adjacent 
> registers?

Return ``not_lval''.  I think that case can go in the too hard basket.

First, I don't know if GDB's ``struct value'' system is rich enough to 
describe a value split across [disjoint] registers and memory.  Second, 
even if it was, the current get_saved_register() doesn't make that 
knowledge available.  An interface more like value_of_register() would 
be better.

BTW, this code:

 > OK, I'll have another look.
 >
 > The bit I'm worried about though is if we call something like
 > generic_get_saved_register for a pseudo and we hit a call_dummy frame.
 > The code in there goes:
 >
 >       if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
 >         {
 >           if (lval)             /* found it in a CALL_DUMMY frame */
 >             *lval = not_lval;
 >           if (raw_buffer)
 >             memcpy (raw_buffer,
 >                     generic_find_dummy_frame (frame->pc, frame->frame) +
 >                     REGISTER_BYTE (regnum),
 >                     REGISTER_RAW_SIZE (regnum));
 >           return;
 >
 > Which will try to look up the pseudo in the buffer even if it isn't 
there.


Reveals a problem with the patch:
http://sources.redhat.com/ml/gdb-patches/2002-05/msg00416.html

For the moment a custom get_saved_register will get around this.


Andrew


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2002-05-15 20:01 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-05-15  9:36 REGISTER_BYTE() and pseudos Richard Earnshaw
2002-05-15 10:06 ` Andrew Cagney
2002-05-15 10:35   ` Elena Zannoni
2002-05-15 10:46     ` Richard Earnshaw
2002-05-15 11:46       ` Elena Zannoni
2002-05-15 11:08     ` Richard Earnshaw
2002-05-15 11:45       ` Elena Zannoni
2002-05-15 13:01       ` Andrew Cagney

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox