From 17e20bce79d64f0856cd38d3e00b56beb6fa7e8c Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Sat, 1 May 2004 15:10:15 +0000 Subject: [PATCH] 2004-05-01 Andrew Cagney * Makefile.in (m68klinux-nat.o): Update dependencies. * m68klinux-tdep.c: Include "trad-frame.h" and "frame-unwind.h". (m68k_linux_sigtramp_frame_cache) (m68k_linux_sigtramp_frame_this_id) (m68k_linux_sigtramp_frame_prev_register) (m68k_linux_sigtramp_frame_unwind) (m68k_linux_sigtramp_frame_sniffer) (struct m68k_linux_sigtramp_info, m68k_linux_init_abi): Code from m68k-tdep.h and m68k-tdep.c, add "linux" to function and variable names, use trad-frame.h. * m68k-tdep.h (struct gdbarch_tdep): Delete get_sigtramp_info. (struct m68k_sigtramp_info): Delete. * m68k-tdep.c (m68k_sigtramp_frame_cache) (m68k_sigtramp_frame_this_id, m68k_sigtramp_frame_prev_register) (m68k_sigtramp_frame_unwind, m68k_sigtramp_frame_sniffer) (m68k_gdbarch_init): Delete all the sigtramp code, moved to "m68klinux-tdep.c". --- gdb/ChangeLog | 18 +++++++++ gdb/Makefile.in | 2 +- gdb/m68k-tdep.c | 81 ---------------------------------------- gdb/m68k-tdep.h | 12 ------ gdb/m68klinux-tdep.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 117 insertions(+), 98 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0dde772..f0ee016 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,23 @@ 2004-05-01 Andrew Cagney + * Makefile.in (m68klinux-nat.o): Update dependencies. + * m68klinux-tdep.c: Include "trad-frame.h" and "frame-unwind.h". + (m68k_linux_sigtramp_frame_cache) + (m68k_linux_sigtramp_frame_this_id) + (m68k_linux_sigtramp_frame_prev_register) + (m68k_linux_sigtramp_frame_unwind) + (m68k_linux_sigtramp_frame_sniffer) + (struct m68k_linux_sigtramp_info, m68k_linux_init_abi): Code from + m68k-tdep.h and m68k-tdep.c, add "linux" to function and variable + names, use trad-frame.h. + * m68k-tdep.h (struct gdbarch_tdep): Delete get_sigtramp_info. + (struct m68k_sigtramp_info): Delete. + * m68k-tdep.c (m68k_sigtramp_frame_cache) + (m68k_sigtramp_frame_this_id, m68k_sigtramp_frame_prev_register) + (m68k_sigtramp_frame_unwind, m68k_sigtramp_frame_sniffer) + (m68k_gdbarch_init): Delete all the sigtramp code, moved to + "m68klinux-tdep.c". + * infrun.c (check_sigtramp2): Delete check for DEPRECATED_PC_IN_SIGTRAMP and INNER_THAN. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 8a8ed9e..fd1e23e 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -2014,7 +2014,7 @@ m68hc11-tdep.o: m68hc11-tdep.c $(defs_h) $(frame_h) $(frame_unwind_h) \ m68klinux-nat.o: m68klinux-nat.c $(defs_h) $(frame_h) $(inferior_h) \ $(language_h) $(gdbcore_h) $(gdb_string_h) $(regcache_h) \ $(m68k_tdep_h) $(gdb_stat_h) $(floatformat_h) $(target_h) \ - $(gregset_h) + $(gregset_h) $(trad_frame_h) $(frame_unwind_h) m68klinux-tdep.o: m68klinux-tdep.c $(defs_h) $(gdbcore_h) $(doublest_h) \ $(floatformat_h) $(frame_h) $(target_h) $(gdb_string_h) \ $(gdbtypes_h) $(osabi_h) $(regcache_h) $(objfiles_h) $(symtab_h) \ diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c index bd5f9f1..66f21fe 100644 --- a/gdb/m68k-tdep.c +++ b/gdb/m68k-tdep.c @@ -761,85 +761,6 @@ m68k_frame_sniffer (struct frame_info *next_frame) return &m68k_frame_unwind; } -/* Signal trampolines. */ - -static struct m68k_frame_cache * -m68k_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache) -{ - struct m68k_frame_cache *cache; - struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); - struct m68k_sigtramp_info info; - char buf[4]; - int i; - - if (*this_cache) - return *this_cache; - - cache = m68k_alloc_frame_cache (); - - frame_unwind_register (next_frame, M68K_SP_REGNUM, buf); - cache->base = extract_unsigned_integer (buf, 4) - 4; - - info = tdep->get_sigtramp_info (next_frame); - - for (i = 0; i < M68K_NUM_REGS; i++) - if (info.sc_reg_offset[i] != -1) - cache->saved_regs[i] = info.sigcontext_addr + info.sc_reg_offset[i]; - - *this_cache = cache; - return cache; -} - -static void -m68k_sigtramp_frame_this_id (struct frame_info *next_frame, void **this_cache, - struct frame_id *this_id) -{ - struct m68k_frame_cache *cache = - m68k_sigtramp_frame_cache (next_frame, this_cache); - - /* See the end of m68k_push_dummy_call. */ - *this_id = frame_id_build (cache->base + 8, frame_pc_unwind (next_frame)); -} - -static void -m68k_sigtramp_frame_prev_register (struct frame_info *next_frame, - void **this_cache, - int regnum, int *optimizedp, - enum lval_type *lvalp, CORE_ADDR *addrp, - int *realnump, void *valuep) -{ - /* Make sure we've initialized the cache. */ - m68k_sigtramp_frame_cache (next_frame, this_cache); - - m68k_frame_prev_register (next_frame, this_cache, regnum, - optimizedp, lvalp, addrp, realnump, valuep); -} - -static const struct frame_unwind m68k_sigtramp_frame_unwind = -{ - SIGTRAMP_FRAME, - m68k_sigtramp_frame_this_id, - m68k_sigtramp_frame_prev_register -}; - -static const struct frame_unwind * -m68k_sigtramp_frame_sniffer (struct frame_info *next_frame) -{ - CORE_ADDR pc = frame_pc_unwind (next_frame); - char *name; - - /* We shouldn't even bother to try if the OSABI didn't register - a get_sigtramp_info handler. */ - if (!gdbarch_tdep (current_gdbarch)->get_sigtramp_info) - return NULL; - - find_pc_partial_function (pc, &name, NULL, NULL); - if (DEPRECATED_PC_IN_SIGTRAMP (pc, name)) - return &m68k_sigtramp_frame_unwind; - - return NULL; -} - static CORE_ADDR m68k_frame_base_address (struct frame_info *next_frame, void **this_cache) { @@ -1091,7 +1012,6 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) #else tdep->jb_pc = -1; #endif - tdep->get_sigtramp_info = NULL; tdep->struct_return = pcc_struct_return; /* Frame unwinder. */ @@ -1112,7 +1032,6 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) if (tdep->jb_pc >= 0) set_gdbarch_get_longjmp_target (gdbarch, m68k_get_longjmp_target); - frame_unwind_append_sniffer (gdbarch, m68k_sigtramp_frame_sniffer); frame_unwind_append_sniffer (gdbarch, m68k_frame_sniffer); return gdbarch; diff --git a/gdb/m68k-tdep.h b/gdb/m68k-tdep.h index bf00cf0..be28d88 100644 --- a/gdb/m68k-tdep.h +++ b/gdb/m68k-tdep.h @@ -49,15 +49,6 @@ enum m68k_regnum /* Size of the largest register. */ #define M68K_MAX_REGISTER_SIZE 12 -struct m68k_sigtramp_info -{ - /* Address of sigcontext. */ - CORE_ADDR sigcontext_addr; - - /* Offset of registers in `struct sigcontext'. */ - int *sc_reg_offset; -}; - /* Convention for returning structures. */ enum struct_return @@ -76,9 +67,6 @@ struct gdbarch_tdep /* The size of each entry in the jump buffer. */ size_t jb_elt_size; - /* Get info about sigtramp. */ - struct m68k_sigtramp_info (*get_sigtramp_info) (struct frame_info *); - /* Convention for returning structures. */ enum struct_return struct_return; }; diff --git a/gdb/m68klinux-tdep.c b/gdb/m68klinux-tdep.c index 1091951..c174daa 100644 --- a/gdb/m68klinux-tdep.c +++ b/gdb/m68klinux-tdep.c @@ -33,6 +33,8 @@ #include "objfiles.h" #include "symtab.h" #include "m68k-tdep.h" +#include "trad-frame.h" +#include "frame-unwind.h" /* Offsets (in target ints) into jmp_buf. */ @@ -160,12 +162,21 @@ static int m68k_linux_ucontext_reg_offset[M68K_NUM_REGS] = /* Get info about saved registers in sigtramp. */ -static struct m68k_sigtramp_info +struct m68k_linux_sigtramp_info +{ + /* Address of sigcontext. */ + CORE_ADDR sigcontext_addr; + + /* Offset of registers in `struct sigcontext'. */ + int *sc_reg_offset; +}; + +static struct m68k_linux_sigtramp_info m68k_linux_get_sigtramp_info (struct frame_info *next_frame) { CORE_ADDR sp; char buf[4]; - struct m68k_sigtramp_info info; + struct m68k_linux_sigtramp_info info; frame_unwind_register (next_frame, M68K_SP_REGNUM, buf); sp = extract_unsigned_integer (buf, 4); @@ -180,6 +191,90 @@ m68k_linux_get_sigtramp_info (struct frame_info *next_frame) return info; } +/* Signal trampolines. */ + +static struct trad_frame_cache * +m68k_linux_sigtramp_frame_cache (struct frame_info *next_frame, + void **this_cache) +{ + struct frame_id this_id; + struct trad_frame_cache *cache; + struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); + struct m68k_linux_sigtramp_info info; + char buf[4]; + int i; + + if (*this_cache) + return *this_cache; + + cache = trad_frame_cache_zalloc (next_frame); + + /* FIXME: cagney/2004-05-01: This is is long standing broken code. + The frame ID's code address should be the start-address of the + signal trampoline and not the current PC within that + trampoline. */ + frame_unwind_register (next_frame, M68K_SP_REGNUM, buf); + /* See the end of m68k_push_dummy_call. */ + this_id = frame_id_build (extract_unsigned_integer (buf, 4) - 4 + 8, + frame_pc_unwind (next_frame)); + trad_frame_set_id (cache, this_id); + + info = m68k_linux_get_sigtramp_info (next_frame); + + for (i = 0; i < M68K_NUM_REGS; i++) + if (info.sc_reg_offset[i] != -1) + trad_frame_set_reg_addr (cache, i, + info.sigcontext_addr + info.sc_reg_offset[i]); + + *this_cache = cache; + return cache; +} + +static void +m68k_linux_sigtramp_frame_this_id (struct frame_info *next_frame, + void **this_cache, + struct frame_id *this_id) +{ + struct trad_frame_cache *cache = + m68k_linux_sigtramp_frame_cache (next_frame, this_cache); + trad_frame_get_id (cache, this_id); +} + +static void +m68k_linux_sigtramp_frame_prev_register (struct frame_info *next_frame, + void **this_cache, + int regnum, int *optimizedp, + enum lval_type *lvalp, + CORE_ADDR *addrp, + int *realnump, void *valuep) +{ + /* Make sure we've initialized the cache. */ + struct trad_frame_cache *cache = + m68k_linux_sigtramp_frame_cache (next_frame, this_cache); + trad_frame_get_register (cache, next_frame, regnum, optimizedp, lvalp, + addrp, realnump, valuep); +} + +static const struct frame_unwind m68k_linux_sigtramp_frame_unwind = +{ + SIGTRAMP_FRAME, + m68k_linux_sigtramp_frame_this_id, + m68k_linux_sigtramp_frame_prev_register +}; + +static const struct frame_unwind * +m68k_linux_sigtramp_frame_sniffer (struct frame_info *next_frame) +{ + CORE_ADDR pc = frame_pc_unwind (next_frame); + char *name; + + find_pc_partial_function (pc, &name, NULL, NULL); + if (m68k_linux_pc_in_sigtramp (pc, name)) + return &m68k_linux_sigtramp_frame_unwind; + + return NULL; +} + /* Extract from an array REGBUF containing the (raw) register state, a function return value of TYPE, and copy that, in virtual format, into VALBUF. */ @@ -289,14 +384,13 @@ m68k_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->jb_pc = M68K_LINUX_JB_PC; tdep->jb_elt_size = M68K_LINUX_JB_ELEMENT_SIZE; - tdep->get_sigtramp_info = m68k_linux_get_sigtramp_info; tdep->struct_return = reg_struct_return; set_gdbarch_extract_return_value (gdbarch, m68k_linux_extract_return_value); set_gdbarch_store_return_value (gdbarch, m68k_linux_store_return_value); set_gdbarch_deprecated_extract_struct_value_address (gdbarch, m68k_linux_extract_struct_value_address); - set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, m68k_linux_pc_in_sigtramp); + frame_unwind_append_sniffer (gdbarch, m68k_linux_sigtramp_frame_sniffer); /* Shared library handling. */ set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section); -- 2.7.4