summaryrefslogtreecommitdiff
path: root/gdb/mn10300-tdep.c
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
commitce1ca05e679b4b53bd97fab05a585457a9b07210 (patch)
treee2563ff2d196b715b2021b0d9c2aa87e9ee2c03e /gdb/mn10300-tdep.c
parent1b1a253df7a0f33a3a8872e31c01ea22290755e8 (diff)
downloadgdb-ce1ca05e679b4b53bd97fab05a585457a9b07210.tar.gz
* mn10300-tdep.c (mn10300_analyze_prologue): Doc fixes.
Diffstat (limited to 'gdb/mn10300-tdep.c')
-rw-r--r--gdb/mn10300-tdep.c66
1 files changed, 55 insertions, 11 deletions
diff --git a/gdb/mn10300-tdep.c b/gdb/mn10300-tdep.c
index 472e2603769..1e684f8cbbe 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)