* alpha-mdebug-tdep.c (alpha_mdebug_frame_p): Reject prologues.
(alpha_mdebug_frame_unwind_cache): Don't call the heuristic unwinder. (alpha_mdebug_frame_this_id): Likewise. (alpha_mdebug_frame_prev_register): Likewise. (alpha_mdebug_frame_base_address): Likewise. (alpha_mdebug_frame_locals_address): Likewise. (alpha_mdebug_frame_args_address): Likewise. (struct alpha_mdebug_unwind_cache): Remove in_prologue_cache. * alpha-tdep.c (alpha_heuristic_proc_start): Use get_pc_function_start. (alpha_heuristic_frame_unwind_cache): Make static; add missing loop increment. (alpha_heuristic_frame_this_id): Make static. (alpha_heuristic_frame_prev_register): Likewise. (alpha_heuristic_frame_base_address): Likewise. * alpha-tdep.h: Update.
This commit is contained in:
parent
86f1d0fbb5
commit
fbe586aede
4 changed files with 85 additions and 110 deletions
|
@ -1,3 +1,21 @@
|
|||
2003-05-30 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* alpha-mdebug-tdep.c (alpha_mdebug_frame_p): Reject prologues.
|
||||
(alpha_mdebug_frame_unwind_cache): Don't call the heuristic unwinder.
|
||||
(alpha_mdebug_frame_this_id): Likewise.
|
||||
(alpha_mdebug_frame_prev_register): Likewise.
|
||||
(alpha_mdebug_frame_base_address): Likewise.
|
||||
(alpha_mdebug_frame_locals_address): Likewise.
|
||||
(alpha_mdebug_frame_args_address): Likewise.
|
||||
(struct alpha_mdebug_unwind_cache): Remove in_prologue_cache.
|
||||
* alpha-tdep.c (alpha_heuristic_proc_start): Use get_pc_function_start.
|
||||
(alpha_heuristic_frame_unwind_cache): Make static; add missing
|
||||
loop increment.
|
||||
(alpha_heuristic_frame_this_id): Make static.
|
||||
(alpha_heuristic_frame_prev_register): Likewise.
|
||||
(alpha_heuristic_frame_base_address): Likewise.
|
||||
* alpha-tdep.h: Update.
|
||||
|
||||
2003-05-30 Mark Kettenis <kettenis@gnu.org>
|
||||
|
||||
* i386-tdep.h (i386bsd_sigcontext_addr): Remove prototype.
|
||||
|
|
|
@ -174,7 +174,6 @@ struct alpha_mdebug_unwind_cache
|
|||
alpha_extra_func_info_t proc_desc;
|
||||
CORE_ADDR vfp;
|
||||
CORE_ADDR *saved_regs;
|
||||
void *in_prologue_cache;
|
||||
};
|
||||
|
||||
/* Extract all of the information about the frame from PROC_DESC
|
||||
|
@ -205,21 +204,6 @@ alpha_mdebug_frame_unwind_cache (struct frame_info *next_frame,
|
|||
info->proc_desc = proc_desc;
|
||||
gdb_assert (proc_desc != NULL);
|
||||
|
||||
/* If we're in the prologue, the PDR for this frame is not yet valid. */
|
||||
/* ??? We could have said "no" in alpha_mdebug_frame_p, and we'd
|
||||
walk down the list of unwinders and try the heuristic unwinder
|
||||
and things would have been fine. However, since we have the PDR,
|
||||
we know how to skip the search for the start of the procedure,
|
||||
and all the uncertainty involved there. So instead, arrange for
|
||||
us to defer to the heuristic unwinder directly. */
|
||||
if (alpha_mdebug_in_prologue (pc, proc_desc))
|
||||
{
|
||||
alpha_heuristic_frame_unwind_cache (next_frame,
|
||||
&info->in_prologue_cache,
|
||||
PROC_LOW_ADDR (proc_desc));
|
||||
return info;
|
||||
}
|
||||
|
||||
info->saved_regs = frame_obstack_zalloc (SIZEOF_FRAME_SAVED_REGS);
|
||||
|
||||
/* The VFP of the frame is at FRAME_REG+FRAME_OFFSET. */
|
||||
|
@ -275,11 +259,6 @@ alpha_mdebug_frame_this_id (struct frame_info *next_frame,
|
|||
struct alpha_mdebug_unwind_cache *info
|
||||
= alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
|
||||
|
||||
/* If we're in the prologue, defer to the heuristic unwinder. */
|
||||
if (info->in_prologue_cache)
|
||||
alpha_heuristic_frame_this_id (next_frame, &info->in_prologue_cache,
|
||||
this_id);
|
||||
else
|
||||
*this_id = frame_id_build (info->vfp, frame_func_unwind (next_frame));
|
||||
}
|
||||
|
||||
|
@ -295,16 +274,6 @@ alpha_mdebug_frame_prev_register (struct frame_info *next_frame,
|
|||
struct alpha_mdebug_unwind_cache *info
|
||||
= alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
|
||||
|
||||
/* If we're in the prologue, defer to the heuristic unwinder. */
|
||||
if (info->in_prologue_cache)
|
||||
{
|
||||
alpha_heuristic_frame_prev_register (next_frame,
|
||||
&info->in_prologue_cache,
|
||||
regnum, optimizedp, lvalp,
|
||||
addrp, realnump, bufferp);
|
||||
return;
|
||||
}
|
||||
|
||||
/* The PC of the previous frame is stored in the link register of
|
||||
the current frame. Frob regnum so that we pull the value from
|
||||
the correct place. */
|
||||
|
@ -359,6 +328,11 @@ alpha_mdebug_frame_p (CORE_ADDR pc)
|
|||
if (proc_desc == NULL)
|
||||
return NULL;
|
||||
|
||||
/* If we're in the prologue, the PDR for this frame is not yet valid.
|
||||
Say no here and we'll fall back on the heuristic unwinder. */
|
||||
if (alpha_mdebug_in_prologue (pc, proc_desc))
|
||||
return NULL;
|
||||
|
||||
return &alpha_mdebug_frame_unwind;
|
||||
}
|
||||
|
||||
|
@ -369,10 +343,6 @@ alpha_mdebug_frame_base_address (struct frame_info *next_frame,
|
|||
struct alpha_mdebug_unwind_cache *info
|
||||
= alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
|
||||
|
||||
if (info->in_prologue_cache)
|
||||
return alpha_heuristic_frame_base_address (next_frame,
|
||||
&info->in_prologue_cache);
|
||||
else
|
||||
return info->vfp;
|
||||
}
|
||||
|
||||
|
@ -382,15 +352,8 @@ alpha_mdebug_frame_locals_address (struct frame_info *next_frame,
|
|||
{
|
||||
struct alpha_mdebug_unwind_cache *info
|
||||
= alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
|
||||
CORE_ADDR vfp;
|
||||
|
||||
if (info->in_prologue_cache)
|
||||
vfp = alpha_heuristic_frame_base_address (next_frame,
|
||||
&info->in_prologue_cache);
|
||||
else
|
||||
vfp = info->vfp;
|
||||
|
||||
return vfp - PROC_LOCALOFF (info->proc_desc);
|
||||
return info->vfp - PROC_LOCALOFF (info->proc_desc);
|
||||
}
|
||||
|
||||
static CORE_ADDR
|
||||
|
@ -399,15 +362,8 @@ alpha_mdebug_frame_args_address (struct frame_info *next_frame,
|
|||
{
|
||||
struct alpha_mdebug_unwind_cache *info
|
||||
= alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
|
||||
CORE_ADDR vfp;
|
||||
|
||||
if (info->in_prologue_cache)
|
||||
vfp = alpha_heuristic_frame_base_address (next_frame,
|
||||
&info->in_prologue_cache);
|
||||
else
|
||||
vfp = info->vfp;
|
||||
|
||||
return vfp - ALPHA_NUM_ARG_REGS * 8;
|
||||
return info->vfp - ALPHA_NUM_ARG_REGS * 8;
|
||||
}
|
||||
|
||||
static const struct frame_base alpha_mdebug_frame_base = {
|
||||
|
|
|
@ -666,10 +666,18 @@ alpha_heuristic_proc_start (CORE_ADDR pc)
|
|||
CORE_ADDR last_non_nop = pc;
|
||||
CORE_ADDR fence = pc - heuristic_fence_post;
|
||||
CORE_ADDR orig_pc = pc;
|
||||
CORE_ADDR func;
|
||||
|
||||
if (pc == 0)
|
||||
return 0;
|
||||
|
||||
/* First see if we can find the start of the function from minimal
|
||||
symbol information. This can succeed with a binary that doesn't
|
||||
have debug info, but hasn't been stripped. */
|
||||
func = get_pc_function_start (pc);
|
||||
if (func)
|
||||
return func;
|
||||
|
||||
if (heuristic_fence_post == UINT_MAX
|
||||
|| fence < tdep->vm_min_address)
|
||||
fence = tdep->vm_min_address;
|
||||
|
@ -725,7 +733,7 @@ Otherwise, you told GDB there was a function where there isn't one, or\n\
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct alpha_heuristic_unwind_cache *
|
||||
static struct alpha_heuristic_unwind_cache *
|
||||
alpha_heuristic_frame_unwind_cache (struct frame_info *next_frame,
|
||||
void **this_prologue_cache,
|
||||
CORE_ADDR start_pc)
|
||||
|
@ -882,7 +890,7 @@ alpha_heuristic_frame_unwind_cache (struct frame_info *next_frame,
|
|||
/* Given a GDB frame, determine the address of the calling function's
|
||||
frame. This will be used to create a new GDB frame struct. */
|
||||
|
||||
void
|
||||
static void
|
||||
alpha_heuristic_frame_this_id (struct frame_info *next_frame,
|
||||
void **this_prologue_cache,
|
||||
struct frame_id *this_id)
|
||||
|
@ -890,12 +898,17 @@ alpha_heuristic_frame_this_id (struct frame_info *next_frame,
|
|||
struct alpha_heuristic_unwind_cache *info
|
||||
= alpha_heuristic_frame_unwind_cache (next_frame, this_prologue_cache, 0);
|
||||
|
||||
/* This is meant to halt the backtrace at "_start". Make sure we
|
||||
don't halt it at a generic dummy frame. */
|
||||
if (inside_entry_file (info->start_pc))
|
||||
return;
|
||||
|
||||
*this_id = frame_id_build (info->vfp, info->start_pc);
|
||||
}
|
||||
|
||||
/* Retrieve the value of REGNUM in FRAME. Don't give up! */
|
||||
|
||||
void
|
||||
static void
|
||||
alpha_heuristic_frame_prev_register (struct frame_info *next_frame,
|
||||
void **this_prologue_cache,
|
||||
int regnum, int *optimizedp,
|
||||
|
@ -954,7 +967,7 @@ alpha_heuristic_frame_p (CORE_ADDR pc)
|
|||
return &alpha_heuristic_frame_unwind;
|
||||
}
|
||||
|
||||
CORE_ADDR
|
||||
static CORE_ADDR
|
||||
alpha_heuristic_frame_base_address (struct frame_info *next_frame,
|
||||
void **this_prologue_cache)
|
||||
{
|
||||
|
|
|
@ -99,19 +99,7 @@ struct gdbarch_tdep
|
|||
|
||||
extern unsigned int alpha_read_insn (CORE_ADDR pc);
|
||||
extern void alpha_software_single_step (enum target_signal, int);
|
||||
|
||||
/* Let other files poke at the heuristic unwinder. */
|
||||
extern CORE_ADDR alpha_after_prologue (CORE_ADDR pc);
|
||||
extern struct alpha_heuristic_unwind_cache *
|
||||
alpha_heuristic_frame_unwind_cache (struct frame_info *, void **, CORE_ADDR);
|
||||
extern void alpha_heuristic_frame_this_id (struct frame_info *, void **,
|
||||
struct frame_id *);
|
||||
extern void alpha_heuristic_frame_prev_register (struct frame_info *,
|
||||
void **, int, int *,
|
||||
enum lval_type *,
|
||||
CORE_ADDR *, int *, void *);
|
||||
extern CORE_ADDR alpha_heuristic_frame_base_address (struct frame_info *,
|
||||
void **);
|
||||
|
||||
extern void alpha_mdebug_init_abi (struct gdbarch_info, struct gdbarch *);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue