aboutsummaryrefslogtreecommitdiff
path: root/gdb/alpha-tdep.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2003-05-31 00:27:46 +0000
committerRichard Henderson <rth@redhat.com>2003-05-31 00:27:46 +0000
commitfbe586aede90731f60739674eab9243b992408e5 (patch)
tree1f9eb3eb26eaf9fb4cefc162e7416d6891d828d1 /gdb/alpha-tdep.c
parent86f1d0fbb593d56cf9d4e9ba34681c11696288d0 (diff)
downloadgdb-fbe586aede90731f60739674eab9243b992408e5.zip
gdb-fbe586aede90731f60739674eab9243b992408e5.tar.gz
gdb-fbe586aede90731f60739674eab9243b992408e5.tar.bz2
* 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.
Diffstat (limited to 'gdb/alpha-tdep.c')
-rw-r--r--gdb/alpha-tdep.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c
index 2bd3b26..cd29c95 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)
{