This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[PATCH] ARM: Eliminate EXTRA_FRAME_INFO & FRAME_FIND_SAVED_REGS
- From: Richard Earnshaw <rearnsha at arm dot com>
- To: gdb-patches at sources dot redhat dot com
- Cc: Richard dot Earnshaw at arm dot com
- Date: Sat, 12 Jan 2002 11:50:48 +0000
- Subject: [PATCH] ARM: Eliminate EXTRA_FRAME_INFO & FRAME_FIND_SAVED_REGS
- Organization: ARM Ltd.
- Reply-to: Richard dot Earnshaw at arm dot com
This patch eliminates the deprecated macros EXTRA_FRAME_INFO &
FRAME_FIND_SAVED_REGS from the arm target support files and replaces them
with the new methods for doing this. Tested on arm-netbsd and arm-linux
with no regressions.
Most of the patch is mechanical replacement of
Replace with
fip->fsr.regs fip->saved_regs
fip->framereg fip->extra_info->framereg
fip->framesize fip->extra_info->framesize
fip->frameoffset fip->extra_info->framesize
R.
Convert arm targets to new FRAME interface.
* arm-tdep.c (struct frame_extra_info): Remove fsr.
(arm_frame_find_save_regs): Delete.
(arm_frame_init_saved_regs): New.
(arm_init_extra_frame_info): Alloacte saved_regs as required.
Allocate extra_info as required. Convert all uses of fsr.regs
to use saved_regs, similarly all uses of EXTRA_FRAME_INFO fields
to use extra_info.
(thumb_scan_prologue, arm_scan_prologue, arm_find_callers_reg)
(arm_frame_chain, arm_frame_saved_pc, arm_pop_frame): Likewise.
(check_prologue_cache): Likewise. Also ensure prologue_cache is
correctly set up on first use.
(save_prologue_cache): Likewise.
* config/arm/tm-arm.h (EXTRA_FRAME_INFO): Delete.
(FRAME_FIND_SAVED_REGS): Delete.
(arm_frame_find_saved_regs): Delete prototype.
(arm_frame_init_saved_regs): New prototype.
(FRAME_INIT_SAVED_REGS): Define.
Index: arm-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/arm-tdep.c,v
retrieving revision 1.26
diff -p -r1.26 arm-tdep.c
*** arm-tdep.c 2002/01/09 18:07:48 1.26
--- arm-tdep.c 2002/01/11 20:53:07
*************** static void convert_from_extended (void
*** 107,118 ****
we're still in the prologue of a function with a frame) */
struct frame_extra_info
! {
! struct frame_saved_regs fsr;
! int framesize;
! int frameoffset;
! int framereg;
! };
/* Addresses for calling Thumb functions have the bit 0 set.
Here are some macros to test, set, or clear bit 0 of addresses. */
--- 107,117 ----
we're still in the prologue of a function with a frame) */
struct frame_extra_info
! {
! int framesize;
! int frameoffset;
! int framereg;
! };
/* Addresses for calling Thumb functions have the bit 0 set.
Here are some macros to test, set, or clear bit 0 of addresses. */
*************** thumb_scan_prologue (struct frame_info *
*** 534,540 ****
frame pointer, adjust the stack pointer, and save registers.
Do this until all basic prolog instructions are found. */
! fi->framesize = 0;
for (current_pc = prologue_start;
(current_pc < prologue_end) && ((findmask & 7) != 7);
current_pc += 2)
--- 533,539 ----
frame pointer, adjust the stack pointer, and save registers.
Do this until all basic prolog instructions are found. */
! fi->extra_info->framesize = 0;
for (current_pc = prologue_start;
(current_pc < prologue_end) && ((findmask & 7) != 7);
current_pc += 2)
*************** thumb_scan_prologue (struct frame_info *
*** 557,564 ****
for (regno = LR_REGNUM; regno >= 0; regno--)
if (mask & (1 << regno))
{
! fi->framesize += 4;
! fi->fsr.regs[saved_reg[regno]] = -(fi->framesize);
saved_reg[regno] = regno; /* reset saved register map */
}
}
--- 556,564 ----
for (regno = LR_REGNUM; regno >= 0; regno--)
if (mask & (1 << regno))
{
! fi->extra_info->framesize += 4;
! fi->saved_regs[saved_reg[regno]] =
! -(fi->extra_info->framesize);
saved_reg[regno] = regno; /* reset saved register map */
}
}
*************** thumb_scan_prologue (struct frame_info *
*** 572,593 ****
offset = (insn & 0x7f) << 2; /* get scaled offset */
if (insn & 0x80) /* is it signed? (==subtracting) */
{
! fi->frameoffset += offset;
offset = -offset;
}
! fi->framesize -= offset;
}
else if ((insn & 0xff00) == 0xaf00) /* add r7, sp, #imm */
{
findmask |= 2; /* setting of r7 found */
! fi->framereg = THUMB_FP_REGNUM;
! fi->frameoffset = (insn & 0xff) << 2; /* get scaled offset */
}
else if (insn == 0x466f) /* mov r7, sp */
{
findmask |= 2; /* setting of r7 found */
! fi->framereg = THUMB_FP_REGNUM;
! fi->frameoffset = 0;
saved_reg[THUMB_FP_REGNUM] = SP_REGNUM;
}
else if ((insn & 0xffc0) == 0x4640) /* mov r0-r7, r8-r15 */
--- 572,594 ----
offset = (insn & 0x7f) << 2; /* get scaled offset */
if (insn & 0x80) /* is it signed? (==subtracting) */
{
! fi->extra_info->frameoffset += offset;
offset = -offset;
}
! fi->extra_info->framesize -= offset;
}
else if ((insn & 0xff00) == 0xaf00) /* add r7, sp, #imm */
{
findmask |= 2; /* setting of r7 found */
! fi->extra_info->framereg = THUMB_FP_REGNUM;
! /* get scaled offset */
! fi->extra_info->frameoffset = (insn & 0xff) << 2;
}
else if (insn == 0x466f) /* mov r7, sp */
{
findmask |= 2; /* setting of r7 found */
! fi->extra_info->framereg = THUMB_FP_REGNUM;
! fi->extra_info->frameoffset = 0;
saved_reg[THUMB_FP_REGNUM] = SP_REGNUM;
}
else if ((insn & 0xffc0) == 0x4640) /* mov r0-r7, r8-r15 */
*************** check_prologue_cache (struct frame_info
*** 625,637 ****
{
int i;
if (fi->pc == prologue_cache.pc)
{
! fi->framereg = prologue_cache.framereg;
! fi->framesize = prologue_cache.framesize;
! fi->frameoffset = prologue_cache.frameoffset;
! for (i = 0; i < NUM_REGS; i++)
! fi->fsr.regs[i] = prologue_cache.fsr.regs[i];
return 1;
}
else
--- 626,646 ----
{
int i;
+ if (prologue_cache.extra_info == NULL)
+ {
+ prologue_cache.extra_info = (struct frame_extra_info *)
+ xcalloc (1, sizeof (struct frame_extra_info));
+ prologue_cache.saved_regs = (CORE_ADDR *)
+ xcalloc (1, SIZEOF_FRAME_SAVED_REGS);
+ }
+
if (fi->pc == prologue_cache.pc)
{
! fi->extra_info->framereg = prologue_cache.extra_info->framereg;
! fi->extra_info->framesize = prologue_cache.extra_info->framesize;
! fi->extra_info->frameoffset = prologue_cache.extra_info->frameoffset;
! for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
! fi->saved_regs[i] = prologue_cache.saved_regs[i];
return 1;
}
else
*************** save_prologue_cache (struct frame_info *
*** 646,658 ****
{
int i;
prologue_cache.pc = fi->pc;
! prologue_cache.framereg = fi->framereg;
! prologue_cache.framesize = fi->framesize;
! prologue_cache.frameoffset = fi->frameoffset;
! for (i = 0; i < NUM_REGS; i++)
! prologue_cache.fsr.regs[i] = fi->fsr.regs[i];
}
--- 655,675 ----
{
int i;
+ if (prologue_cache.extra_info == NULL)
+ {
+ prologue_cache.extra_info = (struct frame_extra_info *)
+ xcalloc (1, sizeof (struct frame_extra_info));
+ prologue_cache.saved_regs = (CORE_ADDR *)
+ xcalloc (1, SIZEOF_FRAME_SAVED_REGS);
+ }
+
prologue_cache.pc = fi->pc;
! prologue_cache.extra_info->framereg = fi->extra_info->framereg;
! prologue_cache.extra_info->framesize = fi->extra_info->framesize;
! prologue_cache.extra_info->frameoffset = fi->extra_info->frameoffset;
! for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
! prologue_cache.saved_regs[i] = fi->saved_regs[i];
}
*************** arm_scan_prologue (struct frame_info *fi
*** 735,743 ****
return;
/* Assume there is no frame until proven otherwise. */
! fi->framereg = SP_REGNUM;
! fi->framesize = 0;
! fi->frameoffset = 0;
/* Check for Thumb prologue. */
if (arm_pc_is_thumb (fi->pc))
--- 752,760 ----
return;
/* Assume there is no frame until proven otherwise. */
! fi->extra_info->framereg = SP_REGNUM;
! fi->extra_info->framesize = 0;
! fi->extra_info->frameoffset = 0;
/* Check for Thumb prologue. */
if (arm_pc_is_thumb (fi->pc))
*************** arm_scan_prologue (struct frame_info *fi
*** 840,846 ****
if (mask & (1 << regno))
{
sp_offset -= 4;
! fi->fsr.regs[regno] = sp_offset;
}
}
else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
--- 857,863 ----
if (mask & (1 << regno))
{
sp_offset -= 4;
! fi->saved_regs[regno] = sp_offset;
}
}
else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
*************** arm_scan_prologue (struct frame_info *fi
*** 849,855 ****
unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
imm = (imm >> rot) | (imm << (32 - rot));
fp_offset = -imm;
! fi->framereg = FP_REGNUM;
}
else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
{
--- 866,872 ----
unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
imm = (imm >> rot) | (imm << (32 - rot));
fp_offset = -imm;
! fi->extra_info->framereg = FP_REGNUM;
}
else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
{
*************** arm_scan_prologue (struct frame_info *fi
*** 862,868 ****
{
sp_offset -= 12;
regno = F0_REGNUM + ((insn >> 12) & 0x07);
! fi->fsr.regs[regno] = sp_offset;
}
else if ((insn & 0xffbf0fff) == 0xec2d0200) /* sfmfd f0, 4, [sp!] */
{
--- 879,885 ----
{
sp_offset -= 12;
regno = F0_REGNUM + ((insn >> 12) & 0x07);
! fi->saved_regs[regno] = sp_offset;
}
else if ((insn & 0xffbf0fff) == 0xec2d0200) /* sfmfd f0, 4, [sp!] */
{
*************** arm_scan_prologue (struct frame_info *fi
*** 889,895 ****
for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
{
sp_offset -= 12;
! fi->fsr.regs[fp_start_reg++] = sp_offset;
}
}
else if ((insn & 0xf0000000) != 0xe0000000)
--- 906,912 ----
for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
{
sp_offset -= 12;
! fi->saved_regs[fp_start_reg++] = sp_offset;
}
}
else if ((insn & 0xf0000000) != 0xe0000000)
*************** arm_scan_prologue (struct frame_info *fi
*** 905,915 ****
/* The frame size is just the negative of the offset (from the original SP)
of the last thing thing we pushed on the stack. The frame offset is
[new FP] - [new SP]. */
! fi->framesize = -sp_offset;
! if (fi->framereg == FP_REGNUM)
! fi->frameoffset = fp_offset - sp_offset;
else
! fi->frameoffset = 0;
save_prologue_cache (fi);
}
--- 922,932 ----
/* The frame size is just the negative of the offset (from the original SP)
of the last thing thing we pushed on the stack. The frame offset is
[new FP] - [new SP]. */
! fi->extra_info->framesize = -sp_offset;
! if (fi->extra_info->framereg == FP_REGNUM)
! fi->extra_info->frameoffset = fp_offset - sp_offset;
else
! fi->extra_info->frameoffset = 0;
save_prologue_cache (fi);
}
*************** arm_find_callers_reg (struct frame_info
*** 931,938 ****
return generic_read_register_dummy (fi->pc, fi->frame, regnum);
else
#endif
! if (fi->fsr.regs[regnum] != 0)
! return read_memory_integer (fi->fsr.regs[regnum],
REGISTER_RAW_SIZE (regnum));
return read_register (regnum);
}
--- 948,955 ----
return generic_read_register_dummy (fi->pc, fi->frame, regnum);
else
#endif
! if (fi->saved_regs[regnum] != 0)
! return read_memory_integer (fi->saved_regs[regnum],
REGISTER_RAW_SIZE (regnum));
return read_register (regnum);
}
*************** arm_frame_chain (struct frame_info *fi)
*** 975,982 ****
return 0; /* in _start fn, don't chain further */
#endif
CORE_ADDR caller_pc, fn_start;
! struct frame_info caller_fi;
! int framereg = fi->framereg;
if (fi->pc < LOWEST_PC)
return 0;
--- 992,998 ----
return 0; /* in _start fn, don't chain further */
#endif
CORE_ADDR caller_pc, fn_start;
! int framereg = fi->extra_info->framereg;
if (fi->pc < LOWEST_PC)
return 0;
*************** arm_frame_chain (struct frame_info *fi)
*** 991,1002 ****
the frame register of the caller is different from ours.
So we must scan the prologue of the caller to determine its
frame register number. */
if (arm_pc_is_thumb (caller_pc) != arm_pc_is_thumb (fi->pc))
{
memset (&caller_fi, 0, sizeof (caller_fi));
caller_fi.pc = caller_pc;
arm_scan_prologue (&caller_fi);
! framereg = caller_fi.framereg;
}
/* If the caller used a frame register, return its value.
--- 1007,1030 ----
the frame register of the caller is different from ours.
So we must scan the prologue of the caller to determine its
frame register number. */
+ /* XXX Fixme, we should try to do this without creating a temporary
+ caller_fi. */
if (arm_pc_is_thumb (caller_pc) != arm_pc_is_thumb (fi->pc))
{
+ struct frame_info caller_fi;
+
memset (&caller_fi, 0, sizeof (caller_fi));
+ caller_fi.extra_info = (struct frame_extra_info *)
+ xcalloc (1, sizeof (struct frame_extra_info));
+ caller_fi.saved_regs = (CORE_ADDR *)
+ xcalloc (1, SIZEOF_FRAME_SAVED_REGS);
+
caller_fi.pc = caller_pc;
arm_scan_prologue (&caller_fi);
! framereg = caller_fi.extra_info->framereg;
!
! xfree(caller_fi.extra_info);
! xfree(caller_fi.saved_regs);
}
/* If the caller used a frame register, return its value.
*************** arm_frame_chain (struct frame_info *fi)
*** 1004,1010 ****
if (framereg == FP_REGNUM || framereg == THUMB_FP_REGNUM)
return arm_find_callers_reg (fi, framereg);
else
! return fi->frame + fi->framesize;
}
/* This function actually figures out the frame address for a given pc
--- 1032,1038 ----
if (framereg == FP_REGNUM || framereg == THUMB_FP_REGNUM)
return arm_find_callers_reg (fi, framereg);
else
! return fi->frame + fi->extra_info->framesize;
}
/* This function actually figures out the frame address for a given pc
*************** arm_init_extra_frame_info (int fromleaf,
*** 1022,1031 ****
int reg;
CORE_ADDR sp;
if (fi->next)
fi->pc = FRAME_SAVED_PC (fi->next);
! memset (fi->fsr.regs, '\000', sizeof fi->fsr.regs);
#if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
--- 1050,1069 ----
int reg;
CORE_ADDR sp;
+ if (fi->saved_regs == NULL)
+ frame_saved_regs_zalloc (fi);
+
+ fi->extra_info = (struct frame_extra_info *)
+ frame_obstack_alloc (sizeof (struct frame_extra_info));
+
+ fi->extra_info->framesize = 0;
+ fi->extra_info->frameoffset = 0;
+ fi->extra_info->framereg = 0;
+
if (fi->next)
fi->pc = FRAME_SAVED_PC (fi->next);
! memset (fi->saved_regs, '\000', sizeof fi->saved_regs);
#if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
*************** arm_init_extra_frame_info (int fromleaf,
*** 1033,1040 ****
/* We need to setup fi->frame here because run_stack_dummy gets it wrong
by assuming it's always FP. */
fi->frame = generic_read_register_dummy (fi->pc, fi->frame, SP_REGNUM);
! fi->framesize = 0;
! fi->frameoffset = 0;
return;
}
else
--- 1071,1078 ----
/* We need to setup fi->frame here because run_stack_dummy gets it wrong
by assuming it's always FP. */
fi->frame = generic_read_register_dummy (fi->pc, fi->frame, SP_REGNUM);
! fi->extra_info->framesize = 0;
! fi->extra_info->frameoffset = 0;
return;
}
else
*************** arm_init_extra_frame_info (int fromleaf,
*** 1045,1051 ****
if (!fi->next)
sp = read_sp();
else
! sp = fi->next->frame - fi->next->frameoffset + fi->next->framesize;
/* Determine whether or not we're in a sigtramp frame.
Unfortunately, it isn't sufficient to test
--- 1083,1090 ----
if (!fi->next)
sp = read_sp();
else
! sp = (fi->next->frame - fi->next->extra_info->frameoffset
! + fi->next->extra_info->framesize);
/* Determine whether or not we're in a sigtramp frame.
Unfortunately, it isn't sufficient to test
*************** arm_init_extra_frame_info (int fromleaf,
*** 1063,1076 ****
&& (fi->signal_handler_caller || IN_SIGTRAMP (fi->pc, (char *)0)))
{
for (reg = 0; reg < NUM_REGS; reg++)
! fi->fsr.regs[reg] = SIGCONTEXT_REGISTER_ADDRESS (sp, fi->pc, reg);
/* FIXME: What about thumb mode? */
! fi->framereg = SP_REGNUM;
! fi->frame = read_memory_integer (fi->fsr.regs[fi->framereg],
! REGISTER_RAW_SIZE (fi->framereg));
! fi->framesize = 0;
! fi->frameoffset = 0;
}
else if (PC_IN_CALL_DUMMY (fi->pc, sp, fi->frame))
--- 1102,1116 ----
&& (fi->signal_handler_caller || IN_SIGTRAMP (fi->pc, (char *)0)))
{
for (reg = 0; reg < NUM_REGS; reg++)
! fi->saved_regs[reg] = SIGCONTEXT_REGISTER_ADDRESS (sp, fi->pc, reg);
/* FIXME: What about thumb mode? */
! fi->extra_info->framereg = SP_REGNUM;
! fi->frame =
! read_memory_integer (fi->saved_regs[fi->extra_info->framereg],
! REGISTER_RAW_SIZE (fi->extra_info->framereg));
! fi->extra_info->framesize = 0;
! fi->extra_info->frameoffset = 0;
}
else if (PC_IN_CALL_DUMMY (fi->pc, sp, fi->frame))
*************** arm_init_extra_frame_info (int fromleaf,
*** 1082,1100 ****
rp = fi->frame - REGISTER_SIZE;
/* Fill in addresses of saved registers. */
! fi->fsr.regs[PS_REGNUM] = rp;
rp -= REGISTER_RAW_SIZE (PS_REGNUM);
for (reg = PC_REGNUM; reg >= 0; reg--)
{
! fi->fsr.regs[reg] = rp;
rp -= REGISTER_RAW_SIZE (reg);
}
! callers_sp = read_memory_integer (fi->fsr.regs[SP_REGNUM],
REGISTER_RAW_SIZE (SP_REGNUM));
! fi->framereg = FP_REGNUM;
! fi->framesize = callers_sp - sp;
! fi->frameoffset = fi->frame - sp;
}
else
{
--- 1122,1140 ----
rp = fi->frame - REGISTER_SIZE;
/* Fill in addresses of saved registers. */
! fi->saved_regs[PS_REGNUM] = rp;
rp -= REGISTER_RAW_SIZE (PS_REGNUM);
for (reg = PC_REGNUM; reg >= 0; reg--)
{
! fi->saved_regs[reg] = rp;
rp -= REGISTER_RAW_SIZE (reg);
}
! callers_sp = read_memory_integer (fi->saved_regs[SP_REGNUM],
REGISTER_RAW_SIZE (SP_REGNUM));
! fi->extra_info->framereg = FP_REGNUM;
! fi->extra_info->framesize = callers_sp - sp;
! fi->extra_info->frameoffset = fi->frame - sp;
}
else
{
*************** arm_init_extra_frame_info (int fromleaf,
*** 1102,1115 ****
if (!fi->next)
/* this is the innermost frame? */
! fi->frame = read_register (fi->framereg);
! else if (fi->framereg == FP_REGNUM || fi->framereg == THUMB_FP_REGNUM)
{
/* not the innermost frame */
/* If we have an FP, the callee saved it. */
! if (fi->next->fsr.regs[fi->framereg] != 0)
fi->frame =
! read_memory_integer (fi->next->fsr.regs[fi->framereg], 4);
else if (fromleaf)
/* If we were called by a frameless fn. then our frame is
still in the frame pointer register on the board... */
--- 1142,1157 ----
if (!fi->next)
/* this is the innermost frame? */
! fi->frame = read_register (fi->extra_info->framereg);
! else if (fi->extra_info->framereg == FP_REGNUM
! || fi->extra_info->framereg == THUMB_FP_REGNUM)
{
/* not the innermost frame */
/* If we have an FP, the callee saved it. */
! if (fi->next->saved_regs[fi->extra_info->framereg] != 0)
fi->frame =
! read_memory_integer (fi->next
! ->saved_regs[fi->extra_info->framereg], 4);
else if (fromleaf)
/* If we were called by a frameless fn. then our frame is
still in the frame pointer register on the board... */
*************** arm_init_extra_frame_info (int fromleaf,
*** 1119,1126 ****
/* Calculate actual addresses of saved registers using offsets
determined by arm_scan_prologue. */
for (reg = 0; reg < NUM_REGS; reg++)
! if (fi->fsr.regs[reg] != 0)
! fi->fsr.regs[reg] += fi->frame + fi->framesize - fi->frameoffset;
}
}
--- 1161,1169 ----
/* Calculate actual addresses of saved registers using offsets
determined by arm_scan_prologue. */
for (reg = 0; reg < NUM_REGS; reg++)
! if (fi->saved_regs[reg] != 0)
! fi->saved_regs[reg] += (fi->frame + fi->extra_info->framesize
! - fi->extra_info->frameoffset);
}
}
*************** arm_frame_saved_pc (struct frame_info *f
*** 1141,1149 ****
return generic_read_register_dummy (fi->pc, fi->frame, PC_REGNUM);
else
#endif
! if (PC_IN_CALL_DUMMY (fi->pc, fi->frame - fi->frameoffset, fi->frame))
{
! return read_memory_integer (fi->fsr.regs[PC_REGNUM], REGISTER_RAW_SIZE (PC_REGNUM));
}
else
{
--- 1184,1194 ----
return generic_read_register_dummy (fi->pc, fi->frame, PC_REGNUM);
else
#endif
! if (PC_IN_CALL_DUMMY (fi->pc, fi->frame - fi->extra_info->frameoffset,
! fi->frame))
{
! return read_memory_integer (fi->saved_regs[PC_REGNUM],
! REGISTER_RAW_SIZE (PC_REGNUM));
}
else
{
*************** arm_target_read_fp (void)
*** 1167,1176 ****
/* Calculate the frame offsets of the saved registers (ARM version). */
void
! arm_frame_find_saved_regs (struct frame_info *fi,
! struct frame_saved_regs *regaddr)
{
! memcpy (regaddr, &fi->fsr, sizeof (struct frame_saved_regs));
}
void
--- 1212,1224 ----
/* Calculate the frame offsets of the saved registers (ARM version). */
void
! arm_frame_init_saved_regs (struct frame_info *fip)
{
!
! if (fip->saved_regs)
! return;
!
! arm_init_extra_frame_info (0, fip);
}
void
*************** arm_pop_frame (void)
*** 1424,1435 ****
{
int regnum;
struct frame_info *frame = get_current_frame ();
! CORE_ADDR old_SP = frame->frame - frame->frameoffset + frame->framesize;
for (regnum = 0; regnum < NUM_REGS; regnum++)
! if (frame->fsr.regs[regnum] != 0)
write_register (regnum,
! read_memory_integer (frame->fsr.regs[regnum],
REGISTER_RAW_SIZE (regnum)));
write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
--- 1472,1484 ----
{
int regnum;
struct frame_info *frame = get_current_frame ();
! CORE_ADDR old_SP = (frame->frame - frame->extra_info->frameoffset
! + frame->extra_info->framesize);
for (regnum = 0; regnum < NUM_REGS; regnum++)
! if (frame->saved_regs[regnum] != 0)
write_register (regnum,
! read_memory_integer (frame->saved_regs[regnum],
REGISTER_RAW_SIZE (regnum)));
write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
Index: config/arm/tm-arm.h
===================================================================
RCS file: /cvs/src/src/gdb/config/arm/tm-arm.h,v
retrieving revision 1.13
diff -p -r1.13 tm-arm.h
*** tm-arm.h 2002/01/09 18:39:37 1.13
--- tm-arm.h 2002/01/11 20:53:11
*************** extern void convert_to_extended (void *d
*** 318,335 ****
#define VARIABLES_INSIDE_BLOCK(desc, gcc_p) (!(gcc_p))
- /* Define other aspects of the stack frame. We keep the offsets of
- all saved registers, 'cause we need 'em a lot! We also keep the
- current size of the stack frame, and the offset of the frame
- pointer from the stack pointer (for frameless functions, and when
- we're still in the prologue of a function with a frame) */
-
- #define EXTRA_FRAME_INFO \
- struct frame_saved_regs fsr; \
- int framesize; \
- int frameoffset; \
- int framereg;
-
extern void arm_init_extra_frame_info (int fromleaf, struct frame_info * fi);
#define INIT_EXTRA_FRAME_INFO(fromleaf, fi) \
arm_init_extra_frame_info ((fromleaf), (fi))
--- 318,323 ----
*************** extern CORE_ADDR arm_frame_saved_pc (str
*** 399,412 ****
This includes special registers such as pc and fp saved in special
ways in the stack frame. sp is even more special: the address we
return for it IS the sp for the next frame. */
-
- struct frame_saved_regs;
- struct frame_info;
- void arm_frame_find_saved_regs (struct frame_info * fi,
- struct frame_saved_regs * fsr);
! #define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \
! arm_frame_find_saved_regs (frame_info, &(frame_saved_regs));
/* Things needed for making the inferior call functions. */
--- 387,396 ----
This includes special registers such as pc and fp saved in special
ways in the stack frame. sp is even more special: the address we
return for it IS the sp for the next frame. */
! void arm_frame_init_saved_regs (struct frame_info *);
! #define FRAME_INIT_SAVED_REGS(frame_info) \
! arm_frame_init_saved_regs (frame_info);
/* Things needed for making the inferior call functions. */