mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
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".
This commit is contained in:
parent
73499ab841
commit
17e20bce79
@ -1,5 +1,23 @@
|
|||||||
2004-05-01 Andrew Cagney <cagney@redhat.com>
|
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
|
* infrun.c (check_sigtramp2): Delete check for
|
||||||
DEPRECATED_PC_IN_SIGTRAMP and INNER_THAN.
|
DEPRECATED_PC_IN_SIGTRAMP and INNER_THAN.
|
||||||
|
|
||||||
|
@ -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) \
|
m68klinux-nat.o: m68klinux-nat.c $(defs_h) $(frame_h) $(inferior_h) \
|
||||||
$(language_h) $(gdbcore_h) $(gdb_string_h) $(regcache_h) \
|
$(language_h) $(gdbcore_h) $(gdb_string_h) $(regcache_h) \
|
||||||
$(m68k_tdep_h) $(gdb_stat_h) $(floatformat_h) $(target_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) \
|
m68klinux-tdep.o: m68klinux-tdep.c $(defs_h) $(gdbcore_h) $(doublest_h) \
|
||||||
$(floatformat_h) $(frame_h) $(target_h) $(gdb_string_h) \
|
$(floatformat_h) $(frame_h) $(target_h) $(gdb_string_h) \
|
||||||
$(gdbtypes_h) $(osabi_h) $(regcache_h) $(objfiles_h) $(symtab_h) \
|
$(gdbtypes_h) $(osabi_h) $(regcache_h) $(objfiles_h) $(symtab_h) \
|
||||||
|
@ -761,85 +761,6 @@ m68k_frame_sniffer (struct frame_info *next_frame)
|
|||||||
return &m68k_frame_unwind;
|
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
|
static CORE_ADDR
|
||||||
m68k_frame_base_address (struct frame_info *next_frame, void **this_cache)
|
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
|
#else
|
||||||
tdep->jb_pc = -1;
|
tdep->jb_pc = -1;
|
||||||
#endif
|
#endif
|
||||||
tdep->get_sigtramp_info = NULL;
|
|
||||||
tdep->struct_return = pcc_struct_return;
|
tdep->struct_return = pcc_struct_return;
|
||||||
|
|
||||||
/* Frame unwinder. */
|
/* Frame unwinder. */
|
||||||
@ -1112,7 +1032,6 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|||||||
if (tdep->jb_pc >= 0)
|
if (tdep->jb_pc >= 0)
|
||||||
set_gdbarch_get_longjmp_target (gdbarch, m68k_get_longjmp_target);
|
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);
|
frame_unwind_append_sniffer (gdbarch, m68k_frame_sniffer);
|
||||||
|
|
||||||
return gdbarch;
|
return gdbarch;
|
||||||
|
@ -49,15 +49,6 @@ enum m68k_regnum
|
|||||||
/* Size of the largest register. */
|
/* Size of the largest register. */
|
||||||
#define M68K_MAX_REGISTER_SIZE 12
|
#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. */
|
/* Convention for returning structures. */
|
||||||
|
|
||||||
enum struct_return
|
enum struct_return
|
||||||
@ -76,9 +67,6 @@ struct gdbarch_tdep
|
|||||||
/* The size of each entry in the jump buffer. */
|
/* The size of each entry in the jump buffer. */
|
||||||
size_t jb_elt_size;
|
size_t jb_elt_size;
|
||||||
|
|
||||||
/* Get info about sigtramp. */
|
|
||||||
struct m68k_sigtramp_info (*get_sigtramp_info) (struct frame_info *);
|
|
||||||
|
|
||||||
/* Convention for returning structures. */
|
/* Convention for returning structures. */
|
||||||
enum struct_return struct_return;
|
enum struct_return struct_return;
|
||||||
};
|
};
|
||||||
|
@ -33,6 +33,8 @@
|
|||||||
#include "objfiles.h"
|
#include "objfiles.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
#include "m68k-tdep.h"
|
#include "m68k-tdep.h"
|
||||||
|
#include "trad-frame.h"
|
||||||
|
#include "frame-unwind.h"
|
||||||
|
|
||||||
/* Offsets (in target ints) into jmp_buf. */
|
/* 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. */
|
/* 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)
|
m68k_linux_get_sigtramp_info (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
CORE_ADDR sp;
|
CORE_ADDR sp;
|
||||||
char buf[4];
|
char buf[4];
|
||||||
struct m68k_sigtramp_info info;
|
struct m68k_linux_sigtramp_info info;
|
||||||
|
|
||||||
frame_unwind_register (next_frame, M68K_SP_REGNUM, buf);
|
frame_unwind_register (next_frame, M68K_SP_REGNUM, buf);
|
||||||
sp = extract_unsigned_integer (buf, 4);
|
sp = extract_unsigned_integer (buf, 4);
|
||||||
@ -180,6 +191,90 @@ m68k_linux_get_sigtramp_info (struct frame_info *next_frame)
|
|||||||
return info;
|
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
|
/* Extract from an array REGBUF containing the (raw) register state, a
|
||||||
function return value of TYPE, and copy that, in virtual format,
|
function return value of TYPE, and copy that, in virtual format,
|
||||||
into VALBUF. */
|
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_pc = M68K_LINUX_JB_PC;
|
||||||
tdep->jb_elt_size = M68K_LINUX_JB_ELEMENT_SIZE;
|
tdep->jb_elt_size = M68K_LINUX_JB_ELEMENT_SIZE;
|
||||||
tdep->get_sigtramp_info = m68k_linux_get_sigtramp_info;
|
|
||||||
tdep->struct_return = reg_struct_return;
|
tdep->struct_return = reg_struct_return;
|
||||||
|
|
||||||
set_gdbarch_extract_return_value (gdbarch, m68k_linux_extract_return_value);
|
set_gdbarch_extract_return_value (gdbarch, m68k_linux_extract_return_value);
|
||||||
set_gdbarch_store_return_value (gdbarch, m68k_linux_store_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_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. */
|
/* Shared library handling. */
|
||||||
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
|
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
|
||||||
|
Loading…
Reference in New Issue
Block a user