summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2003-05-31 00:31:10 +0000
committerRichard Henderson <rth@redhat.com>2003-05-31 00:31:10 +0000
commit0532f7a84a79c6ad1d04187f616e347a90910489 (patch)
treee21e32776287685b5b8764ffc481eb616a4cbba2
parent3440c35b603e9bdacfada7f262ba7dda93649569 (diff)
downloadbinutils-gdb-kettenis_i386newframe-20030419-branch.tar.gz
* alpha-mdebug-tdep.c (alpha_mdebug_frame_p): Reject prologues.kettenis_i386newframe-20030419-branch
(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.
-rw-r--r--gdb/ChangeLog18
-rw-r--r--gdb/alpha-mdebug-tdep.c62
-rw-r--r--gdb/alpha-tdep.c21
-rw-r--r--gdb/alpha-tdep.h12
4 files changed, 44 insertions, 69 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 9df7396a1bd..e699aaba363 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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-29 Richard Henderson <rth@redhat.com>
* alpha-linux-tdep.c (alpha_linux_sigtramp_offset_1): New.
diff --git a/gdb/alpha-mdebug-tdep.c b/gdb/alpha-mdebug-tdep.c
index 2f84d6d4096..2f49e08260c 100644
--- a/gdb/alpha-mdebug-tdep.c
+++ b/gdb/alpha-mdebug-tdep.c
@@ -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,12 +259,7 @@ 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));
+ *this_id = frame_id_build (info->vfp, frame_func_unwind (next_frame));
}
/* Retrieve the value of REGNUM in FRAME. Don't give up! */
@@ -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,11 +343,7 @@ 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;
+ return info->vfp;
}
static CORE_ADDR
@@ -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 = {
diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c
index 2bd3b266cee..cd29c95e4f7 100644
--- a/gdb/alpha-tdep.c
+++ b/gdb/alpha-tdep.c
@@ -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)
{
diff --git a/gdb/alpha-tdep.h b/gdb/alpha-tdep.h
index 412ec37c5a9..5def15a8454 100644
--- a/gdb/alpha-tdep.h
+++ b/gdb/alpha-tdep.h
@@ -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 *);