* [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