aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Blandy <jimb@codesourcery.com>2001-10-10 21:22:44 +0000
committerJim Blandy <jimb@codesourcery.com>2001-10-10 21:22:44 +0000
commit4eab1e18e948b6f7c97702389d55c6d069a6a8db (patch)
treeb476b733fdbebac1ce80fb1ddcd8abe2cdde5919
parent290394d6070206df9ecda222a16355d859c7e840 (diff)
downloadgdb-4eab1e18e948b6f7c97702389d55c6d069a6a8db.zip
gdb-4eab1e18e948b6f7c97702389d55c6d069a6a8db.tar.gz
gdb-4eab1e18e948b6f7c97702389d55c6d069a6a8db.tar.bz2
* mn10300-tdep.c (mn10300_analyze_prologue): Doc fixes.
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/mn10300-tdep.c66
2 files changed, 59 insertions, 11 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 393c6c1..7e52cf5 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,7 @@
+2001-10-10 Jim Blandy <jimb@redhat.com>
+
+ * mn10300-tdep.c (mn10300_analyze_prologue): Doc fixes.
+
2001-10-10 Keith Seitz <keiths@redhat.com>
* varobj.c (cplus_value_of_child): Deal with a failure
diff --git a/gdb/mn10300-tdep.c b/gdb/mn10300-tdep.c
index 472e260..1e684f8 100644
--- a/gdb/mn10300-tdep.c
+++ b/gdb/mn10300-tdep.c
@@ -291,16 +291,59 @@ set_movm_offsets (struct frame_info *fi, int movm_args)
/* The main purpose of this file is dealing with prologues to extract
information about stack frames and saved registers.
- For reference here's how prologues look on the mn10300:
+ In gcc/config/mn13000/mn10300.c, the expand_prologue prologue
+ function is pretty readable, and has a nice explanation of how the
+ prologue is generated. The prologues generated by that code will
+ have the following form:
- With frame pointer:
- movm [d2,d3,a2,a3],sp
- mov sp,a3
- add <size>,sp
+ + If this is an old-style varargs function, then its arguments
+ need to be flushed back to the stack:
+
+ mov d0,(4,sp)
+ mov d1,(4,sp)
- Without frame pointer:
- movm [d2,d3,a2,a3],sp (if needed)
- add <size>,sp
+ + If we use any of the callee-saved registers, save them now.
+
+ movm [some callee-saved registers],(sp)
+
+ + If we have any floating-point registers to save:
+
+ - Decrement the stack pointer to reserve space for the registers.
+ If the function doesn't need a frame pointer, we may combine
+ this with the adjustment that reserves space for the frame.
+
+ add -SIZE, sp
+
+ - Save the floating-point registers. We have two possible
+ strategies:
+
+ . Save them at fixed offset from the SP:
+
+ fmov fsN,(OFFSETN,sp)
+ fmov fsM,(OFFSETM,sp)
+ ...
+
+ . Or, set a0 to the start of the save area, and then use
+ post-increment addressing to save the FP registers.
+
+ mov sp, a0
+ add SIZE, a0
+ fmov fsN,(a0+)
+ fmov fsM,(a0+)
+ ...
+
+ + If the function needs a frame pointer, we set it here.
+
+ mov sp, a3
+
+ + Now we reserve space for the stack frame proper. This could be
+ merged into the `add -SIZE, sp' instruction for FP saves up
+ above, unless we needed to set the frame pointer in the previous
+ step, or the frame is so large that allocating the whole thing at
+ once would put the FP register save slots out of reach of the
+ addressing mode (128 bytes).
+
+ add -SIZE, sp
One day we might keep the stack pointer constant, that won't
change the code for prologues, but it will make the frame
@@ -330,7 +373,7 @@ set_movm_offsets (struct frame_info *fi, int movm_args)
save instructions.
MY_FRAME_IN_FP: The base of the current frame is in the
- frame pointer register ($a2).
+ frame pointer register ($a3).
NO_MORE_FRAMES: Set this if the current frame is "start" or
if the first instruction looks like mov <imm>,sp. This tells
@@ -416,8 +459,9 @@ mn10300_analyze_prologue (struct frame_info *fi, CORE_ADDR pc)
return addr;
}
- /* First see if this insn sets the stack pointer; if so, it's something
- we won't understand, so quit now. */
+ /* First see if this insn sets the stack pointer from a register; if
+ so, it's probably the initialization of the stack pointer in _start,
+ so mark this as the bottom-most frame. */
if (buf[0] == 0xf2 && (buf[1] & 0xf3) == 0xf0)
{
if (fi)