diff options
author | Richard Henderson <rth@redhat.com> | 2003-05-31 00:31:10 +0000 |
---|---|---|
committer | Richard Henderson <rth@redhat.com> | 2003-05-31 00:31:10 +0000 |
commit | 0532f7a84a79c6ad1d04187f616e347a90910489 (patch) | |
tree | e21e32776287685b5b8764ffc481eb616a4cbba2 | |
parent | 3440c35b603e9bdacfada7f262ba7dda93649569 (diff) | |
download | gdb-kettenis_i386newframe-20030419-branch.zip gdb-kettenis_i386newframe-20030419-branch.tar.gz gdb-kettenis_i386newframe-20030419-branch.tar.bz2 |
* 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/ChangeLog | 18 | ||||
-rw-r--r-- | gdb/alpha-mdebug-tdep.c | 62 | ||||
-rw-r--r-- | gdb/alpha-tdep.c | 21 | ||||
-rw-r--r-- | gdb/alpha-tdep.h | 12 |
4 files changed, 44 insertions, 69 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9df7396..e699aab 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 2f84d6d..2f49e08 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 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) { diff --git a/gdb/alpha-tdep.h b/gdb/alpha-tdep.h index 412ec37..5def15a 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 *); |