* rs6000-tdep.c (pop_frame): Correctly find the registers saved in
the stack frame. Their offset from the previous stack frame is in fdata.gpr_offset and fdata.fpr_offset, not fdata.offset. (gdb.base/return.exp) * config/rs6000/tm-rs6000.h: Doc fixes.
This commit is contained in:
parent
0bd416fe37
commit
63d7a4f12e
|
@ -66,14 +66,16 @@ struct fp_status {
|
|||
/* To be used by skip_prologue. */
|
||||
|
||||
struct rs6000_framedata {
|
||||
int offset; /* # of bytes in gpr's and fpr's are saved */
|
||||
int offset; /* total size of frame --- the distance
|
||||
by which we decrement sp to allocate
|
||||
the frame */
|
||||
int saved_gpr; /* smallest # of saved gpr */
|
||||
int saved_fpr; /* smallest # of saved fpr */
|
||||
int alloca_reg; /* alloca register number (frame ptr) */
|
||||
char frameless; /* true if frameless functions. */
|
||||
char nosavedpc; /* true if pc not saved. */
|
||||
int gpr_offset; /* offset of saved gprs */
|
||||
int fpr_offset; /* offset of saved fprs */
|
||||
int gpr_offset; /* offset of saved gprs from prev sp */
|
||||
int fpr_offset; /* offset of saved fprs from prev sp */
|
||||
int lr_offset; /* offset of saved lr */
|
||||
int cr_offset; /* offset of saved cr */
|
||||
};
|
||||
|
@ -149,7 +151,7 @@ extern void aix_process_linenos PARAMS ((void));
|
|||
|
||||
/* Stack grows downward. */
|
||||
|
||||
#define INNER_THAN <
|
||||
#define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
|
||||
|
||||
/* This is how arguments pushed onto stack or passed in registers.
|
||||
Stack must be aligned on 64-bit boundaries when synthesizing
|
||||
|
|
|
@ -213,19 +213,20 @@ rs6000_software_single_step (signal, insert_breakpoints_p)
|
|||
/* return pc value after skipping a function prologue and also return
|
||||
information about a function frame.
|
||||
|
||||
in struct rs6000_frameinfo fdata:
|
||||
in struct rs6000_framedata fdata:
|
||||
- frameless is TRUE, if function does not have a frame.
|
||||
- nosavedpc is TRUE, if function does not save %pc value in its frame.
|
||||
- offset is the number of bytes used in the frame to save registers.
|
||||
- offset is the initial size of this stack frame --- the amount by
|
||||
which we decrement the sp to allocate the frame.
|
||||
- saved_gpr is the number of the first saved gpr.
|
||||
- saved_fpr is the number of the first saved fpr.
|
||||
- alloca_reg is the number of the register used for alloca() handling.
|
||||
Otherwise -1.
|
||||
- gpr_offset is the offset of the saved gprs
|
||||
- fpr_offset is the offset of the saved fprs
|
||||
- gpr_offset is the offset of the first saved gpr from the previous frame.
|
||||
- fpr_offset is the offset of the first saved fpr from the previous frame.
|
||||
- lr_offset is the offset of the saved lr
|
||||
- cr_offset is the offset of the saved cr
|
||||
*/
|
||||
*/
|
||||
|
||||
#define SIGNED_SHORT(x) \
|
||||
((sizeof (short) == 2) \
|
||||
|
@ -668,19 +669,24 @@ pop_frame ()
|
|||
write_register (PC_REGNUM, lr);
|
||||
|
||||
/* reset register values if any was saved earlier. */
|
||||
addr = prev_sp - fdata.offset;
|
||||
|
||||
if (fdata.saved_gpr != -1)
|
||||
for (ii = fdata.saved_gpr; ii <= 31; ++ii) {
|
||||
read_memory (addr, ®isters [REGISTER_BYTE (ii)], 4);
|
||||
addr += 4;
|
||||
{
|
||||
addr = prev_sp + fdata.gpr_offset;
|
||||
for (ii = fdata.saved_gpr; ii <= 31; ++ii) {
|
||||
read_memory (addr, ®isters [REGISTER_BYTE (ii)], 4);
|
||||
addr += 4;
|
||||
}
|
||||
}
|
||||
|
||||
if (fdata.saved_fpr != -1)
|
||||
for (ii = fdata.saved_fpr; ii <= 31; ++ii) {
|
||||
read_memory (addr, ®isters [REGISTER_BYTE (ii+FP0_REGNUM)], 8);
|
||||
addr += 8;
|
||||
}
|
||||
{
|
||||
addr = prev_sp + fdata.fpr_offset;
|
||||
for (ii = fdata.saved_fpr; ii <= 31; ++ii) {
|
||||
read_memory (addr, ®isters [REGISTER_BYTE (ii+FP0_REGNUM)], 8);
|
||||
addr += 8;
|
||||
}
|
||||
}
|
||||
|
||||
write_register (SP_REGNUM, prev_sp);
|
||||
target_store_registers (-1);
|
||||
|
|
Loading…
Reference in New Issue