aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog18
-rw-r--r--gdb/Makefile.in2
-rw-r--r--gdb/m68k-tdep.c81
-rw-r--r--gdb/m68k-tdep.h12
-rw-r--r--gdb/m68klinux-tdep.c102
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 <cagney@redhat.com>
+ * 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);