Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [commit:avr] fix some frame problems
@ 2003-07-16 23:27 Theodore A. Roth
  2003-07-16 23:34 ` Andrew Cagney
  0 siblings, 1 reply; 4+ messages in thread
From: Theodore A. Roth @ 2003-07-16 23:27 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: TEXT/PLAIN, Size: 318 bytes --]

Hi,

I've committed the attached.

This fixes two problems on the avr:

- backtracing wasn't working when a function without a prologue called
  another function without a prologue.

- setting a break on some obscure functions without a prologue was not
  getting the correct line number.

Ok for branch too?

Ted Roth

[-- Attachment #2: Type: TEXT/PLAIN, Size: 7444 bytes --]

2003-07-16  Theodore A. Roth  <troth@openavr.org>

	* avr-tdep.c (avr_skip_prologue): Return PC unchanged if no prologue
	found.
	(avr_frame_unwind_cache): Don't unwind FP for main.
	Update a comment.
	Save the computed prev_sp.
	(avr_saved_regs_unwinder): Remove function.
	(avr_frame_prev_register): Use PC unwind logic from 
	avr_saved_regs_unwinder(), otherwise use trad_frame_prev_register().

Index: avr-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/avr-tdep.c,v
retrieving revision 1.68
diff -u -p -r1.68 avr-tdep.c
--- avr-tdep.c	16 Jul 2003 22:29:13 -0000	1.68
+++ avr-tdep.c	16 Jul 2003 23:17:19 -0000
@@ -796,7 +796,9 @@ avr_skip_prologue (CORE_ADDR pc)
 
       prologue_end = avr_scan_prologue (pc, &info);
 
-      if (info.prologue_type != AVR_PROLOGUE_NONE)
+      if (info.prologue_type == AVR_PROLOGUE_NONE)
+        return pc;
+      else
         {
           sal = find_pc_line (func_addr, 0);
 
@@ -856,76 +858,6 @@ avr_extract_return_value (struct type *t
     }
 }
 
-static void
-avr_saved_regs_unwinder (struct frame_info *next_frame,
-                         struct trad_frame_saved_reg *this_saved_regs,
-                         int regnum, int *optimizedp,
-                         enum lval_type *lvalp, CORE_ADDR *addrp,
-                         int *realnump, void *bufferp)
-{
-  if (this_saved_regs[regnum].addr != 0)
-    {
-      *optimizedp = 0;
-      *lvalp = lval_memory;
-      *addrp = this_saved_regs[regnum].addr;
-      *realnump = -1;
-      if (bufferp != NULL)
-        {
-          /* Read the value in from memory.  */
-
-          if (regnum == AVR_PC_REGNUM)
-            {
-              /* Reading the return PC from the PC register is slightly
-                 abnormal.  register_size(AVR_PC_REGNUM) says it is 4 bytes,
-                 but in reality, only two bytes (3 in upcoming mega256) are
-                 stored on the stack.
-
-                 Also, note that the value on the stack is an addr to a word
-                 not a byte, so we will need to multiply it by two at some
-                 point. 
-
-                 And to confuse matters even more, the return address stored
-                 on the stack is in big endian byte order, even though most
-                 everything else about the avr is little endian. Ick!  */
-
-              /* FIXME: number of bytes read here will need updated for the
-                 mega256 when it is available.  */
-
-              ULONGEST pc;
-              unsigned char tmp;
-              unsigned char buf[2];
-
-              read_memory (this_saved_regs[regnum].addr, buf, 2);
-
-              /* Convert the PC read from memory as a big-endian to
-                 little-endian order. */
-              tmp = buf[0];
-              buf[0] = buf[1];
-              buf[1] = tmp;
-
-              pc = (extract_unsigned_integer (buf, 2) * 2);
-              store_unsigned_integer (bufferp,
-                                      register_size (current_gdbarch, regnum),
-                                      pc);
-            }
-          else
-            {
-              read_memory (this_saved_regs[regnum].addr, bufferp,
-                           register_size (current_gdbarch, regnum));
-            }
-        }
-
-      return;
-    }
-
-  /* No luck, assume this and the next frame have the same register
-     value.  If a value is needed, pass the request on down the chain;
-     otherwise just return an indication that the value is in the same
-     register as the next frame.  */
-  frame_register_unwind (next_frame, regnum, optimizedp, lvalp, addrp,
-			 realnump, bufferp);
-}
-
 /* Put here the code to store, into fi->saved_regs, the addresses of
    the saved registers of frame described by FRAME_INFO.  This
    includes special registers such as pc and fp saved in special ways
@@ -957,7 +889,8 @@ avr_frame_unwind_cache (struct frame_inf
   if ((pc > 0) && (pc < frame_pc_unwind (next_frame)))
     avr_scan_prologue (pc, info);
 
-  if (info->prologue_type != AVR_PROLOGUE_NONE)
+  if ((info->prologue_type != AVR_PROLOGUE_NONE)
+      && (info->prologue_type != AVR_PROLOGUE_MAIN))
     {
       ULONGEST high_base;       /* High byte of FP */
 
@@ -987,8 +920,7 @@ avr_frame_unwind_cache (struct frame_inf
   info->base = avr_make_saddr (this_base);
 
   /* Adjust all the saved registers so that they contain addresses and not
-     offsets.  We need to add one to the addresses since push ops are post
-     decrement on the avr.  */
+     offsets.  */
   for (i = 0; i < NUM_REGS - 1; i++)
     if (info->saved_regs[i].addr)
       {
@@ -1003,6 +935,10 @@ avr_frame_unwind_cache (struct frame_inf
       info->saved_regs[AVR_PC_REGNUM].addr = info->prev_sp;
     }  
 
+  /* The previous frame's SP needed to be computed.  Save the computed
+     value.  */
+  trad_frame_set_value (info->saved_regs, AVR_SP_REGNUM, info->prev_sp+1);
+
   return info;
 }
 
@@ -1069,8 +1005,54 @@ avr_frame_prev_register (struct frame_in
   struct avr_unwind_cache *info
     = avr_frame_unwind_cache (next_frame, this_prologue_cache);
 
-  avr_saved_regs_unwinder (next_frame, info->saved_regs, regnum, optimizedp,
-                           lvalp, addrp, realnump, bufferp);
+  if (regnum == AVR_PC_REGNUM)
+    {
+      if (trad_frame_addr_p (info->saved_regs, regnum))
+        {
+          *optimizedp = 0;
+          *lvalp = lval_memory;
+          *addrp = info->saved_regs[regnum].addr;
+          *realnump = -1;
+          if (bufferp != NULL)
+            {
+              /* Reading the return PC from the PC register is slightly
+                 abnormal.  register_size(AVR_PC_REGNUM) says it is 4 bytes,
+                 but in reality, only two bytes (3 in upcoming mega256) are
+                 stored on the stack.
+
+                 Also, note that the value on the stack is an addr to a word
+                 not a byte, so we will need to multiply it by two at some
+                 point. 
+
+                 And to confuse matters even more, the return address stored
+                 on the stack is in big endian byte order, even though most
+                 everything else about the avr is little endian. Ick!  */
+
+              /* FIXME: number of bytes read here will need updated for the
+                 mega256 when it is available.  */
+
+              ULONGEST pc;
+              unsigned char tmp;
+              unsigned char buf[2];
+
+              read_memory (info->saved_regs[regnum].addr, buf, 2);
+
+              /* Convert the PC read from memory as a big-endian to
+                 little-endian order. */
+              tmp = buf[0];
+              buf[0] = buf[1];
+              buf[1] = tmp;
+
+              pc = (extract_unsigned_integer (buf, 2) * 2);
+              store_unsigned_integer (bufferp,
+                                      register_size (current_gdbarch, regnum),
+                                      pc);
+            }
+        }
+    }
+  else
+    trad_frame_prev_register (next_frame, info->saved_regs, regnum,
+                              optimizedp, lvalp, addrp, realnump, bufferp);
 }
 
 static const struct frame_unwind avr_frame_unwind = {

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

* Re: [commit:avr] fix some frame problems
  2003-07-16 23:27 [commit:avr] fix some frame problems Theodore A. Roth
@ 2003-07-16 23:34 ` Andrew Cagney
  2003-07-17  4:24   ` Theodore A. Roth
  0 siblings, 1 reply; 4+ messages in thread
From: Andrew Cagney @ 2003-07-16 23:34 UTC (permalink / raw)
  To: Theodore A. Roth; +Cc: gdb-patches

> Hi,
> 
> I've committed the attached.
> 
> This fixes two problems on the avr:
> 
> - backtracing wasn't working when a function without a prologue called
>   another function without a prologue.
> 
> - setting a break on some obscure functions without a prologue was not
>   getting the correct line number.
> 
> Ok for branch too?

Yep (you're the maintainer, so really it's your call :-).

Andrew



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

* Re: [commit:avr] fix some frame problems
  2003-07-16 23:34 ` Andrew Cagney
@ 2003-07-17  4:24   ` Theodore A. Roth
  2003-07-17 12:14     ` Andrew Cagney
  0 siblings, 1 reply; 4+ messages in thread
From: Theodore A. Roth @ 2003-07-17  4:24 UTC (permalink / raw)
  Cc: gdb-patches

On Wed, 16 Jul 2003, Andrew Cagney wrote:

:)> Hi,
:)> 
:)> I've committed the attached.
:)> 
:)> This fixes two problems on the avr:
:)> 
:)> - backtracing wasn't working when a function without a prologue called
:)>   another function without a prologue.
:)> 
:)> - setting a break on some obscure functions without a prologue was not
:)>   getting the correct line number.
:)> 
:)> Ok for branch too?
:)
:)Yep (you're the maintainer, so really it's your call :-).
:)
:)Andrew

Just checking that it wasn't too close to release time.

Committed to branch now.

Ted Roth


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

* Re: [commit:avr] fix some frame problems
  2003-07-17  4:24   ` Theodore A. Roth
@ 2003-07-17 12:14     ` Andrew Cagney
  0 siblings, 0 replies; 4+ messages in thread
From: Andrew Cagney @ 2003-07-17 12:14 UTC (permalink / raw)
  To: Theodore A. Roth; +Cc: gdb-patches

> On Wed, 16 Jul 2003, Andrew Cagney wrote:
> 
> :)> Hi,
> :)> 
> :)> I've committed the attached.
> :)> 
> :)> This fixes two problems on the avr:
> :)> 
> :)> - backtracing wasn't working when a function without a prologue called
> :)>   another function without a prologue.
> :)> 
> :)> - setting a break on some obscure functions without a prologue was not
> :)>   getting the correct line number.
> :)> 
> :)> Ok for branch too?
> :)
> :)Yep (you're the maintainer, so really it's your call :-).
> :)
> :)Andrew
> 
> Just checking that it wasn't too close to release time.
> 
> Committed to branch now.

Hmm, on paper it will be out aug2, I suspect the first candidate will 
appear then.

Andrew



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

end of thread, other threads:[~2003-07-17 12:14 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-07-16 23:27 [commit:avr] fix some frame problems Theodore A. Roth
2003-07-16 23:34 ` Andrew Cagney
2003-07-17  4:24   ` Theodore A. Roth
2003-07-17 12:14     ` Andrew Cagney

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