2003-01-08 Andrew Cagney <cagney@redhat.com>
* alpha-tdep.c: Use get_frame_extra_info. * arm-tdep.c, avr-tdep.c, cris-tdep.c, d10v-tdep.c: Ditto. * h8300-tdep.c, ia64-tdep.c, m68hc11-tdep.c, mcore-tdep.c: Ditto. * mips-tdep.c, mn10300-tdep.c, s390-tdep.c, sh-tdep.c: Ditto. * sparc-tdep.c, xstormy16-tdep.c: Ditto.
This commit is contained in:
parent
45a15d6f78
commit
da50a4b7b3
16 changed files with 383 additions and 352 deletions
|
@ -1,5 +1,11 @@
|
||||||
2003-01-08 Andrew Cagney <cagney@redhat.com>
|
2003-01-08 Andrew Cagney <cagney@redhat.com>
|
||||||
|
|
||||||
|
* alpha-tdep.c: Use get_frame_extra_info.
|
||||||
|
* arm-tdep.c, avr-tdep.c, cris-tdep.c, d10v-tdep.c: Ditto.
|
||||||
|
* h8300-tdep.c, ia64-tdep.c, m68hc11-tdep.c, mcore-tdep.c: Ditto.
|
||||||
|
* mips-tdep.c, mn10300-tdep.c, s390-tdep.c, sh-tdep.c: Ditto.
|
||||||
|
* sparc-tdep.c, xstormy16-tdep.c: Ditto.
|
||||||
|
|
||||||
* alpha-tdep.c: Use get_next_frame.
|
* alpha-tdep.c: Use get_next_frame.
|
||||||
* arm-tdep.c, avr-tdep.c, cris-tdep.c, d10v-tdep.c: Ditto.
|
* arm-tdep.c, avr-tdep.c, cris-tdep.c, d10v-tdep.c: Ditto.
|
||||||
* dwarf2cfi.c, h8300-tdep.c, i386-tdep.c, ia64-tdep.c: Ditto.
|
* dwarf2cfi.c, h8300-tdep.c, i386-tdep.c, ia64-tdep.c: Ditto.
|
||||||
|
|
|
@ -401,7 +401,7 @@ alpha_find_saved_regs (struct frame_info *frame)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
proc_desc = frame->extra_info->proc_desc;
|
proc_desc = get_frame_extra_info (frame)->proc_desc;
|
||||||
if (proc_desc == NULL)
|
if (proc_desc == NULL)
|
||||||
/* I'm not sure how/whether this can happen. Normally when we can't
|
/* I'm not sure how/whether this can happen. Normally when we can't
|
||||||
find a proc_desc, we "synthesize" one using heuristic_proc_desc
|
find a proc_desc, we "synthesize" one using heuristic_proc_desc
|
||||||
|
@ -488,11 +488,12 @@ read_next_frame_reg (struct frame_info *fi, int regno)
|
||||||
static CORE_ADDR
|
static CORE_ADDR
|
||||||
alpha_frame_saved_pc (struct frame_info *frame)
|
alpha_frame_saved_pc (struct frame_info *frame)
|
||||||
{
|
{
|
||||||
alpha_extra_func_info_t proc_desc = frame->extra_info->proc_desc;
|
alpha_extra_func_info_t proc_desc = get_frame_extra_info (frame)->proc_desc;
|
||||||
/* We have to get the saved pc from the sigcontext
|
/* We have to get the saved pc from the sigcontext
|
||||||
if it is a signal handler frame. */
|
if it is a signal handler frame. */
|
||||||
int pcreg = (get_frame_type (frame) == SIGTRAMP_FRAME) ? PC_REGNUM
|
int pcreg = ((get_frame_type (frame) == SIGTRAMP_FRAME)
|
||||||
: frame->extra_info->pc_reg;
|
? PC_REGNUM
|
||||||
|
: get_frame_extra_info (frame)->pc_reg);
|
||||||
|
|
||||||
if (proc_desc && PROC_DESC_IS_DUMMY (proc_desc))
|
if (proc_desc && PROC_DESC_IS_DUMMY (proc_desc))
|
||||||
return read_memory_integer (get_frame_base (frame) - 8, 8);
|
return read_memory_integer (get_frame_base (frame) - 8, 8);
|
||||||
|
@ -967,12 +968,12 @@ void
|
||||||
alpha_print_extra_frame_info (struct frame_info *fi)
|
alpha_print_extra_frame_info (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
if (fi
|
if (fi
|
||||||
&& fi->extra_info
|
&& get_frame_extra_info (fi)
|
||||||
&& fi->extra_info->proc_desc
|
&& get_frame_extra_info (fi)->proc_desc
|
||||||
&& fi->extra_info->proc_desc->pdr.framereg < NUM_REGS)
|
&& get_frame_extra_info (fi)->proc_desc->pdr.framereg < NUM_REGS)
|
||||||
printf_filtered (" frame pointer is at %s+%s\n",
|
printf_filtered (" frame pointer is at %s+%s\n",
|
||||||
REGISTER_NAME (fi->extra_info->proc_desc->pdr.framereg),
|
REGISTER_NAME (get_frame_extra_info (fi)->proc_desc->pdr.framereg),
|
||||||
paddr_d (fi->extra_info->proc_desc->pdr.frameoffset));
|
paddr_d (get_frame_extra_info (fi)->proc_desc->pdr.frameoffset));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -989,16 +990,16 @@ alpha_init_extra_frame_info (int fromleaf, struct frame_info *frame)
|
||||||
/* NOTE: cagney/2003-01-03: No need to set saved_regs to NULL,
|
/* NOTE: cagney/2003-01-03: No need to set saved_regs to NULL,
|
||||||
always NULL by default. */
|
always NULL by default. */
|
||||||
/* frame->saved_regs = NULL; */
|
/* frame->saved_regs = NULL; */
|
||||||
frame->extra_info->localoff = 0;
|
get_frame_extra_info (frame)->localoff = 0;
|
||||||
frame->extra_info->pc_reg = ALPHA_RA_REGNUM;
|
get_frame_extra_info (frame)->pc_reg = ALPHA_RA_REGNUM;
|
||||||
frame->extra_info->proc_desc = proc_desc == &temp_proc_desc ? 0 : proc_desc;
|
get_frame_extra_info (frame)->proc_desc = proc_desc == &temp_proc_desc ? 0 : proc_desc;
|
||||||
if (proc_desc)
|
if (proc_desc)
|
||||||
{
|
{
|
||||||
/* Get the locals offset and the saved pc register from the
|
/* Get the locals offset and the saved pc register from the
|
||||||
procedure descriptor, they are valid even if we are in the
|
procedure descriptor, they are valid even if we are in the
|
||||||
middle of the prologue. */
|
middle of the prologue. */
|
||||||
frame->extra_info->localoff = PROC_LOCALOFF (proc_desc);
|
get_frame_extra_info (frame)->localoff = PROC_LOCALOFF (proc_desc);
|
||||||
frame->extra_info->pc_reg = PROC_PC_REG (proc_desc);
|
get_frame_extra_info (frame)->pc_reg = PROC_PC_REG (proc_desc);
|
||||||
|
|
||||||
/* Fixup frame-pointer - only needed for top frame */
|
/* Fixup frame-pointer - only needed for top frame */
|
||||||
|
|
||||||
|
@ -1045,7 +1046,7 @@ alpha_init_extra_frame_info (int fromleaf, struct frame_info *frame)
|
||||||
static CORE_ADDR
|
static CORE_ADDR
|
||||||
alpha_frame_locals_address (struct frame_info *fi)
|
alpha_frame_locals_address (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
return (get_frame_base (fi) - fi->extra_info->localoff);
|
return (get_frame_base (fi) - get_frame_extra_info (fi)->localoff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static CORE_ADDR
|
static CORE_ADDR
|
||||||
|
@ -1293,7 +1294,7 @@ alpha_pop_frame (void)
|
||||||
struct frame_info *frame = get_current_frame ();
|
struct frame_info *frame = get_current_frame ();
|
||||||
CORE_ADDR new_sp = get_frame_base (frame);
|
CORE_ADDR new_sp = get_frame_base (frame);
|
||||||
|
|
||||||
alpha_extra_func_info_t proc_desc = frame->extra_info->proc_desc;
|
alpha_extra_func_info_t proc_desc = get_frame_extra_info (frame)->proc_desc;
|
||||||
|
|
||||||
/* we need proc_desc to know how to restore the registers;
|
/* we need proc_desc to know how to restore the registers;
|
||||||
if it is NULL, construct (a temporary) one */
|
if it is NULL, construct (a temporary) one */
|
||||||
|
|
|
@ -568,7 +568,7 @@ thumb_scan_prologue (struct frame_info *fi)
|
||||||
frame pointer, adjust the stack pointer, and save registers.
|
frame pointer, adjust the stack pointer, and save registers.
|
||||||
Do this until all basic prolog instructions are found. */
|
Do this until all basic prolog instructions are found. */
|
||||||
|
|
||||||
fi->extra_info->framesize = 0;
|
get_frame_extra_info (fi)->framesize = 0;
|
||||||
for (current_pc = prologue_start;
|
for (current_pc = prologue_start;
|
||||||
(current_pc < prologue_end) && ((findmask & 7) != 7);
|
(current_pc < prologue_end) && ((findmask & 7) != 7);
|
||||||
current_pc += 2)
|
current_pc += 2)
|
||||||
|
@ -591,9 +591,9 @@ thumb_scan_prologue (struct frame_info *fi)
|
||||||
for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
|
for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
|
||||||
if (mask & (1 << regno))
|
if (mask & (1 << regno))
|
||||||
{
|
{
|
||||||
fi->extra_info->framesize += 4;
|
get_frame_extra_info (fi)->framesize += 4;
|
||||||
get_frame_saved_regs (fi)[saved_reg[regno]] =
|
get_frame_saved_regs (fi)[saved_reg[regno]] =
|
||||||
-(fi->extra_info->framesize);
|
-(get_frame_extra_info (fi)->framesize);
|
||||||
/* Reset saved register map. */
|
/* Reset saved register map. */
|
||||||
saved_reg[regno] = regno;
|
saved_reg[regno] = regno;
|
||||||
}
|
}
|
||||||
|
@ -609,23 +609,23 @@ thumb_scan_prologue (struct frame_info *fi)
|
||||||
offset = (insn & 0x7f) << 2; /* get scaled offset */
|
offset = (insn & 0x7f) << 2; /* get scaled offset */
|
||||||
if (insn & 0x80) /* is it signed? (==subtracting) */
|
if (insn & 0x80) /* is it signed? (==subtracting) */
|
||||||
{
|
{
|
||||||
fi->extra_info->frameoffset += offset;
|
get_frame_extra_info (fi)->frameoffset += offset;
|
||||||
offset = -offset;
|
offset = -offset;
|
||||||
}
|
}
|
||||||
fi->extra_info->framesize -= offset;
|
get_frame_extra_info (fi)->framesize -= offset;
|
||||||
}
|
}
|
||||||
else if ((insn & 0xff00) == 0xaf00) /* add r7, sp, #imm */
|
else if ((insn & 0xff00) == 0xaf00) /* add r7, sp, #imm */
|
||||||
{
|
{
|
||||||
findmask |= 2; /* setting of r7 found */
|
findmask |= 2; /* setting of r7 found */
|
||||||
fi->extra_info->framereg = THUMB_FP_REGNUM;
|
get_frame_extra_info (fi)->framereg = THUMB_FP_REGNUM;
|
||||||
/* get scaled offset */
|
/* get scaled offset */
|
||||||
fi->extra_info->frameoffset = (insn & 0xff) << 2;
|
get_frame_extra_info (fi)->frameoffset = (insn & 0xff) << 2;
|
||||||
}
|
}
|
||||||
else if (insn == 0x466f) /* mov r7, sp */
|
else if (insn == 0x466f) /* mov r7, sp */
|
||||||
{
|
{
|
||||||
findmask |= 2; /* setting of r7 found */
|
findmask |= 2; /* setting of r7 found */
|
||||||
fi->extra_info->framereg = THUMB_FP_REGNUM;
|
get_frame_extra_info (fi)->framereg = THUMB_FP_REGNUM;
|
||||||
fi->extra_info->frameoffset = 0;
|
get_frame_extra_info (fi)->frameoffset = 0;
|
||||||
saved_reg[THUMB_FP_REGNUM] = ARM_SP_REGNUM;
|
saved_reg[THUMB_FP_REGNUM] = ARM_SP_REGNUM;
|
||||||
}
|
}
|
||||||
else if ((insn & 0xffc0) == 0x4640) /* mov r0-r7, r8-r15 */
|
else if ((insn & 0xffc0) == 0x4640) /* mov r0-r7, r8-r15 */
|
||||||
|
@ -667,9 +667,9 @@ check_prologue_cache (struct frame_info *fi)
|
||||||
|
|
||||||
if (get_frame_pc (fi) == get_frame_pc (prologue_cache))
|
if (get_frame_pc (fi) == get_frame_pc (prologue_cache))
|
||||||
{
|
{
|
||||||
fi->extra_info->framereg = prologue_cache->extra_info->framereg;
|
get_frame_extra_info (fi)->framereg = get_frame_extra_info (prologue_cache)->framereg;
|
||||||
fi->extra_info->framesize = prologue_cache->extra_info->framesize;
|
get_frame_extra_info (fi)->framesize = get_frame_extra_info (prologue_cache)->framesize;
|
||||||
fi->extra_info->frameoffset = prologue_cache->extra_info->frameoffset;
|
get_frame_extra_info (fi)->frameoffset = get_frame_extra_info (prologue_cache)->frameoffset;
|
||||||
for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
|
for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
|
||||||
get_frame_saved_regs (fi)[i] = get_frame_saved_regs (prologue_cache)[i];
|
get_frame_saved_regs (fi)[i] = get_frame_saved_regs (prologue_cache)[i];
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -687,9 +687,9 @@ save_prologue_cache (struct frame_info *fi)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
deprecated_update_frame_pc_hack (prologue_cache, get_frame_pc (fi));
|
deprecated_update_frame_pc_hack (prologue_cache, get_frame_pc (fi));
|
||||||
prologue_cache->extra_info->framereg = fi->extra_info->framereg;
|
get_frame_extra_info (prologue_cache)->framereg = get_frame_extra_info (fi)->framereg;
|
||||||
prologue_cache->extra_info->framesize = fi->extra_info->framesize;
|
get_frame_extra_info (prologue_cache)->framesize = get_frame_extra_info (fi)->framesize;
|
||||||
prologue_cache->extra_info->frameoffset = fi->extra_info->frameoffset;
|
get_frame_extra_info (prologue_cache)->frameoffset = get_frame_extra_info (fi)->frameoffset;
|
||||||
|
|
||||||
for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
|
for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
|
||||||
get_frame_saved_regs (prologue_cache)[i] = get_frame_saved_regs (fi)[i];
|
get_frame_saved_regs (prologue_cache)[i] = get_frame_saved_regs (fi)[i];
|
||||||
|
@ -775,9 +775,9 @@ arm_scan_prologue (struct frame_info *fi)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Assume there is no frame until proven otherwise. */
|
/* Assume there is no frame until proven otherwise. */
|
||||||
fi->extra_info->framereg = ARM_SP_REGNUM;
|
get_frame_extra_info (fi)->framereg = ARM_SP_REGNUM;
|
||||||
fi->extra_info->framesize = 0;
|
get_frame_extra_info (fi)->framesize = 0;
|
||||||
fi->extra_info->frameoffset = 0;
|
get_frame_extra_info (fi)->frameoffset = 0;
|
||||||
|
|
||||||
/* Check for Thumb prologue. */
|
/* Check for Thumb prologue. */
|
||||||
if (arm_pc_is_thumb (get_frame_pc (fi)))
|
if (arm_pc_is_thumb (get_frame_pc (fi)))
|
||||||
|
@ -914,7 +914,7 @@ arm_scan_prologue (struct frame_info *fi)
|
||||||
unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
|
unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
|
||||||
imm = (imm >> rot) | (imm << (32 - rot));
|
imm = (imm >> rot) | (imm << (32 - rot));
|
||||||
fp_offset = -imm;
|
fp_offset = -imm;
|
||||||
fi->extra_info->framereg = ARM_FP_REGNUM;
|
get_frame_extra_info (fi)->framereg = ARM_FP_REGNUM;
|
||||||
}
|
}
|
||||||
else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
|
else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
|
||||||
{
|
{
|
||||||
|
@ -970,11 +970,11 @@ arm_scan_prologue (struct frame_info *fi)
|
||||||
/* The frame size is just the negative of the offset (from the
|
/* The frame size is just the negative of the offset (from the
|
||||||
original SP) of the last thing thing we pushed on the stack.
|
original SP) of the last thing thing we pushed on the stack.
|
||||||
The frame offset is [new FP] - [new SP]. */
|
The frame offset is [new FP] - [new SP]. */
|
||||||
fi->extra_info->framesize = -sp_offset;
|
get_frame_extra_info (fi)->framesize = -sp_offset;
|
||||||
if (fi->extra_info->framereg == ARM_FP_REGNUM)
|
if (get_frame_extra_info (fi)->framereg == ARM_FP_REGNUM)
|
||||||
fi->extra_info->frameoffset = fp_offset - sp_offset;
|
get_frame_extra_info (fi)->frameoffset = fp_offset - sp_offset;
|
||||||
else
|
else
|
||||||
fi->extra_info->frameoffset = 0;
|
get_frame_extra_info (fi)->frameoffset = 0;
|
||||||
|
|
||||||
save_prologue_cache (fi);
|
save_prologue_cache (fi);
|
||||||
}
|
}
|
||||||
|
@ -1022,7 +1022,7 @@ static CORE_ADDR
|
||||||
arm_frame_chain (struct frame_info *fi)
|
arm_frame_chain (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
CORE_ADDR caller_pc;
|
CORE_ADDR caller_pc;
|
||||||
int framereg = fi->extra_info->framereg;
|
int framereg = get_frame_extra_info (fi)->framereg;
|
||||||
|
|
||||||
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), 0, 0))
|
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), 0, 0))
|
||||||
/* A generic call dummy's frame is the same as caller's. */
|
/* A generic call dummy's frame is the same as caller's. */
|
||||||
|
@ -1050,7 +1050,7 @@ arm_frame_chain (struct frame_info *fi)
|
||||||
/* Now, scan the prologue and obtain the frame register. */
|
/* Now, scan the prologue and obtain the frame register. */
|
||||||
deprecated_update_frame_pc_hack (caller_fi, caller_pc);
|
deprecated_update_frame_pc_hack (caller_fi, caller_pc);
|
||||||
arm_scan_prologue (caller_fi);
|
arm_scan_prologue (caller_fi);
|
||||||
framereg = caller_fi->extra_info->framereg;
|
framereg = get_frame_extra_info (caller_fi)->framereg;
|
||||||
|
|
||||||
/* Deallocate the storage associated with the temporary frame
|
/* Deallocate the storage associated with the temporary frame
|
||||||
created above. */
|
created above. */
|
||||||
|
@ -1062,7 +1062,7 @@ arm_frame_chain (struct frame_info *fi)
|
||||||
if (framereg == ARM_FP_REGNUM || framereg == THUMB_FP_REGNUM)
|
if (framereg == ARM_FP_REGNUM || framereg == THUMB_FP_REGNUM)
|
||||||
return arm_find_callers_reg (fi, framereg);
|
return arm_find_callers_reg (fi, framereg);
|
||||||
else
|
else
|
||||||
return get_frame_base (fi) + fi->extra_info->framesize;
|
return get_frame_base (fi) + get_frame_extra_info (fi)->framesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function actually figures out the frame address for a given pc
|
/* This function actually figures out the frame address for a given pc
|
||||||
|
@ -1085,9 +1085,9 @@ arm_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
|
|
||||||
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
||||||
|
|
||||||
fi->extra_info->framesize = 0;
|
get_frame_extra_info (fi)->framesize = 0;
|
||||||
fi->extra_info->frameoffset = 0;
|
get_frame_extra_info (fi)->frameoffset = 0;
|
||||||
fi->extra_info->framereg = 0;
|
get_frame_extra_info (fi)->framereg = 0;
|
||||||
|
|
||||||
if (get_next_frame (fi))
|
if (get_next_frame (fi))
|
||||||
deprecated_update_frame_pc_hack (fi, FRAME_SAVED_PC (get_next_frame (fi)));
|
deprecated_update_frame_pc_hack (fi, FRAME_SAVED_PC (get_next_frame (fi)));
|
||||||
|
@ -1105,8 +1105,9 @@ arm_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
get_frame_base (get_next_frame (fi)),
|
get_frame_base (get_next_frame (fi)),
|
||||||
ARM_SP_REGNUM);
|
ARM_SP_REGNUM);
|
||||||
else
|
else
|
||||||
sp = (get_frame_base (get_next_frame (fi)) - get_next_frame (fi)->extra_info->frameoffset
|
sp = (get_frame_base (get_next_frame (fi))
|
||||||
+ get_next_frame (fi)->extra_info->framesize);
|
- get_frame_extra_info (get_next_frame (fi))->frameoffset
|
||||||
|
+ get_frame_extra_info (get_next_frame (fi))->framesize);
|
||||||
|
|
||||||
/* Determine whether or not we're in a sigtramp frame.
|
/* Determine whether or not we're in a sigtramp frame.
|
||||||
Unfortunately, it isn't sufficient to test (get_frame_type (fi)
|
Unfortunately, it isn't sufficient to test (get_frame_type (fi)
|
||||||
|
@ -1132,10 +1133,10 @@ arm_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
get_frame_saved_regs (fi)[reg] = SIGCONTEXT_REGISTER_ADDRESS (sp, get_frame_pc (fi), reg);
|
get_frame_saved_regs (fi)[reg] = SIGCONTEXT_REGISTER_ADDRESS (sp, get_frame_pc (fi), reg);
|
||||||
|
|
||||||
/* FIXME: What about thumb mode? */
|
/* FIXME: What about thumb mode? */
|
||||||
fi->extra_info->framereg = ARM_SP_REGNUM;
|
get_frame_extra_info (fi)->framereg = ARM_SP_REGNUM;
|
||||||
deprecated_update_frame_base_hack (fi, read_memory_integer (get_frame_saved_regs (fi)[fi->extra_info->framereg], REGISTER_RAW_SIZE (fi->extra_info->framereg)));
|
deprecated_update_frame_base_hack (fi, read_memory_integer (get_frame_saved_regs (fi)[get_frame_extra_info (fi)->framereg], REGISTER_RAW_SIZE (get_frame_extra_info (fi)->framereg)));
|
||||||
fi->extra_info->framesize = 0;
|
get_frame_extra_info (fi)->framesize = 0;
|
||||||
fi->extra_info->frameoffset = 0;
|
get_frame_extra_info (fi)->frameoffset = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1144,18 +1145,18 @@ arm_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
|
|
||||||
if (!get_next_frame (fi))
|
if (!get_next_frame (fi))
|
||||||
/* This is the innermost frame? */
|
/* This is the innermost frame? */
|
||||||
deprecated_update_frame_base_hack (fi, read_register (fi->extra_info->framereg));
|
deprecated_update_frame_base_hack (fi, read_register (get_frame_extra_info (fi)->framereg));
|
||||||
else if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (get_next_frame (fi)), 0, 0))
|
else if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (get_next_frame (fi)), 0, 0))
|
||||||
/* Next inner most frame is a dummy, just grab its frame.
|
/* Next inner most frame is a dummy, just grab its frame.
|
||||||
Dummy frames always have the same FP as their caller. */
|
Dummy frames always have the same FP as their caller. */
|
||||||
deprecated_update_frame_base_hack (fi, get_frame_base (get_next_frame (fi)));
|
deprecated_update_frame_base_hack (fi, get_frame_base (get_next_frame (fi)));
|
||||||
else if (fi->extra_info->framereg == ARM_FP_REGNUM
|
else if (get_frame_extra_info (fi)->framereg == ARM_FP_REGNUM
|
||||||
|| fi->extra_info->framereg == THUMB_FP_REGNUM)
|
|| get_frame_extra_info (fi)->framereg == THUMB_FP_REGNUM)
|
||||||
{
|
{
|
||||||
/* not the innermost frame */
|
/* not the innermost frame */
|
||||||
/* If we have an FP, the callee saved it. */
|
/* If we have an FP, the callee saved it. */
|
||||||
if (get_frame_saved_regs (get_next_frame (fi))[fi->extra_info->framereg] != 0)
|
if (get_frame_saved_regs (get_next_frame (fi))[get_frame_extra_info (fi)->framereg] != 0)
|
||||||
deprecated_update_frame_base_hack (fi, read_memory_integer (get_frame_saved_regs (get_next_frame (fi))[fi->extra_info->framereg], 4));
|
deprecated_update_frame_base_hack (fi, read_memory_integer (get_frame_saved_regs (get_next_frame (fi))[get_frame_extra_info (fi)->framereg], 4));
|
||||||
else if (fromleaf)
|
else if (fromleaf)
|
||||||
/* If we were called by a frameless fn. then our frame is
|
/* If we were called by a frameless fn. then our frame is
|
||||||
still in the frame pointer register on the board... */
|
still in the frame pointer register on the board... */
|
||||||
|
@ -1166,9 +1167,10 @@ arm_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
determined by arm_scan_prologue. */
|
determined by arm_scan_prologue. */
|
||||||
for (reg = 0; reg < NUM_REGS; reg++)
|
for (reg = 0; reg < NUM_REGS; reg++)
|
||||||
if (get_frame_saved_regs (fi)[reg] != 0)
|
if (get_frame_saved_regs (fi)[reg] != 0)
|
||||||
get_frame_saved_regs (fi)[reg] += (get_frame_base (fi)
|
get_frame_saved_regs (fi)[reg]
|
||||||
+ fi->extra_info->framesize
|
+= (get_frame_base (fi)
|
||||||
- fi->extra_info->frameoffset);
|
+ get_frame_extra_info (fi)->framesize
|
||||||
|
- get_frame_extra_info (fi)->frameoffset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1191,7 +1193,7 @@ arm_frame_saved_pc (struct frame_info *fi)
|
||||||
|
|
||||||
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi),
|
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi),
|
||||||
(get_frame_base (fi)
|
(get_frame_base (fi)
|
||||||
- fi->extra_info->frameoffset),
|
- get_frame_extra_info (fi)->frameoffset),
|
||||||
get_frame_base (fi)))
|
get_frame_base (fi)))
|
||||||
{
|
{
|
||||||
return read_memory_integer (get_frame_saved_regs (fi)[ARM_PC_REGNUM],
|
return read_memory_integer (get_frame_saved_regs (fi)[ARM_PC_REGNUM],
|
||||||
|
@ -1514,8 +1516,9 @@ arm_pop_frame (void)
|
||||||
{
|
{
|
||||||
int regnum;
|
int regnum;
|
||||||
struct frame_info *frame = get_current_frame ();
|
struct frame_info *frame = get_current_frame ();
|
||||||
CORE_ADDR old_SP = (get_frame_base (frame) - frame->extra_info->frameoffset
|
CORE_ADDR old_SP = (get_frame_base (frame)
|
||||||
+ frame->extra_info->framesize);
|
- get_frame_extra_info (frame)->frameoffset
|
||||||
|
+ get_frame_extra_info (frame)->framesize);
|
||||||
|
|
||||||
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
|
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
|
||||||
get_frame_base (frame),
|
get_frame_base (frame),
|
||||||
|
|
|
@ -469,7 +469,7 @@ avr_scan_prologue (struct frame_info *fi)
|
||||||
unsigned char prologue[AVR_MAX_PROLOGUE_SIZE];
|
unsigned char prologue[AVR_MAX_PROLOGUE_SIZE];
|
||||||
int vpc = 0;
|
int vpc = 0;
|
||||||
|
|
||||||
fi->extra_info->framereg = AVR_SP_REGNUM;
|
get_frame_extra_info (fi)->framereg = AVR_SP_REGNUM;
|
||||||
|
|
||||||
if (find_pc_partial_function
|
if (find_pc_partial_function
|
||||||
(get_frame_pc (fi), &name, &prologue_start, &prologue_end))
|
(get_frame_pc (fi), &name, &prologue_start, &prologue_end))
|
||||||
|
@ -491,7 +491,7 @@ avr_scan_prologue (struct frame_info *fi)
|
||||||
/* Search the prologue looking for instructions that set up the
|
/* Search the prologue looking for instructions that set up the
|
||||||
frame pointer, adjust the stack pointer, and save registers. */
|
frame pointer, adjust the stack pointer, and save registers. */
|
||||||
|
|
||||||
fi->extra_info->framesize = 0;
|
get_frame_extra_info (fi)->framesize = 0;
|
||||||
prologue_len = prologue_end - prologue_start;
|
prologue_len = prologue_end - prologue_start;
|
||||||
read_memory (prologue_start, prologue, prologue_len);
|
read_memory (prologue_start, prologue, prologue_len);
|
||||||
|
|
||||||
|
@ -509,7 +509,7 @@ avr_scan_prologue (struct frame_info *fi)
|
||||||
0xcd, 0xbf /* out __SP_L__,r28 */
|
0xcd, 0xbf /* out __SP_L__,r28 */
|
||||||
};
|
};
|
||||||
|
|
||||||
fi->extra_info->framereg = AVR_FP_REGNUM;
|
get_frame_extra_info (fi)->framereg = AVR_FP_REGNUM;
|
||||||
insn = EXTRACT_INSN (&prologue[vpc]);
|
insn = EXTRACT_INSN (&prologue[vpc]);
|
||||||
/* ldi r28,lo8(<RAM_ADDR> - <LOCALS_SIZE>) */
|
/* ldi r28,lo8(<RAM_ADDR> - <LOCALS_SIZE>) */
|
||||||
if ((insn & 0xf0f0) == 0xe0c0)
|
if ((insn & 0xf0f0) == 0xe0c0)
|
||||||
|
@ -524,7 +524,7 @@ avr_scan_prologue (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
deprecated_update_frame_base_hack (fi, locals);
|
deprecated_update_frame_base_hack (fi, locals);
|
||||||
|
|
||||||
fi->extra_info->is_main = 1;
|
get_frame_extra_info (fi)->is_main = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -601,9 +601,9 @@ avr_scan_prologue (struct frame_info *fi)
|
||||||
from <= AVR_LAST_PUSHED_REGNUM; ++from)
|
from <= AVR_LAST_PUSHED_REGNUM; ++from)
|
||||||
get_frame_saved_regs (fi)[from] = ++i;
|
get_frame_saved_regs (fi)[from] = ++i;
|
||||||
}
|
}
|
||||||
fi->extra_info->locals_size = loc_size;
|
get_frame_extra_info (fi)->locals_size = loc_size;
|
||||||
fi->extra_info->framesize = loc_size + num_pushes;
|
get_frame_extra_info (fi)->framesize = loc_size + num_pushes;
|
||||||
fi->extra_info->framereg = AVR_FP_REGNUM;
|
get_frame_extra_info (fi)->framereg = AVR_FP_REGNUM;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -624,14 +624,14 @@ avr_scan_prologue (struct frame_info *fi)
|
||||||
vpc += sizeof (img);
|
vpc += sizeof (img);
|
||||||
get_frame_saved_regs (fi)[0] = 2;
|
get_frame_saved_regs (fi)[0] = 2;
|
||||||
get_frame_saved_regs (fi)[1] = 1;
|
get_frame_saved_regs (fi)[1] = 1;
|
||||||
fi->extra_info->framesize += 3;
|
get_frame_extra_info (fi)->framesize += 3;
|
||||||
}
|
}
|
||||||
else if (memcmp (img + 1, prologue, sizeof (img) - 1) == 0)
|
else if (memcmp (img + 1, prologue, sizeof (img) - 1) == 0)
|
||||||
{
|
{
|
||||||
vpc += sizeof (img) - 1;
|
vpc += sizeof (img) - 1;
|
||||||
get_frame_saved_regs (fi)[0] = 2;
|
get_frame_saved_regs (fi)[0] = 2;
|
||||||
get_frame_saved_regs (fi)[1] = 1;
|
get_frame_saved_regs (fi)[1] = 1;
|
||||||
fi->extra_info->framesize += 3;
|
get_frame_extra_info (fi)->framesize += 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -645,8 +645,8 @@ avr_scan_prologue (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
/* Bits 4-9 contain a mask for registers R0-R32. */
|
/* Bits 4-9 contain a mask for registers R0-R32. */
|
||||||
regno = (insn & 0x1f0) >> 4;
|
regno = (insn & 0x1f0) >> 4;
|
||||||
++fi->extra_info->framesize;
|
++get_frame_extra_info (fi)->framesize;
|
||||||
get_frame_saved_regs (fi)[regno] = fi->extra_info->framesize;
|
get_frame_saved_regs (fi)[regno] = get_frame_extra_info (fi)->framesize;
|
||||||
scan_stage = 1;
|
scan_stage = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -669,7 +669,7 @@ avr_scan_prologue (struct frame_info *fi)
|
||||||
if (memcmp (prologue + vpc, img, sizeof (img)) == 0)
|
if (memcmp (prologue + vpc, img, sizeof (img)) == 0)
|
||||||
{
|
{
|
||||||
vpc += 4;
|
vpc += 4;
|
||||||
fi->extra_info->framereg = AVR_FP_REGNUM;
|
get_frame_extra_info (fi)->framereg = AVR_FP_REGNUM;
|
||||||
scan_stage = 2;
|
scan_stage = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -718,8 +718,8 @@ avr_scan_prologue (struct frame_info *fi)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return;
|
return;
|
||||||
fi->extra_info->locals_size = locals_size;
|
get_frame_extra_info (fi)->locals_size = locals_size;
|
||||||
fi->extra_info->framesize += locals_size;
|
get_frame_extra_info (fi)->framesize += locals_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -740,12 +740,12 @@ avr_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
||||||
frame_saved_regs_zalloc (fi);
|
frame_saved_regs_zalloc (fi);
|
||||||
|
|
||||||
fi->extra_info->return_pc = 0;
|
get_frame_extra_info (fi)->return_pc = 0;
|
||||||
fi->extra_info->args_pointer = 0;
|
get_frame_extra_info (fi)->args_pointer = 0;
|
||||||
fi->extra_info->locals_size = 0;
|
get_frame_extra_info (fi)->locals_size = 0;
|
||||||
fi->extra_info->framereg = 0;
|
get_frame_extra_info (fi)->framereg = 0;
|
||||||
fi->extra_info->framesize = 0;
|
get_frame_extra_info (fi)->framesize = 0;
|
||||||
fi->extra_info->is_main = 0;
|
get_frame_extra_info (fi)->is_main = 0;
|
||||||
|
|
||||||
avr_scan_prologue (fi);
|
avr_scan_prologue (fi);
|
||||||
|
|
||||||
|
@ -757,14 +757,18 @@ avr_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), get_frame_base (fi),
|
deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), get_frame_base (fi),
|
||||||
AVR_PC_REGNUM));
|
AVR_PC_REGNUM));
|
||||||
}
|
}
|
||||||
else if (!get_next_frame (fi)) /* this is the innermost frame? */
|
else if (!get_next_frame (fi))
|
||||||
deprecated_update_frame_base_hack (fi, read_register (fi->extra_info->framereg));
|
/* this is the innermost frame? */
|
||||||
else if (fi->extra_info->is_main != 1) /* not the innermost frame, not `main' */
|
deprecated_update_frame_base_hack (fi, read_register (get_frame_extra_info (fi)->framereg));
|
||||||
|
else if (get_frame_extra_info (fi)->is_main != 1)
|
||||||
|
/* not the innermost frame, not `main' */
|
||||||
/* If we have an next frame, the callee saved it. */
|
/* If we have an next frame, the callee saved it. */
|
||||||
{
|
{
|
||||||
struct frame_info *next_fi = get_next_frame (fi);
|
struct frame_info *next_fi = get_next_frame (fi);
|
||||||
if (fi->extra_info->framereg == AVR_SP_REGNUM)
|
if (get_frame_extra_info (fi)->framereg == AVR_SP_REGNUM)
|
||||||
deprecated_update_frame_base_hack (fi, get_frame_base (next_fi) + 2 /* ret addr */ + next_fi->extra_info->framesize);
|
deprecated_update_frame_base_hack (fi, (get_frame_base (next_fi)
|
||||||
|
+ 2 /* ret addr */
|
||||||
|
+ get_frame_extra_info (next_fi)->framesize));
|
||||||
/* FIXME: I don't analyse va_args functions */
|
/* FIXME: I don't analyse va_args functions */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -794,23 +798,24 @@ avr_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
/* TRoth: Do we want to do this if we are in main? I don't think we should
|
/* TRoth: Do we want to do this if we are in main? I don't think we should
|
||||||
since return_pc makes no sense when we are in main. */
|
since return_pc makes no sense when we are in main. */
|
||||||
|
|
||||||
if ((get_frame_pc (fi)) && (fi->extra_info->is_main == 0)) /* We are not in CALL_DUMMY */
|
if ((get_frame_pc (fi)) && (get_frame_extra_info (fi)->is_main == 0))
|
||||||
|
/* We are not in CALL_DUMMY */
|
||||||
{
|
{
|
||||||
CORE_ADDR addr;
|
CORE_ADDR addr;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
addr = get_frame_base (fi) + fi->extra_info->framesize + 1;
|
addr = get_frame_base (fi) + get_frame_extra_info (fi)->framesize + 1;
|
||||||
|
|
||||||
/* Return address in stack in different endianness */
|
/* Return address in stack in different endianness */
|
||||||
|
|
||||||
fi->extra_info->return_pc =
|
get_frame_extra_info (fi)->return_pc =
|
||||||
read_memory_unsigned_integer (avr_make_saddr (addr), 1) << 8;
|
read_memory_unsigned_integer (avr_make_saddr (addr), 1) << 8;
|
||||||
fi->extra_info->return_pc |=
|
get_frame_extra_info (fi)->return_pc |=
|
||||||
read_memory_unsigned_integer (avr_make_saddr (addr + 1), 1);
|
read_memory_unsigned_integer (avr_make_saddr (addr + 1), 1);
|
||||||
|
|
||||||
/* This return address in words,
|
/* This return address in words,
|
||||||
must be converted to the bytes address */
|
must be converted to the bytes address */
|
||||||
fi->extra_info->return_pc *= 2;
|
get_frame_extra_info (fi)->return_pc *= 2;
|
||||||
|
|
||||||
/* Resolve a pushed registers addresses */
|
/* Resolve a pushed registers addresses */
|
||||||
for (i = 0; i < NUM_REGS; i++)
|
for (i = 0; i < NUM_REGS; i++)
|
||||||
|
@ -857,7 +862,7 @@ avr_pop_frame (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't forget the update the PC too! */
|
/* Don't forget the update the PC too! */
|
||||||
write_pc (frame->extra_info->return_pc);
|
write_pc (get_frame_extra_info (frame)->return_pc);
|
||||||
}
|
}
|
||||||
flush_cached_frames ();
|
flush_cached_frames ();
|
||||||
}
|
}
|
||||||
|
@ -874,7 +879,7 @@ avr_frame_saved_pc (struct frame_info *frame)
|
||||||
get_frame_base (frame),
|
get_frame_base (frame),
|
||||||
AVR_PC_REGNUM);
|
AVR_PC_REGNUM);
|
||||||
else
|
else
|
||||||
return frame->extra_info->return_pc;
|
return get_frame_extra_info (frame)->return_pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CORE_ADDR
|
static CORE_ADDR
|
||||||
|
@ -1040,14 +1045,14 @@ avr_frame_chain (struct frame_info *frame)
|
||||||
get_frame_base (frame)))
|
get_frame_base (frame)))
|
||||||
{
|
{
|
||||||
/* initialize the return_pc now */
|
/* initialize the return_pc now */
|
||||||
frame->extra_info->return_pc
|
get_frame_extra_info (frame)->return_pc
|
||||||
= deprecated_read_register_dummy (get_frame_pc (frame),
|
= deprecated_read_register_dummy (get_frame_pc (frame),
|
||||||
get_frame_base (frame),
|
get_frame_base (frame),
|
||||||
AVR_PC_REGNUM);
|
AVR_PC_REGNUM);
|
||||||
return get_frame_base (frame);
|
return get_frame_base (frame);
|
||||||
}
|
}
|
||||||
return (frame->extra_info->is_main ? 0
|
return (get_frame_extra_info (frame)->is_main ? 0
|
||||||
: get_frame_base (frame) + frame->extra_info->framesize + 2 /* ret addr */ );
|
: get_frame_base (frame) + get_frame_extra_info (frame)->framesize + 2 /* ret addr */ );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store the address of the place in which to copy the structure the
|
/* Store the address of the place in which to copy the structure the
|
||||||
|
|
|
@ -488,7 +488,7 @@ cris_examine (CORE_ADDR ip, CORE_ADDR limit, struct frame_info *fi,
|
||||||
short source_register;
|
short source_register;
|
||||||
|
|
||||||
/* This frame is with respect to a leaf until a push srp is found. */
|
/* This frame is with respect to a leaf until a push srp is found. */
|
||||||
fi->extra_info->leaf_function = 1;
|
get_frame_extra_info (fi)->leaf_function = 1;
|
||||||
|
|
||||||
/* This frame is without the FP until a push fp is found. */
|
/* This frame is without the FP until a push fp is found. */
|
||||||
have_fp = 0;
|
have_fp = 0;
|
||||||
|
@ -527,7 +527,7 @@ cris_examine (CORE_ADDR ip, CORE_ADDR limit, struct frame_info *fi,
|
||||||
{
|
{
|
||||||
return ip;
|
return ip;
|
||||||
}
|
}
|
||||||
fi->extra_info->leaf_function = 0;
|
get_frame_extra_info (fi)->leaf_function = 0;
|
||||||
}
|
}
|
||||||
else if (regno == FP_REGNUM)
|
else if (regno == FP_REGNUM)
|
||||||
{
|
{
|
||||||
|
@ -689,7 +689,7 @@ cris_examine (CORE_ADDR ip, CORE_ADDR limit, struct frame_info *fi,
|
||||||
get_frame_saved_regs (fi)[regno] = get_frame_base (fi) - val;
|
get_frame_saved_regs (fi)[regno] = get_frame_base (fi) - val;
|
||||||
val -= 4;
|
val -= 4;
|
||||||
}
|
}
|
||||||
if (fi->extra_info->leaf_function)
|
if (get_frame_extra_info (fi)->leaf_function)
|
||||||
{
|
{
|
||||||
/* Set the register SP to contain the stack pointer of
|
/* Set the register SP to contain the stack pointer of
|
||||||
the caller. */
|
the caller. */
|
||||||
|
@ -1209,8 +1209,8 @@ cris_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
|
|
||||||
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
||||||
|
|
||||||
fi->extra_info->return_pc = 0;
|
get_frame_extra_info (fi)->return_pc = 0;
|
||||||
fi->extra_info->leaf_function = 0;
|
get_frame_extra_info (fi)->leaf_function = 0;
|
||||||
|
|
||||||
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi),
|
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi),
|
||||||
get_frame_base (fi),
|
get_frame_base (fi),
|
||||||
|
@ -1219,12 +1219,12 @@ cris_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
/* We need to setup fi->frame here because run_stack_dummy gets it wrong
|
/* We need to setup fi->frame here because run_stack_dummy gets it wrong
|
||||||
by assuming it's always FP. */
|
by assuming it's always FP. */
|
||||||
deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), get_frame_base (fi), SP_REGNUM));
|
deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), get_frame_base (fi), SP_REGNUM));
|
||||||
fi->extra_info->return_pc =
|
get_frame_extra_info (fi)->return_pc =
|
||||||
deprecated_read_register_dummy (get_frame_pc (fi),
|
deprecated_read_register_dummy (get_frame_pc (fi),
|
||||||
get_frame_base (fi), PC_REGNUM);
|
get_frame_base (fi), PC_REGNUM);
|
||||||
|
|
||||||
/* FIXME: Is this necessarily true? */
|
/* FIXME: Is this necessarily true? */
|
||||||
fi->extra_info->leaf_function = 0;
|
get_frame_extra_info (fi)->leaf_function = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1235,16 +1235,16 @@ cris_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
if (get_frame_saved_regs (fi)[SRP_REGNUM] != 0)
|
if (get_frame_saved_regs (fi)[SRP_REGNUM] != 0)
|
||||||
{
|
{
|
||||||
/* SRP was saved on the stack; non-leaf function. */
|
/* SRP was saved on the stack; non-leaf function. */
|
||||||
fi->extra_info->return_pc =
|
get_frame_extra_info (fi)->return_pc =
|
||||||
read_memory_integer (get_frame_saved_regs (fi)[SRP_REGNUM],
|
read_memory_integer (get_frame_saved_regs (fi)[SRP_REGNUM],
|
||||||
REGISTER_RAW_SIZE (SRP_REGNUM));
|
REGISTER_RAW_SIZE (SRP_REGNUM));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* SRP is still in a register; leaf function. */
|
/* SRP is still in a register; leaf function. */
|
||||||
fi->extra_info->return_pc = read_register (SRP_REGNUM);
|
get_frame_extra_info (fi)->return_pc = read_register (SRP_REGNUM);
|
||||||
/* FIXME: Should leaf_function be set to 1 here? */
|
/* FIXME: Should leaf_function be set to 1 here? */
|
||||||
fi->extra_info->leaf_function = 1;
|
get_frame_extra_info (fi)->leaf_function = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1276,7 +1276,7 @@ cris_frame_chain (struct frame_info *fi)
|
||||||
CORE_ADDR
|
CORE_ADDR
|
||||||
cris_frame_saved_pc (struct frame_info *fi)
|
cris_frame_saved_pc (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
return fi->extra_info->return_pc;
|
return get_frame_extra_info (fi)->return_pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setup the function arguments for calling a function in the inferior. */
|
/* Setup the function arguments for calling a function in the inferior. */
|
||||||
|
@ -1570,7 +1570,7 @@ cris_pop_frame (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore the PC. */
|
/* Restore the PC. */
|
||||||
write_register (PC_REGNUM, fi->extra_info->return_pc);
|
write_register (PC_REGNUM, get_frame_extra_info (fi)->return_pc);
|
||||||
}
|
}
|
||||||
flush_cached_frames ();
|
flush_cached_frames ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -512,7 +512,7 @@ d10v_frame_saved_pc (struct frame_info *frame)
|
||||||
get_frame_base (frame),
|
get_frame_base (frame),
|
||||||
PC_REGNUM));
|
PC_REGNUM));
|
||||||
else
|
else
|
||||||
return ((frame)->extra_info->return_pc);
|
return (get_frame_extra_info (frame)->return_pc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Immediately after a function call, return the saved pc. We can't
|
/* Immediately after a function call, return the saved pc. We can't
|
||||||
|
@ -570,7 +570,7 @@ do_d10v_pop_frame (struct frame_info *fi)
|
||||||
}
|
}
|
||||||
|
|
||||||
write_register (PC_REGNUM, read_register (LR_REGNUM));
|
write_register (PC_REGNUM, read_register (LR_REGNUM));
|
||||||
write_register (SP_REGNUM, fp + fi->extra_info->size);
|
write_register (SP_REGNUM, fp + get_frame_extra_info (fi)->size);
|
||||||
target_store_registers (-1);
|
target_store_registers (-1);
|
||||||
flush_cached_frames ();
|
flush_cached_frames ();
|
||||||
}
|
}
|
||||||
|
@ -690,12 +690,12 @@ d10v_frame_chain (struct frame_info *fi)
|
||||||
d10v_frame_init_saved_regs (fi);
|
d10v_frame_init_saved_regs (fi);
|
||||||
|
|
||||||
|
|
||||||
if (fi->extra_info->return_pc == IMEM_START
|
if (get_frame_extra_info (fi)->return_pc == IMEM_START
|
||||||
|| inside_entry_file (fi->extra_info->return_pc))
|
|| inside_entry_file (get_frame_extra_info (fi)->return_pc))
|
||||||
{
|
{
|
||||||
/* This is meant to halt the backtrace at "_start".
|
/* This is meant to halt the backtrace at "_start".
|
||||||
Make sure we don't halt it at a generic dummy frame. */
|
Make sure we don't halt it at a generic dummy frame. */
|
||||||
if (!DEPRECATED_PC_IN_CALL_DUMMY (fi->extra_info->return_pc, 0, 0))
|
if (!DEPRECATED_PC_IN_CALL_DUMMY (get_frame_extra_info (fi)->return_pc, 0, 0))
|
||||||
return (CORE_ADDR) 0;
|
return (CORE_ADDR) 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -854,7 +854,7 @@ d10v_frame_init_saved_regs (struct frame_info *fi)
|
||||||
pc += 4;
|
pc += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
fi->extra_info->size = -next_addr;
|
get_frame_extra_info (fi)->size = -next_addr;
|
||||||
|
|
||||||
if (!(fp & 0xffff))
|
if (!(fp & 0xffff))
|
||||||
fp = d10v_read_sp ();
|
fp = d10v_read_sp ();
|
||||||
|
@ -870,11 +870,11 @@ d10v_frame_init_saved_regs (struct frame_info *fi)
|
||||||
CORE_ADDR return_pc
|
CORE_ADDR return_pc
|
||||||
= read_memory_unsigned_integer (get_frame_saved_regs (fi)[LR_REGNUM],
|
= read_memory_unsigned_integer (get_frame_saved_regs (fi)[LR_REGNUM],
|
||||||
REGISTER_RAW_SIZE (LR_REGNUM));
|
REGISTER_RAW_SIZE (LR_REGNUM));
|
||||||
fi->extra_info->return_pc = d10v_make_iaddr (return_pc);
|
get_frame_extra_info (fi)->return_pc = d10v_make_iaddr (return_pc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fi->extra_info->return_pc = d10v_make_iaddr (read_register (LR_REGNUM));
|
get_frame_extra_info (fi)->return_pc = d10v_make_iaddr (read_register (LR_REGNUM));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The SP is not normally (ever?) saved, but check anyway */
|
/* The SP is not normally (ever?) saved, but check anyway */
|
||||||
|
@ -884,11 +884,11 @@ d10v_frame_init_saved_regs (struct frame_info *fi)
|
||||||
/* otherwise, it isn't being used, so we use the SP instead */
|
/* otherwise, it isn't being used, so we use the SP instead */
|
||||||
if (uses_frame)
|
if (uses_frame)
|
||||||
get_frame_saved_regs (fi)[SP_REGNUM]
|
get_frame_saved_regs (fi)[SP_REGNUM]
|
||||||
= d10v_read_fp () + fi->extra_info->size;
|
= d10v_read_fp () + get_frame_extra_info (fi)->size;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
get_frame_saved_regs (fi)[SP_REGNUM] = fp + fi->extra_info->size;
|
get_frame_saved_regs (fi)[SP_REGNUM] = fp + get_frame_extra_info (fi)->size;
|
||||||
fi->extra_info->frameless = 1;
|
get_frame_extra_info (fi)->frameless = 1;
|
||||||
get_frame_saved_regs (fi)[FP_REGNUM] = 0;
|
get_frame_saved_regs (fi)[FP_REGNUM] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -900,9 +900,9 @@ d10v_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
||||||
frame_saved_regs_zalloc (fi);
|
frame_saved_regs_zalloc (fi);
|
||||||
|
|
||||||
fi->extra_info->frameless = 0;
|
get_frame_extra_info (fi)->frameless = 0;
|
||||||
fi->extra_info->size = 0;
|
get_frame_extra_info (fi)->size = 0;
|
||||||
fi->extra_info->return_pc = 0;
|
get_frame_extra_info (fi)->return_pc = 0;
|
||||||
|
|
||||||
/* If get_frame_pc (fi) is zero, but this is not the outermost frame,
|
/* If get_frame_pc (fi) is zero, but this is not the outermost frame,
|
||||||
then let's snatch the return_pc from the callee, so that
|
then let's snatch the return_pc from the callee, so that
|
||||||
|
|
|
@ -440,11 +440,11 @@ h8300_examine_prologue (register CORE_ADDR ip, register CORE_ADDR limit,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The args are always reffed based from the stack pointer */
|
/* The args are always reffed based from the stack pointer */
|
||||||
fi->extra_info->args_pointer = after_prolog_fp;
|
get_frame_extra_info (fi)->args_pointer = after_prolog_fp;
|
||||||
/* Locals are always reffed based from the fp */
|
/* Locals are always reffed based from the fp */
|
||||||
fi->extra_info->locals_pointer = after_prolog_fp;
|
get_frame_extra_info (fi)->locals_pointer = after_prolog_fp;
|
||||||
/* The PC is at a known place */
|
/* The PC is at a known place */
|
||||||
fi->extra_info->from_pc =
|
get_frame_extra_info (fi)->from_pc =
|
||||||
read_memory_unsigned_integer (after_prolog_fp + BINWORD, BINWORD);
|
read_memory_unsigned_integer (after_prolog_fp + BINWORD, BINWORD);
|
||||||
|
|
||||||
/* Rememeber any others too */
|
/* Rememeber any others too */
|
||||||
|
@ -498,7 +498,7 @@ h8300_frame_chain (struct frame_info *thisframe)
|
||||||
get_frame_base (thisframe),
|
get_frame_base (thisframe),
|
||||||
get_frame_base (thisframe)))
|
get_frame_base (thisframe)))
|
||||||
{ /* initialize the from_pc now */
|
{ /* initialize the from_pc now */
|
||||||
thisframe->extra_info->from_pc =
|
get_frame_extra_info (thisframe)->from_pc =
|
||||||
deprecated_read_register_dummy (get_frame_pc (thisframe),
|
deprecated_read_register_dummy (get_frame_pc (thisframe),
|
||||||
get_frame_base (thisframe),
|
get_frame_base (thisframe),
|
||||||
E_PC_REGNUM);
|
E_PC_REGNUM);
|
||||||
|
@ -522,18 +522,18 @@ h8300_frame_saved_pc (struct frame_info *frame)
|
||||||
get_frame_base (frame),
|
get_frame_base (frame),
|
||||||
E_PC_REGNUM);
|
E_PC_REGNUM);
|
||||||
else
|
else
|
||||||
return frame->extra_info->from_pc;
|
return get_frame_extra_info (frame)->from_pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
h8300_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
h8300_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
{
|
{
|
||||||
if (!fi->extra_info)
|
if (!get_frame_extra_info (fi))
|
||||||
{
|
{
|
||||||
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
||||||
fi->extra_info->from_pc = 0;
|
get_frame_extra_info (fi)->from_pc = 0;
|
||||||
fi->extra_info->args_pointer = 0; /* Unknown */
|
get_frame_extra_info (fi)->args_pointer = 0; /* Unknown */
|
||||||
fi->extra_info->locals_pointer = 0; /* Unknown */
|
get_frame_extra_info (fi)->locals_pointer = 0; /* Unknown */
|
||||||
|
|
||||||
if (!get_frame_pc (fi))
|
if (!get_frame_pc (fi))
|
||||||
{
|
{
|
||||||
|
@ -550,7 +550,7 @@ h8300_frame_locals_address (struct frame_info *fi)
|
||||||
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
|
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
|
||||||
get_frame_base (fi)))
|
get_frame_base (fi)))
|
||||||
return (CORE_ADDR) 0; /* Not sure what else to do... */
|
return (CORE_ADDR) 0; /* Not sure what else to do... */
|
||||||
return fi->extra_info->locals_pointer;
|
return get_frame_extra_info (fi)->locals_pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the address of the argument block for the frame
|
/* Return the address of the argument block for the frame
|
||||||
|
@ -562,7 +562,7 @@ h8300_frame_args_address (struct frame_info *fi)
|
||||||
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
|
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
|
||||||
get_frame_base (fi)))
|
get_frame_base (fi)))
|
||||||
return (CORE_ADDR) 0; /* Not sure what else to do... */
|
return (CORE_ADDR) 0; /* Not sure what else to do... */
|
||||||
return fi->extra_info->args_pointer;
|
return get_frame_extra_info (fi)->args_pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Round N up or down to the nearest multiple of UNIT.
|
/* Round N up or down to the nearest multiple of UNIT.
|
||||||
|
@ -776,7 +776,7 @@ h8300_pop_frame (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't forget to update the PC too! */
|
/* Don't forget to update the PC too! */
|
||||||
write_register (E_PC_REGNUM, frame->extra_info->from_pc);
|
write_register (E_PC_REGNUM, get_frame_extra_info (frame)->from_pc);
|
||||||
}
|
}
|
||||||
flush_cached_frames ();
|
flush_cached_frames ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -716,7 +716,7 @@ ia64_frame_chain (struct frame_info *frame)
|
||||||
return read_memory_integer (get_frame_saved_regs (frame)[IA64_VFP_REGNUM], 8);
|
return read_memory_integer (get_frame_saved_regs (frame)[IA64_VFP_REGNUM], 8);
|
||||||
else
|
else
|
||||||
return (get_frame_base (frame)
|
return (get_frame_base (frame)
|
||||||
+ frame->extra_info->mem_stack_frame_size);
|
+ get_frame_extra_info (frame)->mem_stack_frame_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -847,9 +847,9 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, struct frame_info *frame)
|
||||||
|
|
||||||
if (frame
|
if (frame
|
||||||
&& !do_fsr_stuff
|
&& !do_fsr_stuff
|
||||||
&& frame->extra_info->after_prologue != 0
|
&& get_frame_extra_info (frame)->after_prologue != 0
|
||||||
&& frame->extra_info->after_prologue <= lim_pc)
|
&& get_frame_extra_info (frame)->after_prologue <= lim_pc)
|
||||||
return frame->extra_info->after_prologue;
|
return get_frame_extra_info (frame)->after_prologue;
|
||||||
|
|
||||||
lim_pc = refine_prologue_limit (pc, lim_pc, &trust_limit);
|
lim_pc = refine_prologue_limit (pc, lim_pc, &trust_limit);
|
||||||
|
|
||||||
|
@ -1123,11 +1123,11 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, struct frame_info *frame)
|
||||||
/* Extract the size of the rotating portion of the stack
|
/* Extract the size of the rotating portion of the stack
|
||||||
frame and the register rename base from the current
|
frame and the register rename base from the current
|
||||||
frame marker. */
|
frame marker. */
|
||||||
sor = ((frame->extra_info->cfm >> 14) & 0xf) * 8;
|
sor = ((get_frame_extra_info (frame)->cfm >> 14) & 0xf) * 8;
|
||||||
rrb_gr = (frame->extra_info->cfm >> 18) & 0x7f;
|
rrb_gr = (get_frame_extra_info (frame)->cfm >> 18) & 0x7f;
|
||||||
|
|
||||||
for (i = 0, addr = frame->extra_info->bsp;
|
for (i = 0, addr = get_frame_extra_info (frame)->bsp;
|
||||||
i < frame->extra_info->sof;
|
i < get_frame_extra_info (frame)->sof;
|
||||||
i++, addr += 8)
|
i++, addr += 8)
|
||||||
{
|
{
|
||||||
if (IS_NaT_COLLECTION_ADDR (addr))
|
if (IS_NaT_COLLECTION_ADDR (addr))
|
||||||
|
@ -1149,11 +1149,12 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, struct frame_info *frame)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frame && frame->extra_info) {
|
if (frame && get_frame_extra_info (frame))
|
||||||
frame->extra_info->after_prologue = last_prologue_pc;
|
{
|
||||||
frame->extra_info->mem_stack_frame_size = mem_stack_frame_size;
|
get_frame_extra_info (frame)->after_prologue = last_prologue_pc;
|
||||||
frame->extra_info->fp_reg = fp_reg;
|
get_frame_extra_info (frame)->mem_stack_frame_size = mem_stack_frame_size;
|
||||||
}
|
get_frame_extra_info (frame)->fp_reg = fp_reg;
|
||||||
|
}
|
||||||
|
|
||||||
return last_prologue_pc;
|
return last_prologue_pc;
|
||||||
}
|
}
|
||||||
|
@ -1253,7 +1254,7 @@ ia64_get_saved_register (char *raw_buffer,
|
||||||
else if (regnum == IA64_BSP_REGNUM)
|
else if (regnum == IA64_BSP_REGNUM)
|
||||||
{
|
{
|
||||||
store_address (raw_buffer, REGISTER_RAW_SIZE (regnum),
|
store_address (raw_buffer, REGISTER_RAW_SIZE (regnum),
|
||||||
frame->extra_info->bsp);
|
get_frame_extra_info (frame)->bsp);
|
||||||
}
|
}
|
||||||
else if (regnum == IA64_VFP_REGNUM)
|
else if (regnum == IA64_VFP_REGNUM)
|
||||||
{
|
{
|
||||||
|
@ -1262,7 +1263,7 @@ ia64_get_saved_register (char *raw_buffer,
|
||||||
above. If the function lacks one of these frame pointers, we can
|
above. If the function lacks one of these frame pointers, we can
|
||||||
still provide a value since we know the size of the frame */
|
still provide a value since we know the size of the frame */
|
||||||
CORE_ADDR vfp = (get_frame_base (frame)
|
CORE_ADDR vfp = (get_frame_base (frame)
|
||||||
+ frame->extra_info->mem_stack_frame_size);
|
+ get_frame_extra_info (frame)->mem_stack_frame_size);
|
||||||
store_address (raw_buffer, REGISTER_RAW_SIZE (IA64_VFP_REGNUM), vfp);
|
store_address (raw_buffer, REGISTER_RAW_SIZE (IA64_VFP_REGNUM), vfp);
|
||||||
}
|
}
|
||||||
else if (IA64_PR0_REGNUM <= regnum && regnum <= IA64_PR63_REGNUM)
|
else if (IA64_PR0_REGNUM <= regnum && regnum <= IA64_PR63_REGNUM)
|
||||||
|
@ -1278,7 +1279,7 @@ ia64_get_saved_register (char *raw_buffer,
|
||||||
{
|
{
|
||||||
/* Fetch predicate register rename base from current frame
|
/* Fetch predicate register rename base from current frame
|
||||||
marker for this frame. */
|
marker for this frame. */
|
||||||
int rrb_pr = (frame->extra_info->cfm >> 32) & 0x3f;
|
int rrb_pr = (get_frame_extra_info (frame)->cfm >> 32) & 0x3f;
|
||||||
|
|
||||||
/* Adjust the register number to account for register rotation. */
|
/* Adjust the register number to account for register rotation. */
|
||||||
regnum = IA64_PR16_REGNUM
|
regnum = IA64_PR16_REGNUM
|
||||||
|
@ -1378,7 +1379,7 @@ ia64_get_saved_register (char *raw_buffer,
|
||||||
{
|
{
|
||||||
/* Fetch floating point register rename base from current
|
/* Fetch floating point register rename base from current
|
||||||
frame marker for this frame. */
|
frame marker for this frame. */
|
||||||
int rrb_fr = (frame->extra_info->cfm >> 25) & 0x7f;
|
int rrb_fr = (get_frame_extra_info (frame)->cfm >> 25) & 0x7f;
|
||||||
|
|
||||||
/* Adjust the floating point register number to account for
|
/* Adjust the floating point register number to account for
|
||||||
register rotation. */
|
register rotation. */
|
||||||
|
@ -1462,7 +1463,7 @@ int
|
||||||
ia64_frameless_function_invocation (struct frame_info *frame)
|
ia64_frameless_function_invocation (struct frame_info *frame)
|
||||||
{
|
{
|
||||||
FRAME_INIT_SAVED_REGS (frame);
|
FRAME_INIT_SAVED_REGS (frame);
|
||||||
return (frame->extra_info->mem_stack_frame_size == 0);
|
return (get_frame_extra_info (frame)->mem_stack_frame_size == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
CORE_ADDR
|
CORE_ADDR
|
||||||
|
@ -1538,21 +1539,23 @@ ia64_init_extra_frame_info (int fromleaf, struct frame_info *frame)
|
||||||
else
|
else
|
||||||
cfm = read_register (IA64_PFS_REGNUM);
|
cfm = read_register (IA64_PFS_REGNUM);
|
||||||
|
|
||||||
bsp = frn->extra_info->bsp;
|
bsp = get_frame_extra_info (frn)->bsp;
|
||||||
}
|
}
|
||||||
frame->extra_info->cfm = cfm;
|
get_frame_extra_info (frame)->cfm = cfm;
|
||||||
frame->extra_info->sof = cfm & 0x7f;
|
get_frame_extra_info (frame)->sof = cfm & 0x7f;
|
||||||
frame->extra_info->sol = (cfm >> 7) & 0x7f;
|
get_frame_extra_info (frame)->sol = (cfm >> 7) & 0x7f;
|
||||||
if (get_next_frame (frame) == 0
|
if (get_next_frame (frame) == 0
|
||||||
|| (get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME)
|
|| (get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME)
|
||||||
|| next_frame_is_call_dummy)
|
|| next_frame_is_call_dummy)
|
||||||
frame->extra_info->bsp = rse_address_add (bsp, -frame->extra_info->sof);
|
get_frame_extra_info (frame)->bsp =
|
||||||
|
rse_address_add (bsp, -get_frame_extra_info (frame)->sof);
|
||||||
else
|
else
|
||||||
frame->extra_info->bsp = rse_address_add (bsp, -frame->extra_info->sol);
|
get_frame_extra_info (frame)->bsp =
|
||||||
|
rse_address_add (bsp, -get_frame_extra_info (frame)->sol);
|
||||||
|
|
||||||
frame->extra_info->after_prologue = 0;
|
get_frame_extra_info (frame)->after_prologue = 0;
|
||||||
frame->extra_info->mem_stack_frame_size = -1; /* Not yet determined */
|
get_frame_extra_info (frame)->mem_stack_frame_size = -1; /* Not yet determined */
|
||||||
frame->extra_info->fp_reg = 0;
|
get_frame_extra_info (frame)->fp_reg = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -2027,7 +2030,7 @@ ia64_pop_frame_regular (struct frame_info *frame)
|
||||||
wants bsp to be set at the end of all used registers. It's
|
wants bsp to be set at the end of all used registers. It's
|
||||||
likely that this code will need to be revised to accomodate
|
likely that this code will need to be revised to accomodate
|
||||||
other operating systems. */
|
other operating systems. */
|
||||||
bsp = rse_address_add (frame->extra_info->bsp,
|
bsp = rse_address_add (get_frame_extra_info (frame)->bsp,
|
||||||
(pfs & 0x7f) - ((pfs >> 7) & 0x7f));
|
(pfs & 0x7f) - ((pfs >> 7) & 0x7f));
|
||||||
write_register (IA64_BSP_REGNUM, bsp);
|
write_register (IA64_BSP_REGNUM, bsp);
|
||||||
|
|
||||||
|
|
|
@ -401,7 +401,7 @@ m68hc11_saved_pc_after_call (struct frame_info *frame)
|
||||||
static CORE_ADDR
|
static CORE_ADDR
|
||||||
m68hc11_frame_saved_pc (struct frame_info *frame)
|
m68hc11_frame_saved_pc (struct frame_info *frame)
|
||||||
{
|
{
|
||||||
return frame->extra_info->return_pc;
|
return get_frame_extra_info (frame)->return_pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CORE_ADDR
|
static CORE_ADDR
|
||||||
|
@ -409,10 +409,10 @@ m68hc11_frame_args_address (struct frame_info *frame)
|
||||||
{
|
{
|
||||||
CORE_ADDR addr;
|
CORE_ADDR addr;
|
||||||
|
|
||||||
addr = get_frame_base (frame) + frame->extra_info->size + STACK_CORRECTION + 2;
|
addr = get_frame_base (frame) + get_frame_extra_info (frame)->size + STACK_CORRECTION + 2;
|
||||||
if (frame->extra_info->return_kind == RETURN_RTC)
|
if (get_frame_extra_info (frame)->return_kind == RETURN_RTC)
|
||||||
addr += 1;
|
addr += 1;
|
||||||
else if (frame->extra_info->return_kind == RETURN_RTI)
|
else if (get_frame_extra_info (frame)->return_kind == RETURN_RTI)
|
||||||
addr += 7;
|
addr += 7;
|
||||||
|
|
||||||
return addr;
|
return addr;
|
||||||
|
@ -449,8 +449,8 @@ m68hc11_pop_frame (void)
|
||||||
write_register (regnum,
|
write_register (regnum,
|
||||||
read_memory_integer (get_frame_saved_regs (frame)[regnum], 2));
|
read_memory_integer (get_frame_saved_regs (frame)[regnum], 2));
|
||||||
|
|
||||||
write_register (HARD_PC_REGNUM, frame->extra_info->return_pc);
|
write_register (HARD_PC_REGNUM, get_frame_extra_info (frame)->return_pc);
|
||||||
sp = (fp + frame->extra_info->size + 2) & 0x0ffff;
|
sp = (fp + get_frame_extra_info (frame)->size + 2) & 0x0ffff;
|
||||||
write_register (HARD_SP_REGNUM, sp);
|
write_register (HARD_SP_REGNUM, sp);
|
||||||
}
|
}
|
||||||
flush_cached_frames ();
|
flush_cached_frames ();
|
||||||
|
@ -819,8 +819,8 @@ m68hc11_frame_chain (struct frame_info *frame)
|
||||||
get_frame_base (frame)))
|
get_frame_base (frame)))
|
||||||
return get_frame_base (frame); /* dummy frame same as caller's frame */
|
return get_frame_base (frame); /* dummy frame same as caller's frame */
|
||||||
|
|
||||||
if (frame->extra_info->return_pc == 0
|
if (get_frame_extra_info (frame)->return_pc == 0
|
||||||
|| inside_entry_file (frame->extra_info->return_pc))
|
|| inside_entry_file (get_frame_extra_info (frame)->return_pc))
|
||||||
return (CORE_ADDR) 0;
|
return (CORE_ADDR) 0;
|
||||||
|
|
||||||
if (get_frame_base (frame) == 0)
|
if (get_frame_base (frame) == 0)
|
||||||
|
@ -828,7 +828,7 @@ m68hc11_frame_chain (struct frame_info *frame)
|
||||||
return (CORE_ADDR) 0;
|
return (CORE_ADDR) 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
addr = get_frame_base (frame) + frame->extra_info->size + STACK_CORRECTION - 2;
|
addr = get_frame_base (frame) + get_frame_extra_info (frame)->size + STACK_CORRECTION - 2;
|
||||||
addr = read_memory_unsigned_integer (addr, 2) & 0x0FFFF;
|
addr = read_memory_unsigned_integer (addr, 2) & 0x0FFFF;
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
@ -850,21 +850,22 @@ m68hc11_frame_init_saved_regs (struct frame_info *fi)
|
||||||
memset (get_frame_saved_regs (fi), 0, SIZEOF_FRAME_SAVED_REGS);
|
memset (get_frame_saved_regs (fi), 0, SIZEOF_FRAME_SAVED_REGS);
|
||||||
|
|
||||||
pc = get_frame_pc (fi);
|
pc = get_frame_pc (fi);
|
||||||
fi->extra_info->return_kind = m68hc11_get_return_insn (pc);
|
get_frame_extra_info (fi)->return_kind = m68hc11_get_return_insn (pc);
|
||||||
m68hc11_guess_from_prologue (pc, get_frame_base (fi), &pc, &fi->extra_info->size,
|
m68hc11_guess_from_prologue (pc, get_frame_base (fi), &pc,
|
||||||
|
&get_frame_extra_info (fi)->size,
|
||||||
get_frame_saved_regs (fi));
|
get_frame_saved_regs (fi));
|
||||||
|
|
||||||
addr = get_frame_base (fi) + fi->extra_info->size + STACK_CORRECTION;
|
addr = get_frame_base (fi) + get_frame_extra_info (fi)->size + STACK_CORRECTION;
|
||||||
if (soft_regs[SOFT_FP_REGNUM].name)
|
if (soft_regs[SOFT_FP_REGNUM].name)
|
||||||
get_frame_saved_regs (fi)[SOFT_FP_REGNUM] = addr - 2;
|
get_frame_saved_regs (fi)[SOFT_FP_REGNUM] = addr - 2;
|
||||||
|
|
||||||
/* Take into account how the function was called/returns. */
|
/* Take into account how the function was called/returns. */
|
||||||
if (fi->extra_info->return_kind == RETURN_RTC)
|
if (get_frame_extra_info (fi)->return_kind == RETURN_RTC)
|
||||||
{
|
{
|
||||||
get_frame_saved_regs (fi)[HARD_PAGE_REGNUM] = addr;
|
get_frame_saved_regs (fi)[HARD_PAGE_REGNUM] = addr;
|
||||||
addr++;
|
addr++;
|
||||||
}
|
}
|
||||||
else if (fi->extra_info->return_kind == RETURN_RTI)
|
else if (get_frame_extra_info (fi)->return_kind == RETURN_RTI)
|
||||||
{
|
{
|
||||||
get_frame_saved_regs (fi)[HARD_CCR_REGNUM] = addr;
|
get_frame_saved_regs (fi)[HARD_CCR_REGNUM] = addr;
|
||||||
get_frame_saved_regs (fi)[HARD_D_REGNUM] = addr + 1;
|
get_frame_saved_regs (fi)[HARD_D_REGNUM] = addr + 1;
|
||||||
|
@ -890,8 +891,8 @@ m68hc11_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
|
|
||||||
if (fromleaf)
|
if (fromleaf)
|
||||||
{
|
{
|
||||||
fi->extra_info->return_kind = m68hc11_get_return_insn (get_frame_pc (fi));
|
get_frame_extra_info (fi)->return_kind = m68hc11_get_return_insn (get_frame_pc (fi));
|
||||||
fi->extra_info->return_pc = m68hc11_saved_pc_after_call (fi);
|
get_frame_extra_info (fi)->return_pc = m68hc11_saved_pc_after_call (fi);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -899,7 +900,7 @@ m68hc11_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
addr = read_memory_unsigned_integer (addr, 2) & 0x0ffff;
|
addr = read_memory_unsigned_integer (addr, 2) & 0x0ffff;
|
||||||
|
|
||||||
/* Take into account the 68HC12 specific call (PC + page). */
|
/* Take into account the 68HC12 specific call (PC + page). */
|
||||||
if (fi->extra_info->return_kind == RETURN_RTC
|
if (get_frame_extra_info (fi)->return_kind == RETURN_RTC
|
||||||
&& addr >= 0x08000 && addr < 0x0c000
|
&& addr >= 0x08000 && addr < 0x0c000
|
||||||
&& USE_PAGE_REGISTER)
|
&& USE_PAGE_REGISTER)
|
||||||
{
|
{
|
||||||
|
@ -910,7 +911,7 @@ m68hc11_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
addr += ((page & 0x0ff) << 14);
|
addr += ((page & 0x0ff) << 14);
|
||||||
addr += 0x1000000;
|
addr += 0x1000000;
|
||||||
}
|
}
|
||||||
fi->extra_info->return_pc = addr;
|
get_frame_extra_info (fi)->return_pc = addr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -300,8 +300,8 @@ analyze_dummy_frame (CORE_ADDR pc, CORE_ADDR frame)
|
||||||
deprecated_set_frame_prev_hack (dummy, NULL);
|
deprecated_set_frame_prev_hack (dummy, NULL);
|
||||||
deprecated_update_frame_pc_hack (dummy, pc);
|
deprecated_update_frame_pc_hack (dummy, pc);
|
||||||
deprecated_update_frame_base_hack (dummy, frame);
|
deprecated_update_frame_base_hack (dummy, frame);
|
||||||
dummy->extra_info->status = 0;
|
get_frame_extra_info (dummy)->status = 0;
|
||||||
dummy->extra_info->framesize = 0;
|
get_frame_extra_info (dummy)->framesize = 0;
|
||||||
memset (get_frame_saved_regs (dummy), '\000', SIZEOF_FRAME_SAVED_REGS);
|
memset (get_frame_saved_regs (dummy), '\000', SIZEOF_FRAME_SAVED_REGS);
|
||||||
mcore_analyze_prologue (dummy, 0, 0);
|
mcore_analyze_prologue (dummy, 0, 0);
|
||||||
return dummy;
|
return dummy;
|
||||||
|
@ -360,7 +360,7 @@ mcore_analyze_prologue (struct frame_info *fi, CORE_ADDR pc, int skip_prologue)
|
||||||
if (func_addr == entry_point_address ())
|
if (func_addr == entry_point_address ())
|
||||||
{
|
{
|
||||||
if (fi != NULL)
|
if (fi != NULL)
|
||||||
fi->extra_info->status |= NO_MORE_FRAMES;
|
get_frame_extra_info (fi)->status |= NO_MORE_FRAMES;
|
||||||
return pc;
|
return pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -606,16 +606,16 @@ mcore_analyze_prologue (struct frame_info *fi, CORE_ADDR pc, int skip_prologue)
|
||||||
/* Save everything we have learned about this frame into FI. */
|
/* Save everything we have learned about this frame into FI. */
|
||||||
if (fi != NULL)
|
if (fi != NULL)
|
||||||
{
|
{
|
||||||
fi->extra_info->framesize = framesize;
|
get_frame_extra_info (fi)->framesize = framesize;
|
||||||
fi->extra_info->fp_regnum = fp_regnum;
|
get_frame_extra_info (fi)->fp_regnum = fp_regnum;
|
||||||
fi->extra_info->status = flags;
|
get_frame_extra_info (fi)->status = flags;
|
||||||
|
|
||||||
/* Fix the frame pointer. When gcc uses r8 as a frame pointer,
|
/* Fix the frame pointer. When gcc uses r8 as a frame pointer,
|
||||||
it is really an arg ptr. We adjust fi->frame to be a "real"
|
it is really an arg ptr. We adjust fi->frame to be a "real"
|
||||||
frame pointer. */
|
frame pointer. */
|
||||||
if (get_next_frame (fi) == NULL)
|
if (get_next_frame (fi) == NULL)
|
||||||
{
|
{
|
||||||
if (fi->extra_info->status & MY_FRAME_IN_SP)
|
if (get_frame_extra_info (fi)->status & MY_FRAME_IN_SP)
|
||||||
deprecated_update_frame_base_hack (fi, read_sp () + framesize);
|
deprecated_update_frame_base_hack (fi, read_sp () + framesize);
|
||||||
else
|
else
|
||||||
deprecated_update_frame_base_hack (fi, read_register (fp_regnum) + framesize);
|
deprecated_update_frame_base_hack (fi, read_register (fp_regnum) + framesize);
|
||||||
|
@ -651,11 +651,11 @@ mcore_frame_chain (struct frame_info * fi)
|
||||||
CORE_ADDR callers_addr;
|
CORE_ADDR callers_addr;
|
||||||
|
|
||||||
/* Analyze the prologue of this function. */
|
/* Analyze the prologue of this function. */
|
||||||
if (fi->extra_info->status == 0)
|
if (get_frame_extra_info (fi)->status == 0)
|
||||||
mcore_analyze_prologue (fi, 0, 0);
|
mcore_analyze_prologue (fi, 0, 0);
|
||||||
|
|
||||||
/* If mcore_analyze_prologue set NO_MORE_FRAMES, quit now. */
|
/* If mcore_analyze_prologue set NO_MORE_FRAMES, quit now. */
|
||||||
if (fi->extra_info->status & NO_MORE_FRAMES)
|
if (get_frame_extra_info (fi)->status & NO_MORE_FRAMES)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Now that we've analyzed our prologue, we can start to ask
|
/* Now that we've analyzed our prologue, we can start to ask
|
||||||
|
@ -671,9 +671,9 @@ mcore_frame_chain (struct frame_info * fi)
|
||||||
is <our base> + -<caller's frame size>. */
|
is <our base> + -<caller's frame size>. */
|
||||||
dummy = analyze_dummy_frame (FRAME_SAVED_PC (fi), get_frame_base (fi));
|
dummy = analyze_dummy_frame (FRAME_SAVED_PC (fi), get_frame_base (fi));
|
||||||
|
|
||||||
if (dummy->extra_info->status & MY_FRAME_IN_FP)
|
if (get_frame_extra_info (dummy)->status & MY_FRAME_IN_FP)
|
||||||
{
|
{
|
||||||
int fp = dummy->extra_info->fp_regnum;
|
int fp = get_frame_extra_info (dummy)->fp_regnum;
|
||||||
|
|
||||||
/* Our caller has a frame pointer. */
|
/* Our caller has a frame pointer. */
|
||||||
if (get_frame_saved_regs (fi)[fp] != 0)
|
if (get_frame_saved_regs (fi)[fp] != 0)
|
||||||
|
@ -681,19 +681,19 @@ mcore_frame_chain (struct frame_info * fi)
|
||||||
/* The "FP" was saved on the stack. Don't forget to adjust
|
/* The "FP" was saved on the stack. Don't forget to adjust
|
||||||
the "FP" with the framesize to get a real FP. */
|
the "FP" with the framesize to get a real FP. */
|
||||||
callers_addr = read_memory_integer (get_frame_saved_regs (fi)[fp], REGISTER_SIZE)
|
callers_addr = read_memory_integer (get_frame_saved_regs (fi)[fp], REGISTER_SIZE)
|
||||||
+ dummy->extra_info->framesize;
|
+ get_frame_extra_info (dummy)->framesize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* It's still in the register. Don't forget to adjust
|
/* It's still in the register. Don't forget to adjust
|
||||||
the "FP" with the framesize to get a real FP. */
|
the "FP" with the framesize to get a real FP. */
|
||||||
callers_addr = read_register (fp) + dummy->extra_info->framesize;
|
callers_addr = read_register (fp) + get_frame_extra_info (dummy)->framesize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Our caller does not have a frame pointer. */
|
/* Our caller does not have a frame pointer. */
|
||||||
callers_addr = get_frame_base (fi) + dummy->extra_info->framesize;
|
callers_addr = get_frame_base (fi) + get_frame_extra_info (dummy)->framesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
return callers_addr;
|
return callers_addr;
|
||||||
|
@ -724,13 +724,13 @@ mcore_skip_prologue (CORE_ADDR pc)
|
||||||
CORE_ADDR
|
CORE_ADDR
|
||||||
mcore_frame_args_address (struct frame_info * fi)
|
mcore_frame_args_address (struct frame_info * fi)
|
||||||
{
|
{
|
||||||
return get_frame_base (fi) - fi->extra_info->framesize;
|
return get_frame_base (fi) - get_frame_extra_info (fi)->framesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
CORE_ADDR
|
CORE_ADDR
|
||||||
mcore_frame_locals_address (struct frame_info * fi)
|
mcore_frame_locals_address (struct frame_info * fi)
|
||||||
{
|
{
|
||||||
return get_frame_base (fi) - fi->extra_info->framesize;
|
return get_frame_base (fi) - get_frame_extra_info (fi)->framesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the frame pointer in use at address PC. */
|
/* Return the frame pointer in use at address PC. */
|
||||||
|
@ -739,14 +739,14 @@ void
|
||||||
mcore_virtual_frame_pointer (CORE_ADDR pc, int *reg, LONGEST *offset)
|
mcore_virtual_frame_pointer (CORE_ADDR pc, int *reg, LONGEST *offset)
|
||||||
{
|
{
|
||||||
struct frame_info *dummy = analyze_dummy_frame (pc, 0);
|
struct frame_info *dummy = analyze_dummy_frame (pc, 0);
|
||||||
if (dummy->extra_info->status & MY_FRAME_IN_SP)
|
if (get_frame_extra_info (dummy)->status & MY_FRAME_IN_SP)
|
||||||
{
|
{
|
||||||
*reg = SP_REGNUM;
|
*reg = SP_REGNUM;
|
||||||
*offset = 0;
|
*offset = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*reg = dummy->extra_info->fp_regnum;
|
*reg = get_frame_extra_info (dummy)->fp_regnum;
|
||||||
*offset = 0;
|
*offset = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1050,8 +1050,8 @@ mcore_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
frame_saved_regs_zalloc (fi);
|
frame_saved_regs_zalloc (fi);
|
||||||
|
|
||||||
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
||||||
fi->extra_info->status = 0;
|
get_frame_extra_info (fi)->status = 0;
|
||||||
fi->extra_info->framesize = 0;
|
get_frame_extra_info (fi)->framesize = 0;
|
||||||
|
|
||||||
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
|
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
|
||||||
get_frame_base (fi)))
|
get_frame_base (fi)))
|
||||||
|
|
|
@ -492,12 +492,12 @@ void
|
||||||
mips_print_extra_frame_info (struct frame_info *fi)
|
mips_print_extra_frame_info (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
if (fi
|
if (fi
|
||||||
&& fi->extra_info
|
&& get_frame_extra_info (fi)
|
||||||
&& fi->extra_info->proc_desc
|
&& get_frame_extra_info (fi)->proc_desc
|
||||||
&& fi->extra_info->proc_desc->pdr.framereg < NUM_REGS)
|
&& get_frame_extra_info (fi)->proc_desc->pdr.framereg < NUM_REGS)
|
||||||
printf_filtered (" frame pointer is at %s+%s\n",
|
printf_filtered (" frame pointer is at %s+%s\n",
|
||||||
REGISTER_NAME (fi->extra_info->proc_desc->pdr.framereg),
|
REGISTER_NAME (get_frame_extra_info (fi)->proc_desc->pdr.framereg),
|
||||||
paddr_d (fi->extra_info->proc_desc->pdr.frameoffset));
|
paddr_d (get_frame_extra_info (fi)->proc_desc->pdr.frameoffset));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Number of bytes of storage in the actual machine representation for
|
/* Number of bytes of storage in the actual machine representation for
|
||||||
|
@ -1434,7 +1434,7 @@ mips_find_saved_regs (struct frame_info *fci)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
proc_desc = fci->extra_info->proc_desc;
|
proc_desc = get_frame_extra_info (fci)->proc_desc;
|
||||||
if (proc_desc == NULL)
|
if (proc_desc == NULL)
|
||||||
/* I'm not sure how/whether this can happen. Normally when we can't
|
/* I'm not sure how/whether this can happen. Normally when we can't
|
||||||
find a proc_desc, we "synthesize" one using heuristic_proc_desc
|
find a proc_desc, we "synthesize" one using heuristic_proc_desc
|
||||||
|
@ -1695,7 +1695,7 @@ static CORE_ADDR
|
||||||
mips_frame_saved_pc (struct frame_info *frame)
|
mips_frame_saved_pc (struct frame_info *frame)
|
||||||
{
|
{
|
||||||
CORE_ADDR saved_pc;
|
CORE_ADDR saved_pc;
|
||||||
mips_extra_func_info_t proc_desc = frame->extra_info->proc_desc;
|
mips_extra_func_info_t proc_desc = get_frame_extra_info (frame)->proc_desc;
|
||||||
/* We have to get the saved pc from the sigcontext
|
/* We have to get the saved pc from the sigcontext
|
||||||
if it is a signal handler frame. */
|
if it is a signal handler frame. */
|
||||||
int pcreg = (get_frame_type (frame) == SIGTRAMP_FRAME) ? PC_REGNUM
|
int pcreg = (get_frame_type (frame) == SIGTRAMP_FRAME) ? PC_REGNUM
|
||||||
|
@ -2477,7 +2477,7 @@ mips_init_extra_frame_info (int fromleaf, struct frame_info *fci)
|
||||||
frame_extra_info_zalloc (fci, sizeof (struct frame_extra_info));
|
frame_extra_info_zalloc (fci, sizeof (struct frame_extra_info));
|
||||||
|
|
||||||
fci->saved_regs = NULL;
|
fci->saved_regs = NULL;
|
||||||
fci->extra_info->proc_desc =
|
get_frame_extra_info (fci)->proc_desc =
|
||||||
proc_desc == &temp_proc_desc ? 0 : proc_desc;
|
proc_desc == &temp_proc_desc ? 0 : proc_desc;
|
||||||
if (proc_desc)
|
if (proc_desc)
|
||||||
{
|
{
|
||||||
|
@ -2529,12 +2529,12 @@ mips_init_extra_frame_info (int fromleaf, struct frame_info *fci)
|
||||||
|
|
||||||
/* hack: if argument regs are saved, guess these contain args */
|
/* hack: if argument regs are saved, guess these contain args */
|
||||||
/* assume we can't tell how many args for now */
|
/* assume we can't tell how many args for now */
|
||||||
fci->extra_info->num_args = -1;
|
get_frame_extra_info (fci)->num_args = -1;
|
||||||
for (regnum = MIPS_LAST_ARG_REGNUM; regnum >= A0_REGNUM; regnum--)
|
for (regnum = MIPS_LAST_ARG_REGNUM; regnum >= A0_REGNUM; regnum--)
|
||||||
{
|
{
|
||||||
if (PROC_REG_MASK (proc_desc) & (1 << regnum))
|
if (PROC_REG_MASK (proc_desc) & (1 << regnum))
|
||||||
{
|
{
|
||||||
fci->extra_info->num_args = regnum - A0_REGNUM + 1;
|
get_frame_extra_info (fci)->num_args = regnum - A0_REGNUM + 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3816,7 +3816,7 @@ mips_pop_frame (void)
|
||||||
register int regnum;
|
register int regnum;
|
||||||
struct frame_info *frame = get_current_frame ();
|
struct frame_info *frame = get_current_frame ();
|
||||||
CORE_ADDR new_sp = get_frame_base (frame);
|
CORE_ADDR new_sp = get_frame_base (frame);
|
||||||
mips_extra_func_info_t proc_desc = frame->extra_info->proc_desc;
|
mips_extra_func_info_t proc_desc = get_frame_extra_info (frame)->proc_desc;
|
||||||
|
|
||||||
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), 0, 0))
|
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), 0, 0))
|
||||||
{
|
{
|
||||||
|
|
|
@ -163,8 +163,8 @@ analyze_dummy_frame (CORE_ADDR pc, CORE_ADDR frame)
|
||||||
deprecated_set_frame_prev_hack (dummy, NULL);
|
deprecated_set_frame_prev_hack (dummy, NULL);
|
||||||
deprecated_update_frame_pc_hack (dummy, pc);
|
deprecated_update_frame_pc_hack (dummy, pc);
|
||||||
deprecated_update_frame_base_hack (dummy, frame);
|
deprecated_update_frame_base_hack (dummy, frame);
|
||||||
dummy->extra_info->status = 0;
|
get_frame_extra_info (dummy)->status = 0;
|
||||||
dummy->extra_info->stack_size = 0;
|
get_frame_extra_info (dummy)->stack_size = 0;
|
||||||
memset (get_frame_saved_regs (dummy), '\000', SIZEOF_FRAME_SAVED_REGS);
|
memset (get_frame_saved_regs (dummy), '\000', SIZEOF_FRAME_SAVED_REGS);
|
||||||
mn10300_analyze_prologue (dummy, 0);
|
mn10300_analyze_prologue (dummy, 0);
|
||||||
return dummy;
|
return dummy;
|
||||||
|
@ -209,9 +209,9 @@ fix_frame_pointer (struct frame_info *fi, int stack_size)
|
||||||
{
|
{
|
||||||
if (fi && get_next_frame (fi) == NULL)
|
if (fi && get_next_frame (fi) == NULL)
|
||||||
{
|
{
|
||||||
if (fi->extra_info->status & MY_FRAME_IN_SP)
|
if (get_frame_extra_info (fi)->status & MY_FRAME_IN_SP)
|
||||||
deprecated_update_frame_base_hack (fi, read_sp () - stack_size);
|
deprecated_update_frame_base_hack (fi, read_sp () - stack_size);
|
||||||
else if (fi->extra_info->status & MY_FRAME_IN_FP)
|
else if (get_frame_extra_info (fi)->status & MY_FRAME_IN_FP)
|
||||||
deprecated_update_frame_base_hack (fi, read_register (A3_REGNUM));
|
deprecated_update_frame_base_hack (fi, read_register (A3_REGNUM));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -415,13 +415,13 @@ mn10300_analyze_prologue (struct frame_info *fi, CORE_ADDR pc)
|
||||||
if (strcmp (name, "start") == 0)
|
if (strcmp (name, "start") == 0)
|
||||||
{
|
{
|
||||||
if (fi != NULL)
|
if (fi != NULL)
|
||||||
fi->extra_info->status = NO_MORE_FRAMES;
|
get_frame_extra_info (fi)->status = NO_MORE_FRAMES;
|
||||||
return pc;
|
return pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* At the start of a function our frame is in the stack pointer. */
|
/* At the start of a function our frame is in the stack pointer. */
|
||||||
if (fi)
|
if (fi)
|
||||||
fi->extra_info->status = MY_FRAME_IN_SP;
|
get_frame_extra_info (fi)->status = MY_FRAME_IN_SP;
|
||||||
|
|
||||||
/* Get the next two bytes into buf, we need two because rets is a two
|
/* Get the next two bytes into buf, we need two because rets is a two
|
||||||
byte insn and the first isn't enough to uniquely identify it. */
|
byte insn and the first isn't enough to uniquely identify it. */
|
||||||
|
@ -473,7 +473,7 @@ mn10300_analyze_prologue (struct frame_info *fi, CORE_ADDR pc)
|
||||||
if (buf[0] == 0xf2 && (buf[1] & 0xf3) == 0xf0)
|
if (buf[0] == 0xf2 && (buf[1] & 0xf3) == 0xf0)
|
||||||
{
|
{
|
||||||
if (fi)
|
if (fi)
|
||||||
fi->extra_info->status = NO_MORE_FRAMES;
|
get_frame_extra_info (fi)->status = NO_MORE_FRAMES;
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -524,8 +524,8 @@ mn10300_analyze_prologue (struct frame_info *fi, CORE_ADDR pc)
|
||||||
/* The frame pointer is now valid. */
|
/* The frame pointer is now valid. */
|
||||||
if (fi)
|
if (fi)
|
||||||
{
|
{
|
||||||
fi->extra_info->status |= MY_FRAME_IN_FP;
|
get_frame_extra_info (fi)->status |= MY_FRAME_IN_FP;
|
||||||
fi->extra_info->status &= ~MY_FRAME_IN_SP;
|
get_frame_extra_info (fi)->status &= ~MY_FRAME_IN_SP;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Quit now if we're beyond the stop point. */
|
/* Quit now if we're beyond the stop point. */
|
||||||
|
@ -599,7 +599,7 @@ mn10300_analyze_prologue (struct frame_info *fi, CORE_ADDR pc)
|
||||||
/* Note the size of the stack in the frame info structure. */
|
/* Note the size of the stack in the frame info structure. */
|
||||||
stack_size = extract_signed_integer (buf, imm_size);
|
stack_size = extract_signed_integer (buf, imm_size);
|
||||||
if (fi)
|
if (fi)
|
||||||
fi->extra_info->stack_size = stack_size;
|
get_frame_extra_info (fi)->stack_size = stack_size;
|
||||||
|
|
||||||
/* We just consumed 2 + imm_size bytes. */
|
/* We just consumed 2 + imm_size bytes. */
|
||||||
addr += 2 + imm_size;
|
addr += 2 + imm_size;
|
||||||
|
@ -662,11 +662,11 @@ mn10300_frame_chain (struct frame_info *fi)
|
||||||
struct frame_info *dummy;
|
struct frame_info *dummy;
|
||||||
/* Walk through the prologue to determine the stack size,
|
/* Walk through the prologue to determine the stack size,
|
||||||
location of saved registers, end of the prologue, etc. */
|
location of saved registers, end of the prologue, etc. */
|
||||||
if (fi->extra_info->status == 0)
|
if (get_frame_extra_info (fi)->status == 0)
|
||||||
mn10300_analyze_prologue (fi, (CORE_ADDR) 0);
|
mn10300_analyze_prologue (fi, (CORE_ADDR) 0);
|
||||||
|
|
||||||
/* Quit now if mn10300_analyze_prologue set NO_MORE_FRAMES. */
|
/* Quit now if mn10300_analyze_prologue set NO_MORE_FRAMES. */
|
||||||
if (fi->extra_info->status & NO_MORE_FRAMES)
|
if (get_frame_extra_info (fi)->status & NO_MORE_FRAMES)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Now that we've analyzed our prologue, determine the frame
|
/* Now that we've analyzed our prologue, determine the frame
|
||||||
|
@ -688,7 +688,7 @@ mn10300_frame_chain (struct frame_info *fi)
|
||||||
find stuff for us. */
|
find stuff for us. */
|
||||||
dummy = analyze_dummy_frame (FRAME_SAVED_PC (fi), get_frame_base (fi));
|
dummy = analyze_dummy_frame (FRAME_SAVED_PC (fi), get_frame_base (fi));
|
||||||
|
|
||||||
if (dummy->extra_info->status & MY_FRAME_IN_FP)
|
if (get_frame_extra_info (dummy)->status & MY_FRAME_IN_FP)
|
||||||
{
|
{
|
||||||
/* Our caller has a frame pointer. So find the frame in $a3 or
|
/* Our caller has a frame pointer. So find the frame in $a3 or
|
||||||
in the stack. */
|
in the stack. */
|
||||||
|
@ -704,7 +704,7 @@ mn10300_frame_chain (struct frame_info *fi)
|
||||||
/* Our caller does not have a frame pointer. So his frame starts
|
/* Our caller does not have a frame pointer. So his frame starts
|
||||||
at the base of our frame (fi->frame) + register save space
|
at the base of our frame (fi->frame) + register save space
|
||||||
+ <his size>. */
|
+ <his size>. */
|
||||||
return get_frame_base (fi) + adjust + -dummy->extra_info->stack_size;
|
return get_frame_base (fi) + adjust + -get_frame_extra_info (dummy)->stack_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -903,8 +903,8 @@ mn10300_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
frame_saved_regs_zalloc (fi);
|
frame_saved_regs_zalloc (fi);
|
||||||
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
||||||
|
|
||||||
fi->extra_info->status = 0;
|
get_frame_extra_info (fi)->status = 0;
|
||||||
fi->extra_info->stack_size = 0;
|
get_frame_extra_info (fi)->stack_size = 0;
|
||||||
|
|
||||||
mn10300_analyze_prologue (fi, 0);
|
mn10300_analyze_prologue (fi, 0);
|
||||||
}
|
}
|
||||||
|
@ -931,10 +931,10 @@ mn10300_virtual_frame_pointer (CORE_ADDR pc,
|
||||||
/* Set up a dummy frame_info, Analyze the prolog and fill in the
|
/* Set up a dummy frame_info, Analyze the prolog and fill in the
|
||||||
extra info. */
|
extra info. */
|
||||||
/* Results will tell us which type of frame it uses. */
|
/* Results will tell us which type of frame it uses. */
|
||||||
if (dummy->extra_info->status & MY_FRAME_IN_SP)
|
if (get_frame_extra_info (dummy)->status & MY_FRAME_IN_SP)
|
||||||
{
|
{
|
||||||
*reg = SP_REGNUM;
|
*reg = SP_REGNUM;
|
||||||
*offset = -(dummy->extra_info->stack_size);
|
*offset = -(get_frame_extra_info (dummy)->stack_size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -317,18 +317,18 @@ s390_get_frame_info (CORE_ADDR pc, struct frame_extra_info *fextra_info,
|
||||||
{
|
{
|
||||||
good_prologue = 1;
|
good_prologue = 1;
|
||||||
if (saved_regs && fextra_info && get_next_frame (fi)
|
if (saved_regs && fextra_info && get_next_frame (fi)
|
||||||
&& get_next_frame (fi)->extra_info
|
&& get_frame_extra_info (get_next_frame (fi))
|
||||||
&& get_next_frame (fi)->extra_info->sigcontext)
|
&& get_frame_extra_info (get_next_frame (fi))->sigcontext)
|
||||||
{
|
{
|
||||||
/* We are backtracing from a signal handler */
|
/* We are backtracing from a signal handler */
|
||||||
save_reg_addr = get_next_frame (fi)->extra_info->sigcontext +
|
save_reg_addr = get_frame_extra_info (get_next_frame (fi))->sigcontext +
|
||||||
REGISTER_BYTE (S390_GP0_REGNUM);
|
REGISTER_BYTE (S390_GP0_REGNUM);
|
||||||
for (regidx = 0; regidx < S390_NUM_GPRS; regidx++)
|
for (regidx = 0; regidx < S390_NUM_GPRS; regidx++)
|
||||||
{
|
{
|
||||||
saved_regs[S390_GP0_REGNUM + regidx] = save_reg_addr;
|
saved_regs[S390_GP0_REGNUM + regidx] = save_reg_addr;
|
||||||
save_reg_addr += S390_GPR_SIZE;
|
save_reg_addr += S390_GPR_SIZE;
|
||||||
}
|
}
|
||||||
save_reg_addr = get_next_frame (fi)->extra_info->sigcontext +
|
save_reg_addr = get_frame_extra_info (get_next_frame (fi))->sigcontext +
|
||||||
(GDB_TARGET_IS_ESAME ? S390X_SIGREGS_FP0_OFFSET :
|
(GDB_TARGET_IS_ESAME ? S390X_SIGREGS_FP0_OFFSET :
|
||||||
S390_SIGREGS_FP0_OFFSET);
|
S390_SIGREGS_FP0_OFFSET);
|
||||||
for (regidx = 0; regidx < S390_NUM_FPRS; regidx++)
|
for (regidx = 0; regidx < S390_NUM_FPRS; regidx++)
|
||||||
|
@ -772,8 +772,8 @@ s390_function_start (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
CORE_ADDR function_start = 0;
|
CORE_ADDR function_start = 0;
|
||||||
|
|
||||||
if (fi->extra_info && fi->extra_info->initialised)
|
if (get_frame_extra_info (fi) && get_frame_extra_info (fi)->initialised)
|
||||||
function_start = fi->extra_info->function_start;
|
function_start = get_frame_extra_info (fi)->function_start;
|
||||||
else if (get_frame_pc (fi))
|
else if (get_frame_pc (fi))
|
||||||
function_start = get_pc_function_start (get_frame_pc (fi));
|
function_start = get_pc_function_start (get_frame_pc (fi));
|
||||||
return function_start;
|
return function_start;
|
||||||
|
@ -790,8 +790,8 @@ s390_frameless_function_invocation (struct frame_info *fi)
|
||||||
|
|
||||||
if (get_next_frame (fi) == NULL) /* no may be frameless */
|
if (get_next_frame (fi) == NULL) /* no may be frameless */
|
||||||
{
|
{
|
||||||
if (fi->extra_info)
|
if (get_frame_extra_info (fi))
|
||||||
fextra_info_ptr = fi->extra_info;
|
fextra_info_ptr = get_frame_extra_info (fi);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fextra_info_ptr = &fextra_info;
|
fextra_info_ptr = &fextra_info;
|
||||||
|
@ -907,9 +907,9 @@ s390_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
||||||
if (get_frame_pc (fi))
|
if (get_frame_pc (fi))
|
||||||
s390_get_frame_info (s390_sniff_pc_function_start (get_frame_pc (fi), fi),
|
s390_get_frame_info (s390_sniff_pc_function_start (get_frame_pc (fi), fi),
|
||||||
fi->extra_info, fi, 1);
|
get_frame_extra_info (fi), fi, 1);
|
||||||
else
|
else
|
||||||
s390_memset_extra_info (fi->extra_info);
|
s390_memset_extra_info (get_frame_extra_info (fi));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If saved registers of frame FI are not known yet, read and cache them.
|
/* If saved registers of frame FI are not known yet, read and cache them.
|
||||||
|
@ -928,11 +928,13 @@ s390_frame_init_saved_regs (struct frame_info *fi)
|
||||||
frame_saved_regs_zalloc (fi);
|
frame_saved_regs_zalloc (fi);
|
||||||
if (get_frame_pc (fi))
|
if (get_frame_pc (fi))
|
||||||
{
|
{
|
||||||
quick = (fi->extra_info && fi->extra_info->initialised
|
quick = (get_frame_extra_info (fi)
|
||||||
&& fi->extra_info->good_prologue);
|
&& get_frame_extra_info (fi)->initialised
|
||||||
s390_get_frame_info (quick ? fi->extra_info->function_start :
|
&& get_frame_extra_info (fi)->good_prologue);
|
||||||
s390_sniff_pc_function_start (get_frame_pc (fi), fi),
|
s390_get_frame_info (quick
|
||||||
fi->extra_info, fi, !quick);
|
? get_frame_extra_info (fi)->function_start
|
||||||
|
: s390_sniff_pc_function_start (get_frame_pc (fi), fi),
|
||||||
|
get_frame_extra_info (fi), fi, !quick);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -951,8 +953,8 @@ s390_frame_args_address (struct frame_info *fi)
|
||||||
static CORE_ADDR
|
static CORE_ADDR
|
||||||
s390_frame_saved_pc_nofix (struct frame_info *fi)
|
s390_frame_saved_pc_nofix (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
if (fi->extra_info && fi->extra_info->saved_pc_valid)
|
if (get_frame_extra_info (fi) && get_frame_extra_info (fi)->saved_pc_valid)
|
||||||
return fi->extra_info->saved_pc;
|
return get_frame_extra_info (fi)->saved_pc;
|
||||||
|
|
||||||
if (deprecated_generic_find_dummy_frame (get_frame_pc (fi),
|
if (deprecated_generic_find_dummy_frame (get_frame_pc (fi),
|
||||||
get_frame_base (fi)))
|
get_frame_base (fi)))
|
||||||
|
@ -960,19 +962,19 @@ s390_frame_saved_pc_nofix (struct frame_info *fi)
|
||||||
get_frame_base (fi), S390_PC_REGNUM);
|
get_frame_base (fi), S390_PC_REGNUM);
|
||||||
|
|
||||||
s390_frame_init_saved_regs (fi);
|
s390_frame_init_saved_regs (fi);
|
||||||
if (fi->extra_info)
|
if (get_frame_extra_info (fi))
|
||||||
{
|
{
|
||||||
fi->extra_info->saved_pc_valid = 1;
|
get_frame_extra_info (fi)->saved_pc_valid = 1;
|
||||||
if (fi->extra_info->good_prologue
|
if (get_frame_extra_info (fi)->good_prologue
|
||||||
&& get_frame_saved_regs (fi)[S390_RETADDR_REGNUM])
|
&& get_frame_saved_regs (fi)[S390_RETADDR_REGNUM])
|
||||||
fi->extra_info->saved_pc
|
get_frame_extra_info (fi)->saved_pc
|
||||||
= ADDR_BITS_REMOVE (read_memory_integer
|
= ADDR_BITS_REMOVE (read_memory_integer
|
||||||
(get_frame_saved_regs (fi)[S390_RETADDR_REGNUM],
|
(get_frame_saved_regs (fi)[S390_RETADDR_REGNUM],
|
||||||
S390_GPR_SIZE));
|
S390_GPR_SIZE));
|
||||||
else
|
else
|
||||||
fi->extra_info->saved_pc
|
get_frame_extra_info (fi)->saved_pc
|
||||||
= ADDR_BITS_REMOVE (read_register (S390_RETADDR_REGNUM));
|
= ADDR_BITS_REMOVE (read_register (S390_RETADDR_REGNUM));
|
||||||
return fi->extra_info->saved_pc;
|
return get_frame_extra_info (fi)->saved_pc;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -982,19 +984,20 @@ s390_frame_saved_pc (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
CORE_ADDR saved_pc = 0, sig_pc;
|
CORE_ADDR saved_pc = 0, sig_pc;
|
||||||
|
|
||||||
if (fi->extra_info && fi->extra_info->sig_fixed_saved_pc_valid)
|
if (get_frame_extra_info (fi)
|
||||||
return fi->extra_info->sig_fixed_saved_pc;
|
&& get_frame_extra_info (fi)->sig_fixed_saved_pc_valid)
|
||||||
|
return get_frame_extra_info (fi)->sig_fixed_saved_pc;
|
||||||
saved_pc = s390_frame_saved_pc_nofix (fi);
|
saved_pc = s390_frame_saved_pc_nofix (fi);
|
||||||
|
|
||||||
if (fi->extra_info)
|
if (get_frame_extra_info (fi))
|
||||||
{
|
{
|
||||||
fi->extra_info->sig_fixed_saved_pc_valid = 1;
|
get_frame_extra_info (fi)->sig_fixed_saved_pc_valid = 1;
|
||||||
if (saved_pc)
|
if (saved_pc)
|
||||||
{
|
{
|
||||||
if (s390_is_sigreturn (saved_pc, fi, NULL, &sig_pc))
|
if (s390_is_sigreturn (saved_pc, fi, NULL, &sig_pc))
|
||||||
saved_pc = sig_pc;
|
saved_pc = sig_pc;
|
||||||
}
|
}
|
||||||
fi->extra_info->sig_fixed_saved_pc = saved_pc;
|
get_frame_extra_info (fi)->sig_fixed_saved_pc = saved_pc;
|
||||||
}
|
}
|
||||||
return saved_pc;
|
return saved_pc;
|
||||||
}
|
}
|
||||||
|
@ -1046,7 +1049,7 @@ s390_frame_chain (struct frame_info *thisframe)
|
||||||
frame_pointer_saved_pc
|
frame_pointer_saved_pc
|
||||||
? 11 : 15)),
|
? 11 : 15)),
|
||||||
S390_GPR_SIZE);
|
S390_GPR_SIZE);
|
||||||
thisframe->extra_info->sigcontext = sregs;
|
get_frame_extra_info (thisframe)->sigcontext = sregs;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -934,7 +934,8 @@ sh_frame_chain (struct frame_info *frame)
|
||||||
get_frame_base (frame)))
|
get_frame_base (frame)))
|
||||||
return get_frame_base (frame); /* dummy frame same as caller's frame */
|
return get_frame_base (frame); /* dummy frame same as caller's frame */
|
||||||
if (get_frame_pc (frame) && !inside_entry_file (get_frame_pc (frame)))
|
if (get_frame_pc (frame) && !inside_entry_file (get_frame_pc (frame)))
|
||||||
return read_memory_integer (get_frame_base (frame) + frame->extra_info->f_offset, 4);
|
return read_memory_integer (get_frame_base (frame)
|
||||||
|
+ get_frame_extra_info (frame)->f_offset, 4);
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -981,7 +982,9 @@ sh64_frame_chain (struct frame_info *frame)
|
||||||
size = 4;
|
size = 4;
|
||||||
else
|
else
|
||||||
size = REGISTER_RAW_SIZE (translate_insn_rn (FP_REGNUM, media_mode));
|
size = REGISTER_RAW_SIZE (translate_insn_rn (FP_REGNUM, media_mode));
|
||||||
return read_memory_integer (get_frame_base (frame) + frame->extra_info->f_offset, size);
|
return read_memory_integer (get_frame_base (frame)
|
||||||
|
+ get_frame_extra_info (frame)->f_offset,
|
||||||
|
size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1079,8 +1082,8 @@ sh_nofp_frame_init_saved_regs (struct frame_info *fi)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fi->extra_info->leaf_function = 1;
|
get_frame_extra_info (fi)->leaf_function = 1;
|
||||||
fi->extra_info->f_offset = 0;
|
get_frame_extra_info (fi)->f_offset = 0;
|
||||||
|
|
||||||
for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
|
for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
|
||||||
where[rn] = -1;
|
where[rn] = -1;
|
||||||
|
@ -1112,7 +1115,7 @@ sh_nofp_frame_init_saved_regs (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
where[gdbarch_tdep (current_gdbarch)->PR_REGNUM] = depth;
|
where[gdbarch_tdep (current_gdbarch)->PR_REGNUM] = depth;
|
||||||
/* If we're storing the pr then this isn't a leaf */
|
/* If we're storing the pr then this isn't a leaf */
|
||||||
fi->extra_info->leaf_function = 0;
|
get_frame_extra_info (fi)->leaf_function = 0;
|
||||||
depth += 4;
|
depth += 4;
|
||||||
}
|
}
|
||||||
else if (IS_MOV_R3 (insn))
|
else if (IS_MOV_R3 (insn))
|
||||||
|
@ -1167,7 +1170,7 @@ sh_nofp_frame_init_saved_regs (struct frame_info *fi)
|
||||||
get_frame_saved_regs (fi)[SP_REGNUM] = get_frame_base (fi) - 4;
|
get_frame_saved_regs (fi)[SP_REGNUM] = get_frame_base (fi) - 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
fi->extra_info->f_offset = depth - where[FP_REGNUM] - 4;
|
get_frame_extra_info (fi)->f_offset = depth - where[FP_REGNUM] - 4;
|
||||||
/* Work out the return pc - either from the saved pr or the pr
|
/* Work out the return pc - either from the saved pr or the pr
|
||||||
value */
|
value */
|
||||||
}
|
}
|
||||||
|
@ -1419,8 +1422,8 @@ sh64_nofp_frame_init_saved_regs (struct frame_info *fi)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fi->extra_info->leaf_function = 1;
|
get_frame_extra_info (fi)->leaf_function = 1;
|
||||||
fi->extra_info->f_offset = 0;
|
get_frame_extra_info (fi)->f_offset = 0;
|
||||||
|
|
||||||
for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
|
for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
|
||||||
where[rn] = -1;
|
where[rn] = -1;
|
||||||
|
@ -1470,7 +1473,7 @@ sh64_nofp_frame_init_saved_regs (struct frame_info *fi)
|
||||||
int reg_nr = tdep->PR_C_REGNUM;
|
int reg_nr = tdep->PR_C_REGNUM;
|
||||||
|
|
||||||
where[reg_nr] = depth - ((((next_insn & 0xf) ^ 0x8) - 0x8) << 2);
|
where[reg_nr] = depth - ((((next_insn & 0xf) ^ 0x8) - 0x8) << 2);
|
||||||
fi->extra_info->leaf_function = 0;
|
get_frame_extra_info (fi)->leaf_function = 0;
|
||||||
pc += insn_size;
|
pc += insn_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1498,7 +1501,7 @@ sh64_nofp_frame_init_saved_regs (struct frame_info *fi)
|
||||||
int reg_nr = tdep->PR_C_REGNUM;
|
int reg_nr = tdep->PR_C_REGNUM;
|
||||||
where[reg_nr] = depth - (r0_val - 4);
|
where[reg_nr] = depth - (r0_val - 4);
|
||||||
r0_val -= 4;
|
r0_val -= 4;
|
||||||
fi->extra_info->leaf_function = 0;
|
get_frame_extra_info (fi)->leaf_function = 0;
|
||||||
}
|
}
|
||||||
else if (IS_MOV_R14_R0 (insn))
|
else if (IS_MOV_R14_R0 (insn))
|
||||||
{
|
{
|
||||||
|
@ -1526,14 +1529,14 @@ sh64_nofp_frame_init_saved_regs (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
where[tdep->PR_REGNUM] =
|
where[tdep->PR_REGNUM] =
|
||||||
depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 3);
|
depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 3);
|
||||||
fi->extra_info->leaf_function = 0;
|
get_frame_extra_info (fi)->leaf_function = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (IS_STL_R18_R15 (insn))
|
else if (IS_STL_R18_R15 (insn))
|
||||||
{
|
{
|
||||||
where[tdep->PR_REGNUM] =
|
where[tdep->PR_REGNUM] =
|
||||||
depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 2);
|
depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 2);
|
||||||
fi->extra_info->leaf_function = 0;
|
get_frame_extra_info (fi)->leaf_function = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (IS_STQ_R14_R15 (insn))
|
else if (IS_STQ_R14_R15 (insn))
|
||||||
|
@ -1589,7 +1592,7 @@ sh64_nofp_frame_init_saved_regs (struct frame_info *fi)
|
||||||
else
|
else
|
||||||
get_frame_saved_regs (fi)[sp_regnum] = get_frame_base (fi);
|
get_frame_saved_regs (fi)[sp_regnum] = get_frame_base (fi);
|
||||||
|
|
||||||
fi->extra_info->f_offset = depth - where[fp_regnum];
|
get_frame_extra_info (fi)->f_offset = depth - where[fp_regnum];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1620,8 +1623,8 @@ sh_fp_frame_init_saved_regs (struct frame_info *fi)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fi->extra_info->leaf_function = 1;
|
get_frame_extra_info (fi)->leaf_function = 1;
|
||||||
fi->extra_info->f_offset = 0;
|
get_frame_extra_info (fi)->f_offset = 0;
|
||||||
|
|
||||||
for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
|
for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
|
||||||
where[rn] = -1;
|
where[rn] = -1;
|
||||||
|
@ -1653,7 +1656,7 @@ sh_fp_frame_init_saved_regs (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
where[tdep->PR_REGNUM] = depth;
|
where[tdep->PR_REGNUM] = depth;
|
||||||
/* If we're storing the pr then this isn't a leaf */
|
/* If we're storing the pr then this isn't a leaf */
|
||||||
fi->extra_info->leaf_function = 0;
|
get_frame_extra_info (fi)->leaf_function = 0;
|
||||||
depth += 4;
|
depth += 4;
|
||||||
}
|
}
|
||||||
else if (IS_MOV_R3 (insn))
|
else if (IS_MOV_R3 (insn))
|
||||||
|
@ -1720,7 +1723,7 @@ sh_fp_frame_init_saved_regs (struct frame_info *fi)
|
||||||
get_frame_saved_regs (fi)[SP_REGNUM] = get_frame_base (fi) - 4;
|
get_frame_saved_regs (fi)[SP_REGNUM] = get_frame_base (fi) - 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
fi->extra_info->f_offset = depth - where[FP_REGNUM] - 4;
|
get_frame_extra_info (fi)->f_offset = depth - where[FP_REGNUM] - 4;
|
||||||
/* Work out the return pc - either from the saved pr or the pr
|
/* Work out the return pc - either from the saved pr or the pr
|
||||||
value */
|
value */
|
||||||
}
|
}
|
||||||
|
@ -1742,17 +1745,17 @@ sh_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
by assuming it's always FP. */
|
by assuming it's always FP. */
|
||||||
deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), get_frame_base (fi),
|
deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), get_frame_base (fi),
|
||||||
SP_REGNUM));
|
SP_REGNUM));
|
||||||
fi->extra_info->return_pc = deprecated_read_register_dummy (get_frame_pc (fi),
|
get_frame_extra_info (fi)->return_pc = deprecated_read_register_dummy (get_frame_pc (fi),
|
||||||
get_frame_base (fi),
|
get_frame_base (fi),
|
||||||
PC_REGNUM);
|
PC_REGNUM);
|
||||||
fi->extra_info->f_offset = -(CALL_DUMMY_LENGTH + 4);
|
get_frame_extra_info (fi)->f_offset = -(CALL_DUMMY_LENGTH + 4);
|
||||||
fi->extra_info->leaf_function = 0;
|
get_frame_extra_info (fi)->leaf_function = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FRAME_INIT_SAVED_REGS (fi);
|
FRAME_INIT_SAVED_REGS (fi);
|
||||||
fi->extra_info->return_pc =
|
get_frame_extra_info (fi)->return_pc =
|
||||||
sh_find_callers_reg (fi, gdbarch_tdep (current_gdbarch)->PR_REGNUM);
|
sh_find_callers_reg (fi, gdbarch_tdep (current_gdbarch)->PR_REGNUM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1773,17 +1776,17 @@ sh64_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
/* We need to setup fi->frame here because run_stack_dummy gets it wrong
|
/* We need to setup fi->frame here because run_stack_dummy gets it wrong
|
||||||
by assuming it's always FP. */
|
by assuming it's always FP. */
|
||||||
deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), get_frame_base (fi), SP_REGNUM));
|
deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), get_frame_base (fi), SP_REGNUM));
|
||||||
fi->extra_info->return_pc =
|
get_frame_extra_info (fi)->return_pc =
|
||||||
deprecated_read_register_dummy (get_frame_pc (fi),
|
deprecated_read_register_dummy (get_frame_pc (fi),
|
||||||
get_frame_base (fi), PC_REGNUM);
|
get_frame_base (fi), PC_REGNUM);
|
||||||
fi->extra_info->f_offset = -(CALL_DUMMY_LENGTH + 4);
|
get_frame_extra_info (fi)->f_offset = -(CALL_DUMMY_LENGTH + 4);
|
||||||
fi->extra_info->leaf_function = 0;
|
get_frame_extra_info (fi)->leaf_function = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FRAME_INIT_SAVED_REGS (fi);
|
FRAME_INIT_SAVED_REGS (fi);
|
||||||
fi->extra_info->return_pc =
|
get_frame_extra_info (fi)->return_pc =
|
||||||
sh64_get_saved_pr (fi, gdbarch_tdep (current_gdbarch)->PR_REGNUM);
|
sh64_get_saved_pr (fi, gdbarch_tdep (current_gdbarch)->PR_REGNUM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1909,7 +1912,7 @@ sh64_extract_struct_value_address (char *regbuf)
|
||||||
static CORE_ADDR
|
static CORE_ADDR
|
||||||
sh_frame_saved_pc (struct frame_info *frame)
|
sh_frame_saved_pc (struct frame_info *frame)
|
||||||
{
|
{
|
||||||
return ((frame)->extra_info->return_pc);
|
return (get_frame_extra_info (frame)->return_pc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Discard from the stack the innermost frame,
|
/* Discard from the stack the innermost frame,
|
||||||
|
@ -1936,7 +1939,7 @@ sh_pop_frame (void)
|
||||||
write_register (regnum,
|
write_register (regnum,
|
||||||
read_memory_integer (get_frame_saved_regs (frame)[regnum], 4));
|
read_memory_integer (get_frame_saved_regs (frame)[regnum], 4));
|
||||||
|
|
||||||
write_register (PC_REGNUM, frame->extra_info->return_pc);
|
write_register (PC_REGNUM, get_frame_extra_info (frame)->return_pc);
|
||||||
write_register (SP_REGNUM, fp + 4);
|
write_register (SP_REGNUM, fp + 4);
|
||||||
}
|
}
|
||||||
flush_cached_frames ();
|
flush_cached_frames ();
|
||||||
|
@ -1979,7 +1982,7 @@ sh64_pop_frame (void)
|
||||||
size));
|
size));
|
||||||
}
|
}
|
||||||
|
|
||||||
write_register (PC_REGNUM, frame->extra_info->return_pc);
|
write_register (PC_REGNUM, get_frame_extra_info (frame)->return_pc);
|
||||||
write_register (SP_REGNUM, fp + 8);
|
write_register (SP_REGNUM, fp + 8);
|
||||||
}
|
}
|
||||||
flush_cached_frames ();
|
flush_cached_frames ();
|
||||||
|
|
102
gdb/sparc-tdep.c
102
gdb/sparc-tdep.c
|
@ -295,10 +295,10 @@ sparc_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
||||||
frame_saved_regs_zalloc (fi);
|
frame_saved_regs_zalloc (fi);
|
||||||
|
|
||||||
fi->extra_info->bottom =
|
get_frame_extra_info (fi)->bottom =
|
||||||
(get_next_frame (fi)
|
(get_next_frame (fi)
|
||||||
? (get_frame_base (fi) == get_frame_base (get_next_frame (fi))
|
? (get_frame_base (fi) == get_frame_base (get_next_frame (fi))
|
||||||
? get_next_frame (fi)->extra_info->bottom
|
? get_frame_extra_info (get_next_frame (fi))->bottom
|
||||||
: get_frame_base (get_next_frame (fi)))
|
: get_frame_base (get_next_frame (fi)))
|
||||||
: read_sp ());
|
: read_sp ());
|
||||||
|
|
||||||
|
@ -320,7 +320,8 @@ sparc_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
/* A frameless function interrupted by a signal did not change
|
/* A frameless function interrupted by a signal did not change
|
||||||
the frame pointer, fix up frame pointer accordingly. */
|
the frame pointer, fix up frame pointer accordingly. */
|
||||||
deprecated_update_frame_base_hack (fi, get_frame_base (get_next_frame (fi)));
|
deprecated_update_frame_base_hack (fi, get_frame_base (get_next_frame (fi)));
|
||||||
fi->extra_info->bottom = get_next_frame (fi)->extra_info->bottom;
|
get_frame_extra_info (fi)->bottom =
|
||||||
|
get_frame_extra_info (get_next_frame (fi))->bottom;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -335,8 +336,8 @@ sparc_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
|
|
||||||
/* Decide whether this is a function with a ``flat register window''
|
/* Decide whether this is a function with a ``flat register window''
|
||||||
frame. For such functions, the frame pointer is actually in %i7. */
|
frame. For such functions, the frame pointer is actually in %i7. */
|
||||||
fi->extra_info->flat = 0;
|
get_frame_extra_info (fi)->flat = 0;
|
||||||
fi->extra_info->in_prologue = 0;
|
get_frame_extra_info (fi)->in_prologue = 0;
|
||||||
if (find_pc_partial_function (get_frame_pc (fi), &name, &prologue_start, &prologue_end))
|
if (find_pc_partial_function (get_frame_pc (fi), &name, &prologue_start, &prologue_end))
|
||||||
{
|
{
|
||||||
/* See if the function starts with an add (which will be of a
|
/* See if the function starts with an add (which will be of a
|
||||||
|
@ -361,9 +362,9 @@ sparc_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
buf = alloca (MAX_REGISTER_RAW_SIZE);
|
buf = alloca (MAX_REGISTER_RAW_SIZE);
|
||||||
|
|
||||||
/* We definitely have a flat frame now. */
|
/* We definitely have a flat frame now. */
|
||||||
fi->extra_info->flat = 1;
|
get_frame_extra_info (fi)->flat = 1;
|
||||||
|
|
||||||
fi->extra_info->sp_offset = offset;
|
get_frame_extra_info (fi)->sp_offset = offset;
|
||||||
|
|
||||||
/* Overwrite the frame's address with the value in %i7. */
|
/* Overwrite the frame's address with the value in %i7. */
|
||||||
get_saved_register (buf, 0, 0, fi, I7_REGNUM, 0);
|
get_saved_register (buf, 0, 0, fi, I7_REGNUM, 0);
|
||||||
|
@ -373,18 +374,18 @@ sparc_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
deprecated_update_frame_base_hack (fi, get_frame_base (fi) + 2047);
|
deprecated_update_frame_base_hack (fi, get_frame_base (fi) + 2047);
|
||||||
|
|
||||||
/* Record where the fp got saved. */
|
/* Record where the fp got saved. */
|
||||||
fi->extra_info->fp_addr =
|
get_frame_extra_info (fi)->fp_addr =
|
||||||
get_frame_base (fi) + fi->extra_info->sp_offset + X_SIMM13 (insn);
|
get_frame_base (fi) + get_frame_extra_info (fi)->sp_offset + X_SIMM13 (insn);
|
||||||
|
|
||||||
/* Also try to collect where the pc got saved to. */
|
/* Also try to collect where the pc got saved to. */
|
||||||
fi->extra_info->pc_addr = 0;
|
get_frame_extra_info (fi)->pc_addr = 0;
|
||||||
insn = fetch_instruction (prologue_start + 12);
|
insn = fetch_instruction (prologue_start + 12);
|
||||||
if (X_OP (insn) == 3
|
if (X_OP (insn) == 3
|
||||||
&& X_RD (insn) == 15
|
&& X_RD (insn) == 15
|
||||||
&& X_OP3 (insn) == 4
|
&& X_OP3 (insn) == 4
|
||||||
&& X_RS1 (insn) == 14)
|
&& X_RS1 (insn) == 14)
|
||||||
fi->extra_info->pc_addr =
|
get_frame_extra_info (fi)->pc_addr =
|
||||||
get_frame_base (fi) + fi->extra_info->sp_offset + X_SIMM13 (insn);
|
get_frame_base (fi) + get_frame_extra_info (fi)->sp_offset + X_SIMM13 (insn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -411,7 +412,7 @@ sparc_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
}
|
}
|
||||||
if (addr >= get_frame_pc (fi))
|
if (addr >= get_frame_pc (fi))
|
||||||
{
|
{
|
||||||
fi->extra_info->in_prologue = 1;
|
get_frame_extra_info (fi)->in_prologue = 1;
|
||||||
deprecated_update_frame_base_hack (fi, read_register (SP_REGNUM));
|
deprecated_update_frame_base_hack (fi, read_register (SP_REGNUM));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -484,7 +485,7 @@ sparc_frame_saved_pc (struct frame_info *frame)
|
||||||
scbuf, sizeof (scbuf));
|
scbuf, sizeof (scbuf));
|
||||||
return extract_address (scbuf, sizeof (scbuf));
|
return extract_address (scbuf, sizeof (scbuf));
|
||||||
}
|
}
|
||||||
else if (frame->extra_info->in_prologue ||
|
else if (get_frame_extra_info (frame)->in_prologue ||
|
||||||
(get_next_frame (frame) != NULL &&
|
(get_next_frame (frame) != NULL &&
|
||||||
((get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME) ||
|
((get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME) ||
|
||||||
deprecated_frame_in_dummy (get_next_frame (frame))) &&
|
deprecated_frame_in_dummy (get_next_frame (frame))) &&
|
||||||
|
@ -496,10 +497,10 @@ sparc_frame_saved_pc (struct frame_info *frame)
|
||||||
frame, O7_REGNUM, (enum lval_type *) NULL);
|
frame, O7_REGNUM, (enum lval_type *) NULL);
|
||||||
return PC_ADJUST (extract_address (buf, SPARC_INTREG_SIZE));
|
return PC_ADJUST (extract_address (buf, SPARC_INTREG_SIZE));
|
||||||
}
|
}
|
||||||
if (frame->extra_info->flat)
|
if (get_frame_extra_info (frame)->flat)
|
||||||
addr = frame->extra_info->pc_addr;
|
addr = get_frame_extra_info (frame)->pc_addr;
|
||||||
else
|
else
|
||||||
addr = frame->extra_info->bottom + FRAME_SAVED_I0 +
|
addr = get_frame_extra_info (frame)->bottom + FRAME_SAVED_I0 +
|
||||||
SPARC_INTREG_SIZE * (I7_REGNUM - I0_REGNUM);
|
SPARC_INTREG_SIZE * (I7_REGNUM - I0_REGNUM);
|
||||||
|
|
||||||
if (addr == 0)
|
if (addr == 0)
|
||||||
|
@ -533,7 +534,7 @@ setup_arbitrary_frame (int argc, CORE_ADDR *argv)
|
||||||
internal_error (__FILE__, __LINE__,
|
internal_error (__FILE__, __LINE__,
|
||||||
"create_new_frame returned invalid frame");
|
"create_new_frame returned invalid frame");
|
||||||
|
|
||||||
frame->extra_info->bottom = argv[1];
|
get_frame_extra_info (frame)->bottom = argv[1];
|
||||||
deprecated_update_frame_pc_hack (frame, FRAME_SAVED_PC (frame));
|
deprecated_update_frame_pc_hack (frame, FRAME_SAVED_PC (frame));
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
@ -675,7 +676,7 @@ examine_prologue (CORE_ADDR start_pc, int frameless_p, struct frame_info *fi,
|
||||||
{
|
{
|
||||||
if (saved_regs && X_I (insn))
|
if (saved_regs && X_I (insn))
|
||||||
saved_regs[X_RD (insn)] =
|
saved_regs[X_RD (insn)] =
|
||||||
get_frame_base (fi) + fi->extra_info->sp_offset + X_SIMM13 (insn);
|
get_frame_base (fi) + get_frame_extra_info (fi)->sp_offset + X_SIMM13 (insn);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
@ -845,8 +846,9 @@ sparc_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
|
||||||
{
|
{
|
||||||
/* FIXME MVS: wrong test for dummy frame at entry. */
|
/* FIXME MVS: wrong test for dummy frame at entry. */
|
||||||
|
|
||||||
if (get_frame_pc (frame1) >= (frame1->extra_info->bottom ?
|
if (get_frame_pc (frame1) >= (get_frame_extra_info (frame1)->bottom
|
||||||
frame1->extra_info->bottom : read_sp ())
|
? get_frame_extra_info (frame1)->bottom
|
||||||
|
: read_sp ())
|
||||||
&& get_frame_pc (frame1) <= get_frame_base (frame1))
|
&& get_frame_pc (frame1) <= get_frame_base (frame1))
|
||||||
{
|
{
|
||||||
/* Dummy frame. All but the window regs are in there somewhere.
|
/* Dummy frame. All but the window regs are in there somewhere.
|
||||||
|
@ -861,7 +863,7 @@ sparc_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
|
||||||
This is because frame1 is initialized to frame->next
|
This is because frame1 is initialized to frame->next
|
||||||
(frame1->prev == frame) and is then advanced towards
|
(frame1->prev == frame) and is then advanced towards
|
||||||
the innermost (next) frame. */
|
the innermost (next) frame. */
|
||||||
addr = (get_prev_frame (frame1)->extra_info->bottom
|
addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
|
||||||
+ (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
|
+ (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
|
||||||
+ FRAME_SAVED_I0);
|
+ FRAME_SAVED_I0);
|
||||||
else if (regnum >= L0_REGNUM && regnum < L0_REGNUM + 8)
|
else if (regnum >= L0_REGNUM && regnum < L0_REGNUM + 8)
|
||||||
|
@ -870,7 +872,7 @@ sparc_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
|
||||||
This is because frame1 is initialized to frame->next
|
This is because frame1 is initialized to frame->next
|
||||||
(frame1->prev == frame) and is then advanced towards
|
(frame1->prev == frame) and is then advanced towards
|
||||||
the innermost (next) frame. */
|
the innermost (next) frame. */
|
||||||
addr = (get_prev_frame (frame1)->extra_info->bottom
|
addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
|
||||||
+ (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
|
+ (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
|
||||||
+ FRAME_SAVED_L0);
|
+ FRAME_SAVED_L0);
|
||||||
else if (regnum >= O0_REGNUM && regnum < O0_REGNUM + 8)
|
else if (regnum >= O0_REGNUM && regnum < O0_REGNUM + 8)
|
||||||
|
@ -888,13 +890,13 @@ sparc_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
|
||||||
addr = get_frame_base (frame1) + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE
|
addr = get_frame_base (frame1) + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE
|
||||||
- (FP_REGISTER_BYTES + 24 * SPARC_INTREG_SIZE);
|
- (FP_REGISTER_BYTES + 24 * SPARC_INTREG_SIZE);
|
||||||
}
|
}
|
||||||
else if (frame1->extra_info->flat)
|
else if (get_frame_extra_info (frame1)->flat)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (regnum == RP_REGNUM)
|
if (regnum == RP_REGNUM)
|
||||||
addr = frame1->extra_info->pc_addr;
|
addr = get_frame_extra_info (frame1)->pc_addr;
|
||||||
else if (regnum == I7_REGNUM)
|
else if (regnum == I7_REGNUM)
|
||||||
addr = frame1->extra_info->fp_addr;
|
addr = get_frame_extra_info (frame1)->fp_addr;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CORE_ADDR func_start;
|
CORE_ADDR func_start;
|
||||||
|
@ -912,11 +914,11 @@ sparc_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
|
||||||
{
|
{
|
||||||
/* Normal frame. Local and In registers are saved on stack. */
|
/* Normal frame. Local and In registers are saved on stack. */
|
||||||
if (regnum >= I0_REGNUM && regnum < I0_REGNUM + 8)
|
if (regnum >= I0_REGNUM && regnum < I0_REGNUM + 8)
|
||||||
addr = (get_prev_frame (frame1)->extra_info->bottom
|
addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
|
||||||
+ (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
|
+ (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
|
||||||
+ FRAME_SAVED_I0);
|
+ FRAME_SAVED_I0);
|
||||||
else if (regnum >= L0_REGNUM && regnum < L0_REGNUM + 8)
|
else if (regnum >= L0_REGNUM && regnum < L0_REGNUM + 8)
|
||||||
addr = (get_prev_frame (frame1)->extra_info->bottom
|
addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
|
||||||
+ (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
|
+ (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
|
||||||
+ FRAME_SAVED_L0);
|
+ FRAME_SAVED_L0);
|
||||||
else if (regnum >= O0_REGNUM && regnum < O0_REGNUM + 8)
|
else if (regnum >= O0_REGNUM && regnum < O0_REGNUM + 8)
|
||||||
|
@ -1119,8 +1121,9 @@ sparc_frame_find_saved_regs (struct frame_info *fi, CORE_ADDR *saved_regs_addr)
|
||||||
|
|
||||||
memset (saved_regs_addr, 0, NUM_REGS * sizeof (CORE_ADDR));
|
memset (saved_regs_addr, 0, NUM_REGS * sizeof (CORE_ADDR));
|
||||||
|
|
||||||
if (get_frame_pc (fi) >= (fi->extra_info->bottom ?
|
if (get_frame_pc (fi) >= (get_frame_extra_info (fi)->bottom
|
||||||
fi->extra_info->bottom : read_sp ())
|
? get_frame_extra_info (fi)->bottom
|
||||||
|
: read_sp ())
|
||||||
&& get_frame_pc (fi) <= get_frame_base (fi))
|
&& get_frame_pc (fi) <= get_frame_base (fi))
|
||||||
{
|
{
|
||||||
/* Dummy frame. All but the window regs are in there somewhere. */
|
/* Dummy frame. All but the window regs are in there somewhere. */
|
||||||
|
@ -1156,24 +1159,26 @@ sparc_frame_find_saved_regs (struct frame_info *fi, CORE_ADDR *saved_regs_addr)
|
||||||
frame_addr + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE
|
frame_addr + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE
|
||||||
- DUMMY_STACK_REG_BUF_SIZE;
|
- DUMMY_STACK_REG_BUF_SIZE;
|
||||||
|
|
||||||
frame_addr = fi->extra_info->bottom ?
|
frame_addr = (get_frame_extra_info (fi)->bottom
|
||||||
fi->extra_info->bottom : read_sp ();
|
? get_frame_extra_info (fi)->bottom
|
||||||
|
: read_sp ());
|
||||||
}
|
}
|
||||||
else if (fi->extra_info->flat)
|
else if (get_frame_extra_info (fi)->flat)
|
||||||
{
|
{
|
||||||
CORE_ADDR func_start;
|
CORE_ADDR func_start;
|
||||||
find_pc_partial_function (get_frame_pc (fi), NULL, &func_start, NULL);
|
find_pc_partial_function (get_frame_pc (fi), NULL, &func_start, NULL);
|
||||||
examine_prologue (func_start, 0, fi, saved_regs_addr);
|
examine_prologue (func_start, 0, fi, saved_regs_addr);
|
||||||
|
|
||||||
/* Flat register window frame. */
|
/* Flat register window frame. */
|
||||||
saved_regs_addr[RP_REGNUM] = fi->extra_info->pc_addr;
|
saved_regs_addr[RP_REGNUM] = get_frame_extra_info (fi)->pc_addr;
|
||||||
saved_regs_addr[I7_REGNUM] = fi->extra_info->fp_addr;
|
saved_regs_addr[I7_REGNUM] = get_frame_extra_info (fi)->fp_addr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Normal frame. Just Local and In registers */
|
/* Normal frame. Just Local and In registers */
|
||||||
frame_addr = fi->extra_info->bottom ?
|
frame_addr = (get_frame_extra_info (fi)->bottom
|
||||||
fi->extra_info->bottom : read_sp ();
|
? get_frame_extra_info (fi)->bottom
|
||||||
|
: read_sp ());
|
||||||
for (regnum = L0_REGNUM; regnum < L0_REGNUM + 8; regnum++)
|
for (regnum = L0_REGNUM; regnum < L0_REGNUM + 8; regnum++)
|
||||||
saved_regs_addr[regnum] =
|
saved_regs_addr[regnum] =
|
||||||
(frame_addr + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
|
(frame_addr + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
|
||||||
|
@ -1185,16 +1190,17 @@ sparc_frame_find_saved_regs (struct frame_info *fi, CORE_ADDR *saved_regs_addr)
|
||||||
}
|
}
|
||||||
if (get_next_frame (fi))
|
if (get_next_frame (fi))
|
||||||
{
|
{
|
||||||
if (fi->extra_info->flat)
|
if (get_frame_extra_info (fi)->flat)
|
||||||
{
|
{
|
||||||
saved_regs_addr[O7_REGNUM] = fi->extra_info->pc_addr;
|
saved_regs_addr[O7_REGNUM] = get_frame_extra_info (fi)->pc_addr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Pull off either the next frame pointer or the stack pointer */
|
/* Pull off either the next frame pointer or the stack pointer */
|
||||||
CORE_ADDR next_next_frame_addr =
|
CORE_ADDR next_next_frame_addr =
|
||||||
(get_next_frame (fi)->extra_info->bottom ?
|
(get_frame_extra_info (get_next_frame (fi))->bottom
|
||||||
get_next_frame (fi)->extra_info->bottom : read_sp ());
|
? get_frame_extra_info (get_next_frame (fi))->bottom
|
||||||
|
: read_sp ());
|
||||||
for (regnum = O0_REGNUM; regnum < O0_REGNUM + 8; regnum++)
|
for (regnum = O0_REGNUM; regnum < O0_REGNUM + 8; regnum++)
|
||||||
saved_regs_addr[regnum] =
|
saved_regs_addr[regnum] =
|
||||||
(next_next_frame_addr
|
(next_next_frame_addr
|
||||||
|
@ -1263,7 +1269,7 @@ sparc_pop_frame (void)
|
||||||
7 * SPARC_INTREG_SIZE);
|
7 * SPARC_INTREG_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frame->extra_info->flat)
|
if (get_frame_extra_info (frame)->flat)
|
||||||
{
|
{
|
||||||
/* Each register might or might not have been saved, need to test
|
/* Each register might or might not have been saved, need to test
|
||||||
individually. */
|
individually. */
|
||||||
|
@ -1340,11 +1346,11 @@ sparc_pop_frame (void)
|
||||||
read_memory_integer (fsr[NPC_REGNUM],
|
read_memory_integer (fsr[NPC_REGNUM],
|
||||||
REGISTER_RAW_SIZE (NPC_REGNUM)));
|
REGISTER_RAW_SIZE (NPC_REGNUM)));
|
||||||
}
|
}
|
||||||
else if (frame->extra_info->flat)
|
else if (get_frame_extra_info (frame)->flat)
|
||||||
{
|
{
|
||||||
if (frame->extra_info->pc_addr)
|
if (get_frame_extra_info (frame)->pc_addr)
|
||||||
pc = PC_ADJUST ((CORE_ADDR)
|
pc = PC_ADJUST ((CORE_ADDR)
|
||||||
read_memory_integer (frame->extra_info->pc_addr,
|
read_memory_integer (get_frame_extra_info (frame)->pc_addr,
|
||||||
REGISTER_RAW_SIZE (PC_REGNUM)));
|
REGISTER_RAW_SIZE (PC_REGNUM)));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2685,10 +2691,10 @@ sparc64_stack_align (CORE_ADDR addr)
|
||||||
extern void
|
extern void
|
||||||
sparc_print_extra_frame_info (struct frame_info *fi)
|
sparc_print_extra_frame_info (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
if (fi && fi->extra_info && fi->extra_info->flat)
|
if (fi && get_frame_extra_info (fi) && get_frame_extra_info (fi)->flat)
|
||||||
printf_filtered (" flat, pc saved at 0x%s, fp saved at 0x%s\n",
|
printf_filtered (" flat, pc saved at 0x%s, fp saved at 0x%s\n",
|
||||||
paddr_nz (fi->extra_info->pc_addr),
|
paddr_nz (get_frame_extra_info (fi)->pc_addr),
|
||||||
paddr_nz (fi->extra_info->fp_addr));
|
paddr_nz (get_frame_extra_info (fi)->fp_addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* MULTI_ARCH support */
|
/* MULTI_ARCH support */
|
||||||
|
|
|
@ -478,7 +478,7 @@ xstormy16_scan_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr,
|
||||||
fp = xstormy16_frame_saved_register (fi, E_FP_REGNUM);
|
fp = xstormy16_frame_saved_register (fi, E_FP_REGNUM);
|
||||||
|
|
||||||
/* Initialize framesize with size of PC put on stack by CALLF inst. */
|
/* Initialize framesize with size of PC put on stack by CALLF inst. */
|
||||||
fi->extra_info->framesize = xstormy16_pc_size;
|
get_frame_extra_info (fi)->framesize = xstormy16_pc_size;
|
||||||
}
|
}
|
||||||
for (next_addr = start_addr;
|
for (next_addr = start_addr;
|
||||||
next_addr < end_addr; next_addr += xstormy16_inst_size)
|
next_addr < end_addr; next_addr += xstormy16_inst_size)
|
||||||
|
@ -492,8 +492,8 @@ xstormy16_scan_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr,
|
||||||
if (fi)
|
if (fi)
|
||||||
{
|
{
|
||||||
regnum = inst & 0x000f;
|
regnum = inst & 0x000f;
|
||||||
get_frame_saved_regs (fi)[regnum] = fi->extra_info->framesize;
|
get_frame_saved_regs (fi)[regnum] = get_frame_extra_info (fi)->framesize;
|
||||||
fi->extra_info->framesize += xstormy16_reg_size;
|
get_frame_extra_info (fi)->framesize += xstormy16_reg_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -501,28 +501,28 @@ xstormy16_scan_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr,
|
||||||
else if (inst == 0x301f || inst == 0x303f) /* inc r15, #0x1/#0x3 */
|
else if (inst == 0x301f || inst == 0x303f) /* inc r15, #0x1/#0x3 */
|
||||||
{
|
{
|
||||||
if (fi) /* Record the frame size. */
|
if (fi) /* Record the frame size. */
|
||||||
fi->extra_info->framesize += ((inst & 0x0030) >> 4) + 1;
|
get_frame_extra_info (fi)->framesize += ((inst & 0x0030) >> 4) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* optional stack allocation for args and local vars > 4 && < 16 byte */
|
/* optional stack allocation for args and local vars > 4 && < 16 byte */
|
||||||
else if ((inst & 0xff0f) == 0x510f) /* 51Hf add r15, #0xH */
|
else if ((inst & 0xff0f) == 0x510f) /* 51Hf add r15, #0xH */
|
||||||
{
|
{
|
||||||
if (fi) /* Record the frame size. */
|
if (fi) /* Record the frame size. */
|
||||||
fi->extra_info->framesize += (inst & 0x00f0) >> 4;
|
get_frame_extra_info (fi)->framesize += (inst & 0x00f0) >> 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* optional stack allocation for args and local vars >= 16 byte */
|
/* optional stack allocation for args and local vars >= 16 byte */
|
||||||
else if (inst == 0x314f && inst2 >= 0x0010) /* 314f HHHH add r15, #0xH */
|
else if (inst == 0x314f && inst2 >= 0x0010) /* 314f HHHH add r15, #0xH */
|
||||||
{
|
{
|
||||||
if (fi) /* Record the frame size. */
|
if (fi) /* Record the frame size. */
|
||||||
fi->extra_info->framesize += inst2;
|
get_frame_extra_info (fi)->framesize += inst2;
|
||||||
next_addr += xstormy16_inst_size;
|
next_addr += xstormy16_inst_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (inst == 0x46fd) /* mov r13, r15 */
|
else if (inst == 0x46fd) /* mov r13, r15 */
|
||||||
{
|
{
|
||||||
if (fi) /* Record that the frame pointer is in use. */
|
if (fi) /* Record that the frame pointer is in use. */
|
||||||
fi->extra_info->frameless_p = 0;
|
get_frame_extra_info (fi)->frameless_p = 0;
|
||||||
if (frameless)
|
if (frameless)
|
||||||
*frameless = 0;
|
*frameless = 0;
|
||||||
}
|
}
|
||||||
|
@ -548,7 +548,7 @@ xstormy16_scan_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr,
|
||||||
if (offset & 0x0800)
|
if (offset & 0x0800)
|
||||||
offset -= 0x1000;
|
offset -= 0x1000;
|
||||||
|
|
||||||
get_frame_saved_regs (fi)[regnum] = fi->extra_info->framesize + offset;
|
get_frame_saved_regs (fi)[regnum] = get_frame_extra_info (fi)->framesize + offset;
|
||||||
}
|
}
|
||||||
next_addr += xstormy16_inst_size;
|
next_addr += xstormy16_inst_size;
|
||||||
}
|
}
|
||||||
|
@ -593,14 +593,14 @@ xstormy16_scan_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr,
|
||||||
by convention what we put here is simply the previous
|
by convention what we put here is simply the previous
|
||||||
_value_ of the SP (as opposed to an address where the
|
_value_ of the SP (as opposed to an address where the
|
||||||
previous value would have been pushed). */
|
previous value would have been pushed). */
|
||||||
if (fi->extra_info->frameless_p)
|
if (get_frame_extra_info (fi)->frameless_p)
|
||||||
{
|
{
|
||||||
get_frame_saved_regs (fi)[E_SP_REGNUM] = sp - fi->extra_info->framesize;
|
get_frame_saved_regs (fi)[E_SP_REGNUM] = sp - get_frame_extra_info (fi)->framesize;
|
||||||
deprecated_update_frame_base_hack (fi, sp);
|
deprecated_update_frame_base_hack (fi, sp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
get_frame_saved_regs (fi)[E_SP_REGNUM] = fp - fi->extra_info->framesize;
|
get_frame_saved_regs (fi)[E_SP_REGNUM] = fp - get_frame_extra_info (fi)->framesize;
|
||||||
deprecated_update_frame_base_hack (fi, fp);
|
deprecated_update_frame_base_hack (fi, fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -783,11 +783,11 @@ xstormy16_frame_saved_pc (struct frame_info *fi)
|
||||||
static void
|
static void
|
||||||
xstormy16_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
xstormy16_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||||
{
|
{
|
||||||
if (!fi->extra_info)
|
if (!get_frame_extra_info (fi))
|
||||||
{
|
{
|
||||||
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
|
||||||
fi->extra_info->framesize = 0;
|
get_frame_extra_info (fi)->framesize = 0;
|
||||||
fi->extra_info->frameless_p = 1; /* Default frameless, detect framed */
|
get_frame_extra_info (fi)->frameless_p = 1; /* Default frameless, detect framed */
|
||||||
|
|
||||||
/* By default, the fi->frame is set to the value of the FP reg by gdb.
|
/* By default, the fi->frame is set to the value of the FP reg by gdb.
|
||||||
This may not always be right; we may be in a frameless function,
|
This may not always be right; we may be in a frameless function,
|
||||||
|
@ -829,7 +829,7 @@ xstormy16_frame_chain (struct frame_info *fi)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Return computed offset from this frame's fp. */
|
/* Return computed offset from this frame's fp. */
|
||||||
return get_frame_base (fi) - fi->extra_info->framesize;
|
return get_frame_base (fi) - get_frame_extra_info (fi)->framesize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -837,8 +837,8 @@ static int
|
||||||
xstormy16_frame_chain_valid (CORE_ADDR chain, struct frame_info *thisframe)
|
xstormy16_frame_chain_valid (CORE_ADDR chain, struct frame_info *thisframe)
|
||||||
{
|
{
|
||||||
return chain < 0x8000 && FRAME_SAVED_PC (thisframe) >= 0x8000 &&
|
return chain < 0x8000 && FRAME_SAVED_PC (thisframe) >= 0x8000 &&
|
||||||
(thisframe->extra_info->frameless_p ||
|
(get_frame_extra_info (thisframe)->frameless_p ||
|
||||||
get_frame_base (thisframe) - thisframe->extra_info->framesize == chain);
|
get_frame_base (thisframe) - get_frame_extra_info (thisframe)->framesize == chain);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function: xstormy16_saved_pc_after_call
|
/* Function: xstormy16_saved_pc_after_call
|
||||||
|
|
Loading…
Reference in a new issue