This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [PATCH RFA] Zap EXTRA_FRAME_INFO for ARM target
- From: Richard Earnshaw <rearnsha at arm dot com>
- To: Andrew Cagney <ac131313 at cygnus dot com>
- Cc: Kevin Buettner <kevinb at redhat dot com>, Richard Earnshaw <Richard dot Earnshaw at arm dot com>, Fernando Nasser <fnasser at redhat dot com>, Scott Bambrough <sbambrough at zimismobile dot com>, gdb-patches at sources dot redhat dot com
- Date: Mon, 21 Jan 2002 16:29:49 +0000
- Subject: Re: [PATCH RFA] Zap EXTRA_FRAME_INFO for ARM target
- Organization: ARM Ltd.
- Reply-to: Richard dot Earnshaw at arm dot com
> With that in mind I think either Kevin's or Richard's EXTRA_FRAME_INFO
> patch (minus any dependencies) should be committed. The only proviso
> being that they are before/after tested and show no regressions.
Ok, with that in mind I've committed the following. It's basically my
patch plus a couple of bits lifted from Kevin's.
R.
2002-01-21 Richard Earnshaw <rearnsha@arm.com>
Kevin Buettner <kevinb@redhat.com>
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, save_prologue_cache): Likewise.
(_initialize_arm_tdep): Ensure prologue_cache is correctly set up.
* 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/21 15:50:21
***************
*** 1,6 ****
/* Common target dependent code for GDB on ARM systems.
Copyright 1988, 1989, 1991, 1992, 1993, 1995, 1996, 1998, 1999, 2000,
! 2001 Free Software Foundation, Inc.
This file is part of GDB.
--- 1,6 ----
/* Common target dependent code for GDB on ARM systems.
Copyright 1988, 1989, 1991, 1992, 1993, 1995, 1996, 1998, 1999, 2000,
! 2001, 2002 Free Software Foundation, Inc.
This file is part of GDB.
*************** 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
*** 627,637 ****
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
--- 628,638 ----
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 *
*** 647,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];
}
--- 648,659 ----
int i;
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))
--- 736,744 ----
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 */
--- 841,847 ----
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 */
{
--- 850,856 ----
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!] */
{
--- 863,869 ----
{
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)
--- 890,896 ----
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);
}
--- 906,916 ----
/* 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);
}
--- 932,939 ----
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;
--- 976,982 ----
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.
--- 991,1021 ----
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;
+ struct cleanup *old_chain;
+
+ /* Create a temporary frame suitable for scanning the caller's
+ prologue. (Ugh.) */
memset (&caller_fi, 0, sizeof (caller_fi));
+ caller_fi.extra_info = (struct frame_extra_info *)
+ xcalloc (1, sizeof (struct frame_extra_info));
+ old_chain = make_cleanup (xfree, caller_fi.extra_info);
+ caller_fi.saved_regs = (CORE_ADDR *)
+ xcalloc (1, SIZEOF_FRAME_SAVED_REGS);
+ make_cleanup (xfree, caller_fi.saved_regs);
+
+ /* Now, scan the prologue and obtain the frame register. */
caller_fi.pc = caller_pc;
arm_scan_prologue (&caller_fi);
! framereg = caller_fi.extra_info->framereg;
!
! /* Deallocate the storage associated with the temporary frame
! created above. */
! do_cleanups (old_chain);
}
/* 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
--- 1023,1029 ----
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))
--- 1041,1060 ----
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
--- 1062,1069 ----
/* 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
--- 1074,1081 ----
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))
--- 1093,1107 ----
&& (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
{
--- 1113,1131 ----
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... */
--- 1133,1148 ----
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;
}
}
--- 1152,1160 ----
/* 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
{
--- 1175,1185 ----
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
--- 1203,1215 ----
/* 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));
--- 1463,1475 ----
{
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));
*************** The valid values are:\n");
*** 2240,2245 ****
--- 2280,2291 ----
add_com ("othernames", class_obscure, arm_othernames,
"Switch to the next set of register names.");
+
+ /* Fill in the prologue_cache fields. */
+ 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);
}
/* Test whether the coff symbol specific value corresponds to a Thumb