This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

More multi-arch and cleanups for m68k-linux


The only thing that prevents m68k-linux from advancing to multi-arch
level 2 is the PREPARE_TO_PROCEED definition in config/nm-linux.h.
How can this be multi-arched given that this is a native-only thing?

Andreas.

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".

--- gdb/Makefile.in.~1.382.~	2003-05-24 00:56:54.000000000 +0200
+++ gdb/Makefile.in	2003-05-25 15:17:35.000000000 +0200
@@ -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_
 	$(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)
--- gdb/config/m68k/tm-linux.h.~1.15.~	2003-05-21 01:24:31.000000000 +0200
+++ gdb/config/m68k/tm-linux.h	2003-05-25 13:58:25.000000000 +0200
@@ -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. */
--- gdb/config/m68k/tm-m68k.h.~1.21.~	2003-05-18 12:21:52.000000000 +0200
+++ gdb/config/m68k/tm-m68k.h	2003-05-25 13:02:46.000000000 +0200
@@ -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 *);
--- gdb/configure.tgt.~1.103.~	2003-05-05 22:29:23.000000000 +0200
+++ gdb/configure.tgt	2003-05-25 15:15:12.000000000 +0200
@@ -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 ;;
--- gdb/m68k-tdep.c.~1.61.~	2003-05-21 01:13:41.000000000 +0200
+++ gdb/m68k-tdep.c	2003-05-25 08:17:04.000000000 +0200
@@ -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_ADD
   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 *
 }
 
 
-/* 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_inf
 				       + 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_inf
   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_A
 
 /* 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, in
    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 i
   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 i
   /* 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 i
 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
--- gdb/m68k-tdep.h.~1.1.~	2002-11-23 17:11:15.000000000 +0100
+++ gdb/m68k-tdep.h	2003-05-25 07:36:43.000000000 +0200
@@ -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 */
--- gdb/m68klinux-tdep.c.~1.4.~	2003-05-21 01:38:54.000000000 +0200
+++ gdb/m68klinux-tdep.c	2003-05-25 13:41:48.000000000 +0200
@@ -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 fra
 
   /* 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 
 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
 					     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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]