Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH][SH] invalid registers
@ 2005-11-16 17:09 Andrew STUBBS
  2006-03-30 20:52 ` Daniel Jacobowitz
  0 siblings, 1 reply; 5+ messages in thread
From: Andrew STUBBS @ 2005-11-16 17:09 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 507 bytes --]

Hi,

The attached patch teaches GDB which registers are invalid in previous 
frames when the CFI does not say otherwise.

It does this using the SH4 ABI. This is backwards compatible with the 
sh1-sh3 and variants. I have not attempted to deal with the DSP 
registers as I don't know the ABI. They will be treated as ever.

The only thing this patch actually does is allow the 'info registers' 
command (and friends) to show '*invalid register*' when there is no way 
to know the true value.

Andrew Stubbs

[-- Attachment #2: invalid-registers.patch --]
[-- Type: text/plain, Size: 3226 bytes --]

2005-11-16  Andrew Stubbs  <andrew.stubbs@st.com>

	* sh-tdep.c (sh_dwarf2_frame_init_reg): New function.
	(sh_gdbarch_init): Call dwarf2_frame_set_init_reg().

Index: src/gdb/sh-tdep.c
===================================================================
--- src.orig/gdb/sh-tdep.c	2005-11-04 16:57:00.000000000 +0000
+++ src/gdb/sh-tdep.c	2005-11-04 17:55:46.000000000 +0000
@@ -2118,6 +2118,57 @@ sh_sh2a_register_sim_regno (int nr)
   return legacy_register_sim_regno (nr);
 }
 
+/* Set up the register unwinding such that call-clobbered registers are
+   not displayed in frames >0 because the true value is not certain.
+   The 'undefined' registers will show up as 'not available' unless the
+   CFI says otherwise.
+
+   This function is currently set up for SH4 and compatible only.  */
+
+static void
+sh_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
+                          struct dwarf2_frame_state_reg *reg)
+{
+  /* Mark the PC as the destination for the return address.  */
+  if (regnum == PC_REGNUM)
+    reg->how = DWARF2_FRAME_REG_RA;
+
+  /* Mark the stack pointer as the call frame address.  */
+  else if (regnum == SP_REGNUM)
+    reg->how = DWARF2_FRAME_REG_CFA;
+
+  /* The above was taken from the default init_reg in dwarf2-frame.c
+     while the below is SH specific.  */
+
+  /* Caller save registers.  */
+  else if ((regnum >= R0_REGNUM && regnum <= R0_REGNUM+7)
+	   || (regnum >= FR0_REGNUM && regnum <= FR0_REGNUM+11)
+	   || (regnum >= DR0_REGNUM && regnum <= DR0_REGNUM+5)
+	   || (regnum >= FV0_REGNUM && regnum <= FV0_REGNUM+2)
+	   || (regnum == MACH_REGNUM)
+	   || (regnum == MACL_REGNUM)
+	   || (regnum == FPUL_REGNUM)
+	   || (regnum == SR_REGNUM))
+    reg->how = DWARF2_FRAME_REG_UNDEFINED;
+
+  /* Callee save registers.  */
+  else if ((regnum >= R0_REGNUM+8 && regnum <= R0_REGNUM+15)
+	   || (regnum >= FR0_REGNUM+12 && regnum <= FR0_REGNUM+15)
+	   || (regnum >= DR0_REGNUM+6 && regnum <= DR0_REGNUM+8)
+	   || (regnum == FV0_REGNUM+3))
+    reg->how = DWARF2_FRAME_REG_SAME_VALUE;
+
+  /* Other registers.  These are not in the ABI and may or may not
+     mean anything in frames >0 so don't show them.  */
+  else if ((regnum >= R0_BANK0_REGNUM && regnum <= R0_BANK0_REGNUM+15)
+	   || (regnum == GBR_REGNUM)
+	   || (regnum == VBR_REGNUM)
+	   || (regnum == FPSCR_REGNUM)
+	   || (regnum == SSR_REGNUM)
+	   || (regnum == SPC_REGNUM))
+    reg->how = DWARF2_FRAME_REG_UNDEFINED;
+}
+
 static struct sh_frame_cache *
 sh_alloc_frame_cache (void)
 {
@@ -2502,6 +2553,8 @@ sh_gdbarch_init (struct gdbarch_info inf
 
   set_gdbarch_in_function_epilogue_p (gdbarch, sh_in_function_epilogue_p);
 
+  dwarf2_frame_set_init_reg (gdbarch, sh_dwarf2_frame_init_reg);
+
   switch (info.bfd_arch_info->mach)
     {
     case bfd_mach_sh:
Index: src/gdb/sh-tdep.h
===================================================================
--- src.orig/gdb/sh-tdep.h	2004-10-06 09:55:36.000000000 +0100
+++ src/gdb/sh-tdep.h	2005-11-04 17:50:17.000000000 +0000
@@ -41,6 +41,7 @@ enum
     FPUL_REGNUM = 23,
     /* Floating point registers */
     FPSCR_REGNUM = 24,
+    FR0_REGNUM = 25,
     FLOAT_ARG0_REGNUM = 29,
     FLOAT_ARGLAST_REGNUM = 36,
     FP_LAST_REGNUM = 40,

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

* Re: [PATCH][SH] invalid registers
  2005-11-16 17:09 [PATCH][SH] invalid registers Andrew STUBBS
@ 2006-03-30 20:52 ` Daniel Jacobowitz
  2006-04-03 12:59   ` Andrew STUBBS
  0 siblings, 1 reply; 5+ messages in thread
From: Daniel Jacobowitz @ 2006-03-30 20:52 UTC (permalink / raw)
  To: Andrew STUBBS; +Cc: gdb-patches

On Wed, Nov 16, 2005 at 04:20:47PM +0000, Andrew STUBBS wrote:
> Hi,
> 
> The attached patch teaches GDB which registers are invalid in previous 
> frames when the CFI does not say otherwise.
> 
> It does this using the SH4 ABI. This is backwards compatible with the 
> sh1-sh3 and variants. I have not attempted to deal with the DSP 
> registers as I don't know the ABI. They will be treated as ever.
> 
> The only thing this patch actually does is allow the 'info registers' 
> command (and friends) to show '*invalid register*' when there is no way 
> to know the true value.
> 
> Andrew Stubbs

> 2005-11-16  Andrew Stubbs  <andrew.stubbs@st.com>
> 
> 	* sh-tdep.c (sh_dwarf2_frame_init_reg): New function.
> 	(sh_gdbarch_init): Call dwarf2_frame_set_init_reg().

Hi Andrew,

This is OK.  Only S/390 uses the frame_init_reg hook this way today,
but it seems sensible.  But please wait a day or two in case anyone has
comments on the downside.

The downside is that you can't do this:

(gdb) break *abort
(gdb) continue
...
(gdb) up
(gdb) info registers

Instead, you have to look at the registers while you're in the bottom
frame (i.e. abort) instead of the aborting function.

Would it be more useful if GDB could output "0x40000000 (may be
clobbered)" somehow in info regs for DWARF2_FRAME_REG_UNDEFINED?
But, not a big deal either way.

-- 
Daniel Jacobowitz
CodeSourcery


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

* Re: [PATCH][SH] invalid registers
  2006-03-30 20:52 ` Daniel Jacobowitz
@ 2006-04-03 12:59   ` Andrew STUBBS
  2006-04-03 13:03     ` Daniel Jacobowitz
  0 siblings, 1 reply; 5+ messages in thread
From: Andrew STUBBS @ 2006-04-03 12:59 UTC (permalink / raw)
  To: gdb-patches

Daniel Jacobowitz wrote:
> This is OK.  Only S/390 uses the frame_init_reg hook this way today,
> but it seems sensible.  But please wait a day or two in case anyone has
> comments on the downside.

Hmmm, perhaps that ought to be fixed. I don't believe all those target 
really *know* what the value of all registers is in every frame.

> The downside is that you can't do this:
> 
> (gdb) break *abort
> (gdb) continue
> ...
> (gdb) up
> (gdb) info registers
> 
> Instead, you have to look at the registers while you're in the bottom
> frame (i.e. abort) instead of the aborting function.

In your example _we_ know that the values are real, but the debugger
does not, and, in my opinion, should not present them as if it does.

> Would it be more useful if GDB could output "0x40000000 (may be
> clobbered)" somehow in info regs for DWARF2_FRAME_REG_UNDEFINED?
> But, not a big deal either way.

Yes, that might be a suitable compromise, but not for
DWARF2_FRAME_REG_UNDEFINED - that value really means it when it comes
from dwarf. Perhaps another value.

In any case, a 'day or two' has passed and nobody has said anything. Am
I OK to commit this?

Andrew


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

* Re: [PATCH][SH] invalid registers
  2006-04-03 12:59   ` Andrew STUBBS
@ 2006-04-03 13:03     ` Daniel Jacobowitz
  2006-04-03 14:33       ` Andrew STUBBS
  0 siblings, 1 reply; 5+ messages in thread
From: Daniel Jacobowitz @ 2006-04-03 13:03 UTC (permalink / raw)
  To: gdb-patches

On Mon, Apr 03, 2006 at 01:56:53PM +0100, Andrew STUBBS wrote:
> Daniel Jacobowitz wrote:
> >This is OK.  Only S/390 uses the frame_init_reg hook this way today,
> >but it seems sensible.  But please wait a day or two in case anyone has
> >comments on the downside.
> 
> Hmmm, perhaps that ought to be fixed. I don't believe all those target 
> really *know* what the value of all registers is in every frame.

The hook is recent.

> In any case, a 'day or two' has passed and nobody has said anything. Am
> I OK to commit this?

Yeah.

-- 
Daniel Jacobowitz
CodeSourcery


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

* Re: [PATCH][SH] invalid registers
  2006-04-03 13:03     ` Daniel Jacobowitz
@ 2006-04-03 14:33       ` Andrew STUBBS
  0 siblings, 0 replies; 5+ messages in thread
From: Andrew STUBBS @ 2006-04-03 14:33 UTC (permalink / raw)
  To: gdb-patches

Daniel Jacobowitz wrote:
>> In any case, a 'day or two' has passed and nobody has said anything. Am
>> I OK to commit this?
> 
> Yeah.

Thanks, done.

Andrew


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

end of thread, other threads:[~2006-04-03 14:33 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-11-16 17:09 [PATCH][SH] invalid registers Andrew STUBBS
2006-03-30 20:52 ` Daniel Jacobowitz
2006-04-03 12:59   ` Andrew STUBBS
2006-04-03 13:03     ` Daniel Jacobowitz
2006-04-03 14:33       ` Andrew STUBBS

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