From eb2e12d711192f4fffab8ae75ed40701b42e0bc9 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Sun, 25 May 2003 18:50:55 +0000 Subject: [PATCH] * 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". --- gdb/ChangeLog | 39 +++++++++++++ gdb/Makefile.in | 5 +- gdb/config/m68k/tm-linux.h | 33 +++-------- gdb/config/m68k/tm-m68k.h | 4 +- gdb/configure.tgt | 1 + gdb/m68k-tdep.c | 138 +++++++++++++-------------------------------- gdb/m68k-tdep.h | 12 +++- gdb/m68klinux-tdep.c | 25 +++++++- 8 files changed, 123 insertions(+), 134 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f9ba05c..3d478b3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,42 @@ +2003-05-25 Andreas Schwab + + * 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 * sparc-tdep.c (sparc32_do_push_arguments): New function. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index c4f1d38..c52eadc 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -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) diff --git a/gdb/config/m68k/tm-linux.h b/gdb/config/m68k/tm-linux.h index 636df0b..fc191b1 100644 --- a/gdb/config/m68k/tm-linux.h +++ b/gdb/config/m68k/tm-linux.h @@ -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" - -#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); +/* 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. */ + +#define SVR4_SHARED_LIBS +#include "solib.h" /* Support for shared libraries. */ diff --git a/gdb/config/m68k/tm-m68k.h b/gdb/config/m68k/tm-m68k.h index cb72c98..f773428 100644 --- a/gdb/config/m68k/tm-m68k.h +++ b/gdb/config/m68k/tm-m68k.h @@ -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 *); diff --git a/gdb/configure.tgt b/gdb/configure.tgt index fe4cc5d..955b3a4 100644 --- a/gdb/configure.tgt +++ b/gdb/configure.tgt @@ -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 ;; diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c index 087d0bb..81973a1 100644 --- a/gdb/m68k-tdep.c +++ b/gdb/m68k-tdep.c @@ -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 diff --git a/gdb/m68k-tdep.h b/gdb/m68k-tdep.h index 8da568e..7c499a7 100644 --- a/gdb/m68k-tdep.h +++ b/gdb/m68k-tdep.h @@ -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 */ diff --git a/gdb/m68klinux-tdep.c b/gdb/m68klinux-tdep.c index 8b9193d..612f9fd 100644 --- a/gdb/m68klinux-tdep.c +++ b/gdb/m68klinux-tdep.c @@ -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 -- 2.7.4