* m68k-tdep.c (m68k_register_raw_size): Remove cast.

(m68k_register_virtual_size): Likewise.
	(altos_skip_prologue): Remove obsolete function.
	(isi_frame_num_args): Likewise.
	(news_frame_num_args): Likewise.
	(m68k_fix_call_dummy): Make static.
	(m68k_push_dummy_frame): Likewise.
	(m68k_pop_frame): Likewise.
	(m68k_skip_prologue): Likewise.
	(m68k_frame_init_saved_regs): Likewise.
	(m68k_saved_pc_after_call): Likewise.
	(m68k_get_longjmp_target): Make multi-arch.
	(m68k_gdbarch_init): Allocate and initialize gdbarch_tdep
	structure.  Register m68k_get_longjmp_target if enabled.
	* m68k-tdep.h (struct gdbarch_tdep): Define.
	* config/m68k/tm-m68k.h: Don't include "regcache.h".

	* Makefile.in (config.status): Also depend on configure.tgt
	and configure.host.
	(m68klinux-tdep.o): Update dependencies.
	* configure.tgt (m68*-*-linux*): Set gdb_multi_arch to 1.
	* m68klinux-tdep.c (M68K_LINUX_JB_ELEMENT_SIZE): Define.
	(M68K_LINUX_JB_PC): Define.
	(m68k_linux_pc_in_sigtramp): Renamed from m68k_linux_in_sigtramp
	and take additional parameter.
	(m68k_linux_sigtramp_saved_pc): Update.
	(m68k_linux_init_abi): Set jb_pc and jb_elt_size.  Register
	m68k_linux_pc_in_sigtramp, in_plt_section,
	find_solib_trampoline_target.
	* config/m68k/tm-linux.h: Don't include any tm headers.
	(START_INFERIOR_TRAPS_EXPECTED): Remove definition.
	(JB_ELEMENT_SIZE): Likewise.
	(JB_PC): Likewise.
	(GET_LONGJMP_TARGET): Likewise.
	(IN_SIGTRAMP): Likewise.
	(SVR4_SHARED_LIBS): Define this and include "solib.h".
This commit is contained in:
Andreas Schwab 2003-05-25 18:50:55 +00:00
parent eb2c22dc71
commit eb2e12d711
8 changed files with 122 additions and 133 deletions

View File

@ -1,3 +1,42 @@
2003-05-25 Andreas Schwab <schwab@suse.de>
* m68k-tdep.c (m68k_register_raw_size): Remove cast.
(m68k_register_virtual_size): Likewise.
(altos_skip_prologue): Remove obsolete function.
(isi_frame_num_args): Likewise.
(news_frame_num_args): Likewise.
(m68k_fix_call_dummy): Make static.
(m68k_push_dummy_frame): Likewise.
(m68k_pop_frame): Likewise.
(m68k_skip_prologue): Likewise.
(m68k_frame_init_saved_regs): Likewise.
(m68k_saved_pc_after_call): Likewise.
(m68k_get_longjmp_target): Make multi-arch.
(m68k_gdbarch_init): Allocate and initialize gdbarch_tdep
structure. Register m68k_get_longjmp_target if enabled.
* m68k-tdep.h (struct gdbarch_tdep): Define.
* config/m68k/tm-m68k.h: Don't include "regcache.h".
* Makefile.in (config.status): Also depend on configure.tgt
and configure.host.
(m68klinux-tdep.o): Update dependencies.
* configure.tgt (m68*-*-linux*): Set gdb_multi_arch to 1.
* m68klinux-tdep.c (M68K_LINUX_JB_ELEMENT_SIZE): Define.
(M68K_LINUX_JB_PC): Define.
(m68k_linux_pc_in_sigtramp): Renamed from m68k_linux_in_sigtramp
and take additional parameter.
(m68k_linux_sigtramp_saved_pc): Update.
(m68k_linux_init_abi): Set jb_pc and jb_elt_size. Register
m68k_linux_pc_in_sigtramp, in_plt_section,
find_solib_trampoline_target.
* config/m68k/tm-linux.h: Don't include any tm headers.
(START_INFERIOR_TRAPS_EXPECTED): Remove definition.
(JB_ELEMENT_SIZE): Likewise.
(JB_PC): Likewise.
(GET_LONGJMP_TARGET): Likewise.
(IN_SIGTRAMP): Likewise.
(SVR4_SHARED_LIBS): Define this and include "solib.h".
2003-05-25 Mark Kettenis <kettenis@gnu.org>
* sparc-tdep.c (sparc32_do_push_arguments): New function.

View File

@ -1157,7 +1157,7 @@ config.h: stamp-h ; @true
stamp-h: config.in config.status
CONFIG_HEADERS=config.h:config.in $(SHELL) config.status
config.status: configure
config.status: configure configure.tgt configure.host
$(SHELL) config.status --recheck
force:
@ -1923,7 +1923,8 @@ 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)
m68klinux-tdep.o: m68klinux-tdep.c $(defs_h) $(gdbcore_h) $(frame_h) \
$(target_h) $(gdb_string_h) $(gdbtypes_h) $(osabi_h) $(m68k_tdep_t)
$(target_h) $(gdb_string_h) $(gdbtypes_h) $(osabi_h) $(regcache_h) \
$(objfiles_h) $(symtab_h) $(m68k_tdep_t)
m68knbsd-nat.o: m68knbsd-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) \
$(regcache_h)
m68knbsd-tdep.o: m68knbsd-tdep.c $(defs_h) $(gdbtypes_h) $(regcache_h)

View File

@ -20,28 +20,11 @@
Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "config/tm-linux.h"
#include "m68k/tm-m68k.h"
/* We define SVR4_SHARED_LIBS unconditionally, on the assumption that
link.h is available on all linux platforms. For I386 and SH3/4,
we hard-code the information rather than use link.h anyway (for
the benefit of cross-debugging). We may move to doing that for
other architectures as well. */
#include "regcache.h"
/* Number of traps that happen between exec'ing the shell to run an
inferior, and when we finally get to the inferior code. This is 2
on most implementations. */
#define START_INFERIOR_TRAPS_EXPECTED 2
/* Offsets (in target ints) into jmp_buf. */
#define JB_ELEMENT_SIZE 4
#define JB_PC 7
/* Figure out where the longjmp will land. Slurp the args out of the stack.
We expect the first arg to be a pointer to the jmp_buf structure from which
we extract the pc (JB_PC) that we will land at. The pc is copied into ADDR.
This routine returns true on success */
#define GET_LONGJMP_TARGET(ADDR) m68k_get_longjmp_target(ADDR)
#define IN_SIGTRAMP(pc,name) m68k_linux_in_sigtramp (pc)
extern int m68k_linux_in_sigtramp (CORE_ADDR pc);
#define SVR4_SHARED_LIBS
#include "solib.h" /* Support for shared libraries. */

View File

@ -1,6 +1,6 @@
/* Parameters for execution on a 68000 series machine.
Copyright 1986, 1987, 1989, 1990, 1992, 1993, 1994, 1995, 1996, 1998,
1999, 2000 Free Software Foundation, Inc.
1999, 2000, 2003 Free Software Foundation, Inc.
This file is part of GDB.
@ -19,8 +19,6 @@
Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "regcache.h"
#define GDB_MULTI_ARCH GDB_MULTI_ARCH_PARTIAL
extern int m68k_get_longjmp_target (CORE_ADDR *);

View File

@ -130,6 +130,7 @@ m68*-*-aout*) gdb_target=monitor ;;
m68*-*-coff*) gdb_target=monitor ;;
m68*-*-elf*) gdb_target=monitor ;;
m68*-*-linux*) gdb_target=linux
gdb_multi_arch=1
build_gdbserver=yes
;;
m68*-*-lynxos*) gdb_target=m68klynx ;;

View File

@ -77,13 +77,13 @@
#endif
void m68k_frame_init_saved_regs (struct frame_info *frame_info);
static void m68k_frame_init_saved_regs (struct frame_info *frame_info);
/* gdbarch_breakpoint_from_pc is set to m68k_local_breakpoint_from_pc
so m68k_remote_breakpoint_from_pc is currently not used. */
const static unsigned char *
static const unsigned char *
m68k_remote_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
{
static unsigned char break_insn[] = {0x4e, (0x40 | REMOTE_BPT_VECTOR)};
@ -91,7 +91,7 @@ m68k_remote_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
return break_insn;
}
const static unsigned char *
static const unsigned char *
m68k_local_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
{
static unsigned char break_insn[] = {0x4e, (0x40 | BPT_VECTOR)};
@ -110,13 +110,11 @@ m68k_register_bytes_ok (long numbytes)
/* Number of bytes of storage in the actual machine representation
for register regnum. On the 68000, all regs are 4 bytes
except the floating point regs which are 12 bytes. */
/* Note that the unsigned cast here forces the result of the
subtraction to very high positive values if regnum < FP0_REGNUM */
static int
m68k_register_raw_size (int regnum)
{
return (((unsigned) (regnum) - FP0_REGNUM) < 8 ? 12 : 4);
return (regnum >= FP0_REGNUM && regnum < FP0_REGNUM + 8 ? 12 : 4);
}
/* Number of bytes of storage in the program's representation
@ -126,7 +124,7 @@ m68k_register_raw_size (int regnum)
static int
m68k_register_virtual_size (int regnum)
{
return (((unsigned) (regnum) - FP0_REGNUM) < 8 ? 12 : 4);
return (regnum >= FP0_REGNUM && regnum < FP0_REGNUM + 8 ? 12 : 4);
}
/* Return the GDB type object for the "standard" data type of data in
@ -296,28 +294,6 @@ m68k_frame_saved_pc (struct frame_info *frame)
}
/* The only reason this is here is the tm-altos.h reference below. It
was moved back here from tm-m68k.h. FIXME? */
extern CORE_ADDR
altos_skip_prologue (CORE_ADDR pc)
{
register int op = read_memory_unsigned_integer (pc, 2);
if (op == P_LINKW_FP)
pc += 4; /* Skip link #word */
else if (op == P_LINKL_FP)
pc += 6; /* Skip link #long */
/* Not sure why branches are here. */
/* From tm-altos.h */
else if (op == 0060000)
pc += 4; /* Skip bra #word */
else if (op == 00600377)
pc += 6; /* skip bra #long */
else if ((op & 0177400) == 0060000)
pc += 2; /* skip bra #char */
return pc;
}
int
delta68_in_sigtramp (CORE_ADDR pc, char *name)
{
@ -353,31 +329,6 @@ delta68_frame_saved_pc (struct frame_info *frame_info)
+ 4, 4);
}
/* Return number of args passed to a frame.
Can return -1, meaning no way to tell. */
int
isi_frame_num_args (struct frame_info *fi)
{
int val;
CORE_ADDR pc = DEPRECATED_FRAME_SAVED_PC (fi);
int insn = read_memory_unsigned_integer (pc, 2);
val = 0;
if (insn == 0047757 || insn == 0157374) /* lea W(sp),sp or addaw #W,sp */
val = read_memory_integer (pc + 2, 2);
else if ((insn & 0170777) == 0050217 /* addql #N, sp */
|| (insn & 0170777) == 0050117) /* addqw */
{
val = (insn >> 9) & 7;
if (val == 0)
val = 8;
}
else if (insn == 0157774) /* addal #WW, sp */
val = read_memory_integer (pc + 2, 4);
val >>= 2;
return val;
}
int
delta68_frame_num_args (struct frame_info *fi)
{
@ -400,33 +351,11 @@ delta68_frame_num_args (struct frame_info *fi)
return val;
}
int
news_frame_num_args (struct frame_info *fi)
{
int val;
CORE_ADDR pc = DEPRECATED_FRAME_SAVED_PC (fi);
int insn = read_memory_unsigned_integer (pc, 2);
val = 0;
if (insn == 0047757 || insn == 0157374) /* lea W(sp),sp or addaw #W,sp */
val = read_memory_integer (pc + 2, 2);
else if ((insn & 0170777) == 0050217 /* addql #N, sp */
|| (insn & 0170777) == 0050117) /* addqw */
{
val = (insn >> 9) & 7;
if (val == 0)
val = 8;
}
else if (insn == 0157774) /* addal #WW, sp */
val = read_memory_integer (pc + 2, 4);
val >>= 2;
return val;
}
/* Insert the specified number of args and function address
into a call sequence of the above form stored at DUMMYNAME.
We use the BFD routines to store a big-endian value of known size. */
void
static void
m68k_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
struct value **args, struct type *type, int gcc_p)
{
@ -438,7 +367,7 @@ m68k_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
/* Push an empty stack frame, to record the current PC, etc. */
void
static void
m68k_push_dummy_frame (void)
{
register CORE_ADDR sp = read_register (SP_REGNUM);
@ -468,7 +397,7 @@ m68k_push_dummy_frame (void)
/* Discard from the stack the innermost frame,
restoring all saved registers. */
void
static void
m68k_pop_frame (void)
{
register struct frame_info *frame = get_current_frame ();
@ -539,7 +468,7 @@ m68k_pop_frame (void)
*/
CORE_ADDR
static CORE_ADDR
m68k_skip_prologue (CORE_ADDR ip)
{
register CORE_ADDR limit;
@ -580,7 +509,7 @@ m68k_skip_prologue (CORE_ADDR ip)
ways in the stack frame. sp is even more special:
the address we return for it IS the sp for the next frame. */
void
static void
m68k_frame_init_saved_regs (struct frame_info *frame_info)
{
register int regnum;
@ -905,17 +834,19 @@ fill_fpregset (fpregset_t *fpregsetp, int regno)
we extract the pc (JB_PC) that we will land at. The pc is copied into PC.
This routine returns true on success. */
/* NOTE: cagney/2000-11-08: For this function to be fully multi-arched
the macro's JB_PC and JB_ELEMENT_SIZE would need to be moved into
the ``struct gdbarch_tdep'' object and then set on a target ISA/ABI
dependant basis. */
int
m68k_get_longjmp_target (CORE_ADDR *pc)
{
#if defined (JB_PC) && defined (JB_ELEMENT_SIZE)
char *buf;
CORE_ADDR sp, jb_addr;
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
if (tdep->jb_pc < 0)
{
internal_error (__FILE__, __LINE__,
"m68k_get_longjmp_target: not implemented");
return 0;
}
buf = alloca (TARGET_PTR_BIT / TARGET_CHAR_BIT);
sp = read_register (SP_REGNUM);
@ -926,18 +857,12 @@ m68k_get_longjmp_target (CORE_ADDR *pc)
jb_addr = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
TARGET_PTR_BIT / TARGET_CHAR_BIT))
return 0;
*pc = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
return 1;
#else
internal_error (__FILE__, __LINE__,
"m68k_get_longjmp_target: not implemented");
return 0;
#endif
}
/* Immediately after a function call, return the saved pc before the frame
@ -945,7 +870,7 @@ m68k_get_longjmp_target (CORE_ADDR *pc)
system call, and if so, we know that Sun pushes the call # on the stack
prior to doing the trap. */
CORE_ADDR
static CORE_ADDR
m68k_saved_pc_after_call (struct frame_info *frame)
{
#ifdef SYSCALL_TRAP
@ -979,11 +904,8 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
if (arches != NULL)
return (arches->gdbarch);
#if 0
tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
#endif
gdbarch = gdbarch_alloc (&info, 0);
tdep = xmalloc (sizeof (struct gdbarch_tdep));
gdbarch = gdbarch_alloc (&info, tdep);
/* NOTE: cagney/2002-12-06: This can be deleted when this arch is
ready to unwind the PC first (see frame.c:get_prev_frame()). */
@ -1053,9 +975,22 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Should be using push_dummy_call. */
set_gdbarch_deprecated_dummy_write_sp (gdbarch, generic_target_write_sp);
#if defined JB_PC && defined JB_ELEMENT_SIZE
tdep->jb_pc = JB_PC;
tdep->jb_elt_size = JB_ELEMENT_SIZE;
#else
tdep->jb_pc = -1;
#endif
/* Hook in ABI-specific overrides, if they have been registered. */
gdbarch_init_osabi (info, gdbarch);
/* Now we have tuned the configuration, set a few final things,
based on what the OS ABI has told us. */
if (tdep->jb_pc >= 0)
set_gdbarch_get_longjmp_target (gdbarch, m68k_get_longjmp_target);
return gdbarch;
}
@ -1063,7 +998,10 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
static void
m68k_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
if (tdep == NULL)
return;
}
void

View File

@ -1,5 +1,5 @@
/* Common target dependent code for the Motorola 68000 series.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001, 2003
Free Software Foundation, Inc.
This file is part of GDB.
@ -44,4 +44,14 @@ enum
M68K_FPI_REGNUM = 28
};
/* Target-dependent structure in gdbarch. */
struct gdbarch_tdep
{
/* Offset to PC value in the jump buffer. If this is negative,
longjmp support will be disabled. */
int jb_pc;
/* The size of each entry in the jump buffer. */
size_t jb_elt_size;
};
#endif /* M68K_TDEP_H */

View File

@ -27,8 +27,16 @@
#include "gdb_string.h"
#include "gdbtypes.h"
#include "osabi.h"
#include "regcache.h"
#include "objfiles.h"
#include "symtab.h"
#include "m68k-tdep.h"
/* Offsets (in target ints) into jmp_buf. */
#define M68K_LINUX_JB_ELEMENT_SIZE 4
#define M68K_LINUX_JB_PC 7
/* Check whether insn1 and insn2 are parts of a signal trampoline. */
#define IS_SIGTRAMP(insn1, insn2) \
@ -47,8 +55,8 @@
of m68k_linux_frame_saved_pc we also distinguish between non-RT and RT
signal trampolines. */
int
m68k_linux_in_sigtramp (CORE_ADDR pc)
static int
m68k_linux_pc_in_sigtramp (CORE_ADDR pc, char *name)
{
CORE_ADDR sp;
char buf[12];
@ -110,7 +118,7 @@ m68k_linux_sigtramp_saved_pc (struct frame_info *frame)
/* Don't cause a memory_error when accessing sigcontext in case the
stack layout has changed or the stack is corrupt. */
if (m68k_linux_in_sigtramp (get_frame_pc (frame)) == 2)
if (m68k_linux_pc_in_sigtramp (get_frame_pc (frame), 0) == 2)
target_read_memory (sigcontext_addr + UCONTEXT_PC_OFFSET, buf, ptrbytes);
else
target_read_memory (sigcontext_addr + SIGCONTEXT_PC_OFFSET, buf, ptrbytes);
@ -189,6 +197,11 @@ m68k_linux_extract_struct_value_address (char *regbuf)
static void
m68k_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
tdep->jb_pc = M68K_LINUX_JB_PC;
tdep->jb_elt_size = M68K_LINUX_JB_ELEMENT_SIZE;
set_gdbarch_deprecated_frame_saved_pc (gdbarch,
m68k_linux_frame_saved_pc);
set_gdbarch_deprecated_extract_return_value (gdbarch,
@ -197,6 +210,12 @@ m68k_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
m68k_linux_store_return_value);
set_gdbarch_deprecated_extract_struct_value_address (gdbarch,
m68k_linux_extract_struct_value_address);
set_gdbarch_pc_in_sigtramp (gdbarch, m68k_linux_pc_in_sigtramp);
/* Shared library handling. */
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
}
void