diff options
Diffstat (limited to 'gdb/alpha-osf1-tdep.c')
-rw-r--r-- | gdb/alpha-osf1-tdep.c | 55 |
1 files changed, 39 insertions, 16 deletions
diff --git a/gdb/alpha-osf1-tdep.c b/gdb/alpha-osf1-tdep.c index 4eaa3c4..ca757de 100644 --- a/gdb/alpha-osf1-tdep.c +++ b/gdb/alpha-osf1-tdep.c @@ -24,22 +24,10 @@ #include "value.h" #include "osabi.h" #include "gdb_string.h" +#include "objfiles.h" #include "alpha-tdep.h" -/* Under OSF/1, the __sigtramp routine is frameless and has a frame - size of zero, but we are able to backtrace through it. */ -static CORE_ADDR -alpha_osf1_skip_sigtramp_frame (struct frame_info *frame, CORE_ADDR pc) -{ - char *name; - - find_pc_partial_function (pc, &name, (CORE_ADDR *) NULL, (CORE_ADDR *) NULL); - if (PC_IN_SIGTRAMP (pc, name)) - return frame->frame; - return 0; -} - static int alpha_osf1_pc_in_sigtramp (CORE_ADDR pc, char *func_name) { @@ -49,8 +37,36 @@ alpha_osf1_pc_in_sigtramp (CORE_ADDR pc, char *func_name) static CORE_ADDR alpha_osf1_sigcontext_addr (struct frame_info *frame) { - return (read_memory_integer (frame->next ? frame->next->frame - : frame->frame, 8)); + struct frame_info *next_frame = get_next_frame (frame); + + if (next_frame != NULL) + return (read_memory_integer (get_frame_base (next_frame), 8)); + else + return (read_memory_integer (get_frame_base (frame), 8)); +} + +/* This is the definition of CALL_DUMMY_ADDRESS. It's a heuristic that is used + to find a convenient place in the text segment to stick a breakpoint to + detect the completion of a target function call (ala call_function_by_hand). + */ + +static CORE_ADDR +alpha_call_dummy_address (void) +{ + CORE_ADDR entry; + struct minimal_symbol *sym; + + entry = entry_point_address (); + + if (entry != 0) + return entry; + + sym = lookup_minimal_symbol ("_Prelude", NULL, symfile_objfile); + + if (!sym || MSYMBOL_TYPE (sym) != mst_text) + return 0; + else + return SYMBOL_VALUE_ADDRESS (sym) + 4; } static void @@ -59,13 +75,20 @@ alpha_osf1_init_abi (struct gdbarch_info info, { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + /* Hook into the MDEBUG frame unwinder. */ + alpha_mdebug_init_abi (info, gdbarch); + set_gdbarch_pc_in_sigtramp (gdbarch, alpha_osf1_pc_in_sigtramp); /* The next/step support via procfs on OSF1 is broken when running on multi-processor machines. We need to use software single stepping instead. */ set_gdbarch_software_single_step (gdbarch, alpha_software_single_step); - tdep->skip_sigtramp_frame = alpha_osf1_skip_sigtramp_frame; + /* Alpha OSF/1 inhibits execution of code on the stack. But there is + no need for a dummy on the Alpha. PUSH_ARGUMENTS takes care of all + argument handling and bp_call_dummy takes care of stopping the dummy. */ + set_gdbarch_call_dummy_address (gdbarch, alpha_call_dummy_address); + tdep->sigcontext_addr = alpha_osf1_sigcontext_addr; tdep->jb_pc = 2; |