Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* Get rid of linux-thread-db.c:target_beneath
@ 2009-02-06  3:05 Pedro Alves
  2009-02-06  4:57 ` teawater
  2009-02-06 22:23 ` Pedro Alves
  0 siblings, 2 replies; 5+ messages in thread
From: Pedro Alves @ 2009-02-06  3:05 UTC (permalink / raw)
  To: gdb-patches


This started out as a different fix for the extended-remote crash I
just posted about.  I was feeling tempted to hack something with the
target_beaneath in linux-thread-db.c, so I thought I'd best get rid of
it once and for all, to avoid such temptations.

This patch gets rid of the target_beneath pointer in
linux-thread-db.c, but making it use find_target_beneath instead.  To
be able to do this, we need to make a few more target methods take a
`this' target_ops pointer --- namely, to_wait, to_pid_to_str and
to_get_thread_local_address.

target_get_thread_local_address and target_get_thread_local_address_p
are only used in target.c in a simple caller, so I can inline them.

thread_db_can_async_p, thread_db_is_async_p and thread_db_async are
unnecessary, we can just remove them.

To the best of my grep abilities, I fixed all targets.

I've tested this on x86-64-linux.  I'll build this on a couple more
hosts tomorrow, and will check it in of there are no objections.

2009-02-06  Pedro Alves  <pedro@codesourcery.com>

	* linux-nat.c (linux_nat_wait): Adjust.
	(linux_nat_pid_to_str): Adjust.  Remove call to thread_db_init.
	* linux-nat.h (thread_db_init): Delete declaration.
	* linux-thread-db.c (target_beneath): Delete.
	(thread_db_init): Delete.
	(thread_db_detach): Use find_target_beneath.
	(thread_db_wait): Adjust interface.  Use find_target_beneath.
	(thread_db_mourn_inferior): Use find_target_beneath.
	(thread_db_can_async_p, thread_db_is_async_p, thread_db_async)
	(thread_db_async_mask): Delete.
	(thread_db_pid_to_str): Adjust interface.  Use
	find_target_beneath.
	(thread_db_get_thread_local_address): Adjust interface.  Use
	find_target_beneath.
	(init_thread_db_ops): Delete references to delete functions.
	* target.c (update_current_target): Don't inherit or default
	to_wait.  Don't inherit to_pid_to_str and
	to_get_thread_local_address.
	(target_translate_tls_address): Look for a pushed target that
	implements to_get_thread_local_address, and use it instead of
	checking for target_get_thread_local_address_p.
	(target_wait, target_pid_to_str): Reimplement as functions.
	(dummy_pid_to_str): New.
	(init_dummy_target): Register it.
	(debug_to_wait): Delete.
	* target.h (struct target_ops): Make to_wait, to_pid_to_str and
	to_get_thread_local_address accept a pointer to struct target_ops.
	(target_wait): Delete macro, and declare as function.
	(target_pid_to_str): Likewise.
	(target_get_thread_local_address)
	(target_get_thread_local_address_p): Delete.
	(noprocess): Add NORETURN and ATTR_NORETURN tags.
	* inf-ptrace.c (inf_ptrace_wait): Adjust.
	(inf_ptrace_pid_to_str): New.
	(inf_ptrace_target): Use inf_ptrace_pid_to_str.
	* aix-thread.c (aix_thread_wait, aix_thread_pid_to_str): Adjust.
	* bsd-kvm.c (bsd_kvm_pid_to_str): Adjust.
	* bsd-uthread.c (bsd_uthread_wait, bsd_uthread_pid_to_str):
	Adjust.
	* corelow.c (core_pid_to_str): Adjust.
	* darwin-nat.c (darwin_wait, darwin_pid_to_str): Adjust.
	* dec-thread.c (dec_thread_wait, dec_thread_pid_to_str): Adjust.
	* gnu-nat.c (gnu_wait, gnu_pid_to_str): Adjust.
	* go32-nat.c (go32_wait, go32_pid_to_str): Adjust.
	* hpux-thread.c (hpux_thread_wait): Adjust.
	* inf-ttrace.c (inf_ttrace_wait, inf_ttrace_pid_to_str): Adjust.
	* monitor.c (monitor_wait, monitor_pid_to_str): Adjust.
	* nto-procfs.c (procfs_wait, procfs_pid_to_str): Adjust.
	* procfs.c (procfs_pid_to_str): Adjust.
	* remote-m32r-sdi.c (m32r_wait, m32r_pid_to_str): Adjust.
	* remote-mips.c (mips_wait): Adjust.
	* remote-sim.c (gdbsim_wait, gdbsim_pid_to_str): Adjust.
	* remote.c (remote_wait, remote_pid_to_str)
	(remote_get_thread_local_address): Adjust.
	* rs6000-nat.c (rs6000_wait): Adjust.
	* sol-thread.c (procfs_pid_to_str): Adjust declaration.
	(sol_thread_wait, solaris_pid_to_str): Adjust.
	* spu-linux-nat.c (spu_child_wait): Adjust.
	* windows-nat.c (windows_wait, windows_pid_to_str): Adjust.

---
 gdb/aix-thread.c      |    9 ++--
 gdb/bsd-kvm.c         |    2 -
 gdb/bsd-uthread.c     |    8 ++--
 gdb/corelow.c         |    2 -
 gdb/darwin-nat.c      |    9 +---
 gdb/dec-thread.c      |    9 ++--
 gdb/gnu-nat.c         |    5 +-
 gdb/go32-nat.c        |    7 +--
 gdb/hpux-thread.c     |    6 ++-
 gdb/inf-ptrace.c      |   11 ++++-
 gdb/inf-ttrace.c      |    5 +-
 gdb/linux-nat.c       |    9 +---
 gdb/linux-nat.h       |    3 -
 gdb/linux-thread-db.c |   66 ++++++++++-----------------------
 gdb/monitor.c         |    5 +-
 gdb/nto-procfs.c      |    7 +--
 gdb/procfs.c          |    3 -
 gdb/remote-m32r-sdi.c |    5 +-
 gdb/remote-mips.c     |    6 +--
 gdb/remote-sim.c      |    7 +--
 gdb/remote.c          |   11 ++---
 gdb/rs6000-nat.c      |    3 +
 gdb/sol-thread.c      |    9 ++--
 gdb/spu-linux-nat.c   |    3 +
 gdb/target.c          |   98 +++++++++++++++++++++++++++++++++-----------------
 gdb/target.h          |   23 ++++-------
 gdb/windows-nat.c     |    5 +-
 27 files changed, 171 insertions(+), 165 deletions(-)

Index: src/gdb/linux-nat.c
===================================================================
--- src.orig/gdb/linux-nat.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/linux-nat.c	2009-02-06 02:15:30.000000000 +0000
@@ -2776,7 +2776,8 @@ local_event_queue_to_pipe (void)
 }
 
 static ptid_t
-linux_nat_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+linux_nat_wait (struct target_ops *ops,
+		ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   struct lwp_info *lp = NULL;
   int options = 0;
@@ -3266,7 +3267,7 @@ linux_nat_thread_alive (ptid_t ptid)
 }
 
 static char *
-linux_nat_pid_to_str (ptid_t ptid)
+linux_nat_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
 
@@ -4659,10 +4660,6 @@ linux_nat_add_target (struct target_ops 
      also want to be used for single-threaded processes.  */
 
   add_target (t);
-
-  /* TODO: Eliminate this and have libthread_db use
-     find_target_beneath.  */
-  thread_db_init (t);
 }
 
 /* Register a method to call whenever a new thread is attached.  */
Index: src/gdb/linux-nat.h
===================================================================
--- src.orig/gdb/linux-nat.h	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/linux-nat.h	2009-02-06 02:15:30.000000000 +0000
@@ -94,9 +94,6 @@ extern struct lwp_info *lwp_list;
 /* Attempt to initialize libthread_db.  */
 void check_for_thread_db (void);
 
-/* Tell the thread_db layer what native target operations to use.  */
-void thread_db_init (struct target_ops *);
-
 int thread_db_attach_lwp (ptid_t ptid);
 
 /* Find process PID's pending signal set from /proc/pid/status.  */
Index: src/gdb/linux-thread-db.c
===================================================================
--- src.orig/gdb/linux-thread-db.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/linux-thread-db.c	2009-02-06 02:15:30.000000000 +0000
@@ -80,9 +80,6 @@
 /* This module's target vector.  */
 static struct target_ops thread_db_ops;
 
-/* The target vector that we call for things this module can't handle.  */
-static struct target_ops *target_beneath;
-
 /* Non-zero if we're using this module's target vector.  */
 static int using_thread_db;
 
@@ -379,12 +376,6 @@ thread_db_attach_lwp (ptid_t ptid)
   return 1;
 }
 
-void
-thread_db_init (struct target_ops *target)
-{
-  target_beneath = target;
-}
-
 static void *
 verbose_dlsym (void *handle, const char *name)
 {
@@ -782,6 +773,8 @@ detach_thread (ptid_t ptid)
 static void
 thread_db_detach (struct target_ops *ops, char *args, int from_tty)
 {
+  struct target_ops *target_beneath = find_target_beneath (ops);
+
   disable_thread_event_reporting ();
 
   /* Forget about the child's process ID.  We shouldn't need it
@@ -885,9 +878,12 @@ check_event (ptid_t ptid)
 }
 
 static ptid_t
-thread_db_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+thread_db_wait (struct target_ops *ops,
+		ptid_t ptid, struct target_waitstatus *ourstatus)
 {
-  ptid = target_beneath->to_wait (ptid, ourstatus);
+  struct target_ops *beneath = find_target_beneath (ops);
+
+  ptid = beneath->to_wait (beneath, ptid, ourstatus);
 
   if (ourstatus->kind == TARGET_WAITKIND_IGNORE)
     return ptid;
@@ -934,6 +930,8 @@ thread_db_wait (ptid_t ptid, struct targ
 static void
 thread_db_mourn_inferior (struct target_ops *ops)
 {
+  struct target_ops *target_beneath = find_target_beneath (ops);
+
   /* Forget about the child's process ID.  We shouldn't need it
      anymore.  */
   proc_handle.pid = 0;
@@ -950,31 +948,6 @@ thread_db_mourn_inferior (struct target_
 }
 
 static int
-thread_db_can_async_p (void)
-{
-  return target_beneath->to_can_async_p ();
-}
-
-static int
-thread_db_is_async_p (void)
-{
-  return target_beneath->to_is_async_p ();
-}
-
-static void
-thread_db_async (void (*callback) (enum inferior_event_type event_type,
-				   void *context), void *context)
-{
-  return target_beneath->to_async (callback, context);
-}
-
-static int
-thread_db_async_mask (int mask)
-{
-  return target_beneath->to_async_mask (mask);
-}
-
-static int
 find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
 {
   td_thrinfo_t ti;
@@ -1045,9 +1018,10 @@ thread_db_find_new_threads (void)
 }
 
 static char *
-thread_db_pid_to_str (ptid_t ptid)
+thread_db_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   struct thread_info *thread_info = find_thread_pid (ptid);
+  struct target_ops *beneath;
 
   if (thread_info != NULL && thread_info->private != NULL)
     {
@@ -1062,8 +1036,9 @@ thread_db_pid_to_str (ptid_t ptid)
       return buf;
     }
 
-  if (target_beneath->to_pid_to_str (ptid))
-    return target_beneath->to_pid_to_str (ptid);
+  beneath = find_target_beneath (ops);
+  if (beneath->to_pid_to_str (beneath, ptid))
+    return beneath->to_pid_to_str (beneath, ptid);
 
   return normal_pid_to_str (ptid);
 }
@@ -1087,11 +1062,13 @@ thread_db_extra_thread_info (struct thre
    is stored at OFFSET within the thread local storage for thread PTID.  */
 
 static CORE_ADDR
-thread_db_get_thread_local_address (ptid_t ptid,
+thread_db_get_thread_local_address (struct target_ops *ops,
+				    ptid_t ptid,
 				    CORE_ADDR lm,
 				    CORE_ADDR offset)
 {
   struct thread_info *thread_info;
+  struct target_ops *beneath;
 
   /* If we have not discovered any threads yet, check now.  */
   if (!have_threads ())
@@ -1141,8 +1118,9 @@ thread_db_get_thread_local_address (ptid
 	      : (CORE_ADDR) (uintptr_t) address);
     }
 
-  if (target_beneath->to_get_thread_local_address)
-    return target_beneath->to_get_thread_local_address (ptid, lm, offset);
+  beneath = find_target_beneath (ops);
+  if (beneath->to_get_thread_local_address)
+    return beneath->to_get_thread_local_address (beneath, ptid, lm, offset);
   else
     throw_error (TLS_GENERIC_ERROR,
 	         _("TLS not supported on this target"));
@@ -1193,10 +1171,6 @@ init_thread_db_ops (void)
   thread_db_ops.to_get_thread_local_address
     = thread_db_get_thread_local_address;
   thread_db_ops.to_extra_thread_info = thread_db_extra_thread_info;
-  thread_db_ops.to_can_async_p = thread_db_can_async_p;
-  thread_db_ops.to_is_async_p = thread_db_is_async_p;
-  thread_db_ops.to_async = thread_db_async;
-  thread_db_ops.to_async_mask = thread_db_async_mask;
   thread_db_ops.to_get_ada_task_ptid = thread_db_get_ada_task_ptid;
   thread_db_ops.to_magic = OPS_MAGIC;
 }
Index: src/gdb/target.c
===================================================================
--- src.orig/gdb/target.c	2009-02-06 02:14:57.000000000 +0000
+++ src/gdb/target.c	2009-02-06 02:58:32.000000000 +0000
@@ -99,8 +99,6 @@ static void debug_to_open (char *, int);
 
 static void debug_to_resume (ptid_t, int, enum target_signal);
 
-static ptid_t debug_to_wait (ptid_t, struct target_waitstatus *);
-
 static void debug_to_fetch_registers (struct regcache *, int);
 
 static void debug_to_store_registers (struct regcache *, int);
@@ -415,7 +413,7 @@ update_current_target (void)
       /* Do not inherit to_detach.  */
       /* Do not inherit to_disconnect.  */
       INHERIT (to_resume, t);
-      INHERIT (to_wait, t);
+      /* Do not inherit to_wait.  */
       INHERIT (to_fetch_registers, t);
       INHERIT (to_store_registers, t);
       INHERIT (to_prepare_to_store, t);
@@ -454,12 +452,12 @@ update_current_target (void)
       INHERIT (to_insert_exec_catchpoint, t);
       INHERIT (to_remove_exec_catchpoint, t);
       INHERIT (to_has_exited, t);
-      /* Do no inherit to_mourn_inferiour.  */
+      /* Do not inherit to_mourn_inferiour.  */
       INHERIT (to_can_run, t);
       INHERIT (to_notice_signals, t);
       INHERIT (to_thread_alive, t);
       INHERIT (to_find_new_threads, t);
-      INHERIT (to_pid_to_str, t);
+      /* Do not inherit to_pid_to_str.  */
       INHERIT (to_extra_thread_info, t);
       INHERIT (to_stop, t);
       /* Do not inherit to_xfer_partial.  */
@@ -481,7 +479,7 @@ update_current_target (void)
       INHERIT (to_async_mask, t);
       INHERIT (to_find_memory_regions, t);
       INHERIT (to_make_corefile_notes, t);
-      INHERIT (to_get_thread_local_address, t);
+      /* Do not inherit to_get_thread_local_address.  */
       INHERIT (to_can_execute_reverse, t);
       /* Do not inherit to_read_description.  */
       INHERIT (to_get_ada_task_ptid, t);
@@ -514,9 +512,6 @@ update_current_target (void)
   de_fault (to_resume,
 	    (void (*) (ptid_t, int, enum target_signal))
 	    noprocess);
-  de_fault (to_wait,
-	    (ptid_t (*) (ptid_t, struct target_waitstatus *))
-	    noprocess);
   de_fault (to_fetch_registers,
 	    (void (*) (struct regcache *, int))
 	    target_ignore);
@@ -853,8 +848,17 @@ CORE_ADDR
 target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset)
 {
   volatile CORE_ADDR addr = 0;
+  struct target_ops *target;
+
+  for (target = current_target.beneath;
+       target != NULL;
+       target = target->beneath)
+    {
+      if (target->to_get_thread_local_address != NULL)
+	break;
+    }
 
-  if (target_get_thread_local_address_p ()
+  if (target != NULL
       && gdbarch_fetch_tls_load_module_address_p (target_gdbarch))
     {
       ptid_t ptid = inferior_ptid;
@@ -872,7 +876,7 @@ target_translate_tls_address (struct obj
 	    throw_error (TLS_LOAD_MODULE_NOT_FOUND_ERROR,
 			 _("TLS load module not found"));
 
-	  addr = target_get_thread_local_address (ptid, lm_addr, offset);
+	  addr = target->to_get_thread_local_address (target, ptid, lm_addr, offset);
 	}
       /* If an error occurred, print TLS related messages here.  Otherwise,
          throw the error to some higher catcher.  */
@@ -1841,6 +1845,50 @@ target_disconnect (char *args, int from_
   tcomplain ();
 }
 
+ptid_t
+target_wait (ptid_t ptid, struct target_waitstatus *status)
+{
+  struct target_ops *t;
+
+  for (t = current_target.beneath; t != NULL; t = t->beneath)
+    {
+      if (t->to_wait != NULL)
+	{
+	  ptid_t retval = (*t->to_wait) (t, ptid, status);
+
+	  if (targetdebug)
+	    {
+	      char *status_string;
+
+	      status_string = target_waitstatus_to_string (status);
+	      fprintf_unfiltered (gdb_stdlog,
+				  "target_wait (%d, status) = %d, %s\n",
+				  PIDGET (ptid), PIDGET (retval),
+				  status_string);
+	      xfree (status_string);
+	    }
+
+	  return retval;
+	}
+    }
+
+  noprocess ();
+}
+
+char *
+target_pid_to_str (ptid_t ptid)
+{
+  struct target_ops *t;
+
+  for (t = current_target.beneath; t != NULL; t = t->beneath)
+    {
+      if (t->to_pid_to_str != NULL)
+	return (*t->to_pid_to_str) (t, ptid);
+    }
+
+  return normal_pid_to_str (ptid);
+}
+
 void
 target_resume (ptid_t ptid, int step, enum target_signal signal)
 {
@@ -2475,6 +2523,12 @@ normal_pid_to_str (ptid_t ptid)
   return buf;
 }
 
+char *
+dummy_pid_to_str (struct target_ops *ops, ptid_t ptid)
+{
+  return normal_pid_to_str (ptid);
+}
+
 /* Error-catcher for target_find_memory_regions */
 static int dummy_find_memory_regions (int (*ignore1) (), void *ignore2)
 {
@@ -2505,7 +2559,7 @@ init_dummy_target (void)
   dummy_target.to_can_async_p = find_default_can_async_p;
   dummy_target.to_is_async_p = find_default_is_async_p;
   dummy_target.to_supports_non_stop = find_default_supports_non_stop;
-  dummy_target.to_pid_to_str = normal_pid_to_str;
+  dummy_target.to_pid_to_str = dummy_pid_to_str;
   dummy_target.to_stratum = dummy_stratum;
   dummy_target.to_find_memory_regions = dummy_find_memory_regions;
   dummy_target.to_make_corefile_notes = dummy_make_corefile_notes;
@@ -2613,25 +2667,6 @@ target_waitstatus_to_string (const struc
     }
 }
 
-static ptid_t
-debug_to_wait (ptid_t ptid, struct target_waitstatus *status)
-{
-  ptid_t retval;
-  char *status_string;
-
-  retval = debug_target.to_wait (ptid, status);
-
-  fprintf_unfiltered (gdb_stdlog,
-		      "target_wait (%d, status) = %d,   ", PIDGET (ptid),
-		      PIDGET (retval));
-
-  status_string = target_waitstatus_to_string (status);
-  fprintf_unfiltered (gdb_stdlog, "%s\n", status_string);
-  xfree (status_string);
-
-  return retval;
-}
-
 static void
 debug_print_register (const char * func,
 		      struct regcache *regcache, int regno)
@@ -3148,7 +3183,6 @@ setup_target_debug (void)
   current_target.to_open = debug_to_open;
   current_target.to_post_attach = debug_to_post_attach;
   current_target.to_resume = debug_to_resume;
-  current_target.to_wait = debug_to_wait;
   current_target.to_fetch_registers = debug_to_fetch_registers;
   current_target.to_store_registers = debug_to_store_registers;
   current_target.to_prepare_to_store = debug_to_prepare_to_store;
Index: src/gdb/target.h
===================================================================
--- src.orig/gdb/target.h	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/target.h	2009-02-06 02:15:30.000000000 +0000
@@ -330,7 +330,8 @@ struct target_ops
     void (*to_detach) (struct target_ops *ops, char *, int);
     void (*to_disconnect) (struct target_ops *, char *, int);
     void (*to_resume) (ptid_t, int, enum target_signal);
-    ptid_t (*to_wait) (ptid_t, struct target_waitstatus *);
+    ptid_t (*to_wait) (struct target_ops *ops,
+		      ptid_t, struct target_waitstatus *);
     void (*to_fetch_registers) (struct regcache *, int);
     void (*to_store_registers) (struct regcache *, int);
     void (*to_prepare_to_store) (struct regcache *);
@@ -402,7 +403,7 @@ struct target_ops
     void (*to_notice_signals) (ptid_t ptid);
     int (*to_thread_alive) (ptid_t ptid);
     void (*to_find_new_threads) (void);
-    char *(*to_pid_to_str) (ptid_t);
+    char *(*to_pid_to_str) (struct target_ops *ops, ptid_t);
     char *(*to_extra_thread_info) (struct thread_info *);
     void (*to_stop) (ptid_t);
     void (*to_rcmd) (char *command, struct ui_file *output);
@@ -438,7 +439,8 @@ struct target_ops
        or executable file given by OBJFILE.  If that block of
        thread-local storage hasn't been allocated yet, this function
        may return an error.  */
-    CORE_ADDR (*to_get_thread_local_address) (ptid_t ptid,
+    CORE_ADDR (*to_get_thread_local_address) (struct target_ops *ops,
+					      ptid_t ptid,
 					      CORE_ADDR load_module_addr,
 					      CORE_ADDR offset);
 
@@ -625,8 +627,7 @@ extern void target_resume (ptid_t ptid, 
    to the prompt with a debugging target but without the frame cache,
    stop_pc, etc., set up.  */
 
-#define	target_wait(ptid, status)		\
-     (*current_target.to_wait) (ptid, status)
+extern ptid_t target_wait (ptid_t ptid, struct target_waitstatus *status);
 
 /* Fetch at least register REGNO, or all regs if regno == -1.  No result.  */
 
@@ -1013,8 +1014,7 @@ int target_supports_non_stop (void);
    `process xyz', but on some systems it may contain
    `process xyz thread abc'.  */
 
-#undef target_pid_to_str
-#define target_pid_to_str(PID) current_target.to_pid_to_str (PID)
+extern char *target_pid_to_str (ptid_t ptid);
 
 extern char *normal_pid_to_str (ptid_t ptid);
 
@@ -1057,13 +1057,6 @@ extern char *normal_pid_to_str (ptid_t p
 #define target_make_corefile_notes(BFD, SIZE_P) \
      (current_target.to_make_corefile_notes) (BFD, SIZE_P)
 
-/* Thread-local values.  */
-#define target_get_thread_local_address \
-    (current_target.to_get_thread_local_address)
-#define target_get_thread_local_address_p() \
-    (target_get_thread_local_address != NULL)
-
-
 /* Hardware watchpoint interfaces.  */
 
 /* Returns non-zero if we were stopped by a hardware watchpoint (memory read or
@@ -1252,7 +1245,7 @@ extern int default_memory_insert_breakpo
 
 extern void initialize_targets (void);
 
-extern void noprocess (void);
+extern NORETURN void noprocess (void) ATTR_NORETURN;
 
 extern void target_require_runnable (void);
 
Index: src/gdb/inf-ptrace.c
===================================================================
--- src.orig/gdb/inf-ptrace.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/inf-ptrace.c	2009-02-06 02:15:30.000000000 +0000
@@ -385,7 +385,8 @@ inf_ptrace_resume (ptid_t ptid, int step
    the status in *OURSTATUS.  */
 
 static ptid_t
-inf_ptrace_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+inf_ptrace_wait (struct target_ops *ops,
+		 ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   pid_t pid;
   int status, save_errno;
@@ -615,6 +616,12 @@ inf_ptrace_files_info (struct target_ops
 		   target_pid_to_str (inferior_ptid));
 }
 
+static char *
+inf_ptrace_pid_to_str (struct target_ops *ops, ptid_t ptid)
+{
+  return normal_pid_to_str (ptid);
+}
+
 /* Create a prototype ptrace target.  The client can override it with
    local methods.  */
 
@@ -637,7 +644,7 @@ inf_ptrace_target (void)
 #endif
   t->to_mourn_inferior = inf_ptrace_mourn_inferior;
   t->to_thread_alive = inf_ptrace_thread_alive;
-  t->to_pid_to_str = normal_pid_to_str;
+  t->to_pid_to_str = inf_ptrace_pid_to_str;
   t->to_stop = inf_ptrace_stop;
   t->to_xfer_partial = inf_ptrace_xfer_partial;
 
Index: src/gdb/aix-thread.c
===================================================================
--- src.orig/gdb/aix-thread.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/aix-thread.c	2009-02-06 02:15:30.000000000 +0000
@@ -997,14 +997,15 @@ aix_thread_resume (ptid_t ptid, int step
    thread.  */
 
 static ptid_t
-aix_thread_wait (ptid_t ptid, struct target_waitstatus *status)
+aix_thread_wait (struct target_ops *ops,
+		 ptid_t ptid, struct target_waitstatus *status)
 {
   struct cleanup *cleanup = save_inferior_ptid ();
 
   pid_to_prc (&ptid);
 
   inferior_ptid = pid_to_ptid (PIDGET (inferior_ptid));
-  ptid = base_target.to_wait (ptid, status);
+  ptid = base_target.to_wait (&base_target, ptid, status);
   do_cleanups (cleanup);
 
   if (PIDGET (ptid) == -1)
@@ -1691,12 +1692,12 @@ aix_thread_thread_alive (ptid_t ptid)
    "info threads" output.  */
 
 static char *
-aix_thread_pid_to_str (ptid_t ptid)
+aix_thread_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char *ret = NULL;
 
   if (!PD_TID (ptid))
-    return base_target.to_pid_to_str (ptid);
+    return base_target.to_pid_to_str (&base_target, ptid);
 
   /* Free previous return value; a new one will be allocated by
      xstrprintf().  */
Index: src/gdb/bsd-kvm.c
===================================================================
--- src.orig/gdb/bsd-kvm.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/bsd-kvm.c	2009-02-06 02:15:30.000000000 +0000
@@ -316,7 +316,7 @@ bsd_kvm_thread_alive (ptid_t ptid)
 }
 
 static char *
-bsd_kvm_pid_to_str (ptid_t ptid)
+bsd_kvm_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
   xsnprintf (buf, sizeof buf, "<kvm>");
Index: src/gdb/bsd-uthread.c
===================================================================
--- src.orig/gdb/bsd-uthread.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/bsd-uthread.c	2009-02-06 02:15:30.000000000 +0000
@@ -340,12 +340,14 @@ bsd_uthread_xfer_partial (struct target_
 }
 
 static ptid_t
-bsd_uthread_wait (ptid_t ptid, struct target_waitstatus *status)
+bsd_uthread_wait (struct target_ops *ops,
+		  ptid_t ptid, struct target_waitstatus *status)
 {
   CORE_ADDR addr;
+  struct target_ops *beneath = find_target_beneath (bsd_uthread_ops_hack);
 
   /* Pass the request to the layer beneath.  */
-  ptid = find_target_beneath (bsd_uthread_ops_hack)->to_wait (ptid, status);
+  ptid = beneath->to_wait (beneath, ptid, status);
 
   /* If the process is no longer alive, there's no point in figuring
      out the thread ID.  It will fail anyway.  */
@@ -487,7 +489,7 @@ bsd_uthread_extra_thread_info (struct th
 }
 
 static char *
-bsd_uthread_pid_to_str (ptid_t ptid)
+bsd_uthread_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   if (ptid_get_tid (ptid) != 0)
     {
Index: src/gdb/corelow.c
===================================================================
--- src.orig/gdb/corelow.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/corelow.c	2009-02-06 02:15:30.000000000 +0000
@@ -680,7 +680,7 @@ core_read_description (struct target_ops
 }
 
 static char *
-core_pid_to_str (ptid_t ptid)
+core_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
 
Index: src/gdb/darwin-nat.c
===================================================================
--- src.orig/gdb/darwin-nat.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/darwin-nat.c	2009-02-06 02:15:30.000000000 +0000
@@ -89,8 +89,6 @@ static void darwin_stop (ptid_t);
 static void darwin_resume (ptid_t ptid, int step,
 			   enum target_signal signal);
 
-static ptid_t darwin_wait (ptid_t ptid, struct target_waitstatus *status);
-
 static void darwin_mourn_inferior (struct target_ops *ops);
 
 static int darwin_lookup_task (char *args, task_t * ptask, int *ppid);
@@ -106,8 +104,6 @@ static void darwin_create_inferior (stru
 
 static void darwin_files_info (struct target_ops *ops);
 
-static char *darwin_pid_to_str (ptid_t tpid);
-
 static int darwin_thread_alive (ptid_t tpid);
 
 /* Current inferior.  */
@@ -483,7 +479,8 @@ catch_exception_raise (mach_port_t port,
 }
 
 static ptid_t
-darwin_wait (ptid_t ptid, struct target_waitstatus *status)
+darwin_wait (struct target_ops *ops,
+	     ptid_t ptid, struct target_waitstatus *status)
 {
   kern_return_t kret;
   mach_msg_header_t *hdr = &msgin.hdr;
@@ -1049,7 +1046,7 @@ darwin_files_info (struct target_ops *op
 }
 
 static char *
-darwin_pid_to_str (ptid_t ptid)
+darwin_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[128];
 
Index: src/gdb/dec-thread.c
===================================================================
--- src.orig/gdb/dec-thread.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/dec-thread.c	2009-02-06 02:15:30.000000000 +0000
@@ -453,13 +453,14 @@ get_active_ptid (void)
 /* The "to_wait" method of the dec_thread_ops.  */
 
 static ptid_t
-dec_thread_wait (ptid_t ptid, struct target_waitstatus *status)
+dec_thread_wait (struct target_ops *ops,
+		 ptid_t ptid, struct target_waitstatus *status)
 {
   ptid_t active_ptid;
 
   debug ("dec_thread_wait");
 
-  ptid = base_target.to_wait (ptid, status);
+  ptid = base_target.to_wait (&base_target, ptid, status);
 
   /* The ptid returned by the base_target is the ptid of the process.
      We need to find which thread is currently active and return its
@@ -622,12 +623,12 @@ dec_thread_thread_alive (ptid_t ptid)
 /* The "to_pid_to_str" method of the dec_thread_ops.  */
 
 static char *
-dec_thread_pid_to_str (ptid_t ptid)
+dec_thread_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char *ret = NULL;
 
   if (ptid_get_tid (ptid) == 0)
-    return base_target.to_pid_to_str (ptid);
+    return base_target.to_pid_to_str (&base_target, ptid);
 
   /* Free previous return value; a new one will be allocated by
      xstrprintf().  */
Index: src/gdb/gnu-nat.c
===================================================================
--- src.orig/gdb/gnu-nat.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/gnu-nat.c	2009-02-06 02:15:30.000000000 +0000
@@ -1433,7 +1433,8 @@ struct inf *waiting_inf;
 
 /* Wait for something to happen in the inferior, returning what in STATUS. */
 static ptid_t
-gnu_wait (ptid_t ptid, struct target_waitstatus *status)
+gnu_wait (struct target_ops *ops,
+	  ptid_t ptid, struct target_waitstatus *status)
 {
   struct msg
     {
@@ -2594,7 +2595,7 @@ proc_string (struct proc *proc)
 }
 
 static char *
-gnu_pid_to_str (ptid_t ptid)
+gnu_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   struct inf *inf = gnu_current_inf;
   int tid = ptid_get_tid (ptid);
Index: src/gdb/go32-nat.c
===================================================================
--- src.orig/gdb/go32-nat.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/go32-nat.c	2009-02-06 02:15:30.000000000 +0000
@@ -171,8 +171,6 @@ static void go32_attach (char *args, int
 static void go32_detach (char *args, int from_tty);
 static void go32_resume (ptid_t ptid, int step,
                          enum target_signal siggnal);
-static ptid_t go32_wait (ptid_t ptid,
-                               struct target_waitstatus *status);
 static void go32_fetch_registers (struct regcache *, int regno);
 static void store_register (const struct regcache *, int regno);
 static void go32_store_registers (struct regcache *, int regno);
@@ -347,7 +345,8 @@ go32_resume (ptid_t ptid, int step, enum
 static char child_cwd[FILENAME_MAX];
 
 static ptid_t
-go32_wait (ptid_t ptid, struct target_waitstatus *status)
+go32_wait (struct target_ops *ops,
+	   ptid_t ptid, struct target_waitstatus *status)
 {
   int i;
   unsigned char saved_opcode;
@@ -866,7 +865,7 @@ go32_thread_alive (ptid_t ptid)
 }
 
 static char *
-go32_pid_to_str (ptid_t ptid)
+go32_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
   xsnprintf (buf, sizeof buf, "Thread <main>");
Index: src/gdb/hpux-thread.c
===================================================================
--- src.orig/gdb/hpux-thread.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/hpux-thread.c	2009-02-06 02:15:30.000000000 +0000
@@ -191,7 +191,8 @@ hpux_thread_resume (ptid_t ptid, int ste
    to a LWP id, and vice versa on the way out.  */
 
 static ptid_t
-hpux_thread_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+hpux_thread_wait (struct target_ops *ops,
+		  ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   ptid_t rtnval;
   struct cleanup *old_chain;
@@ -203,7 +204,8 @@ hpux_thread_wait (ptid_t ptid, struct ta
   if (!ptid_equal (ptid, minus_one_ptid))
     ptid = main_ptid;
 
-  rtnval = deprecated_child_ops.to_wait (ptid, ourstatus);
+  rtnval = deprecated_child_ops.to_wait (&deprecated_child_ops,
+					 ptid, ourstatus);
 
   rtnval = find_active_thread ();
 
Index: src/gdb/inf-ttrace.c
===================================================================
--- src.orig/gdb/inf-ttrace.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/inf-ttrace.c	2009-02-06 02:15:30.000000000 +0000
@@ -915,7 +915,8 @@ inf_ttrace_resume (ptid_t ptid, int step
 }
 
 static ptid_t
-inf_ttrace_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+inf_ttrace_wait (struct target_ops *ops,
+		 ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   pid_t pid = ptid_get_pid (ptid);
   lwpid_t lwpid = ptid_get_lwp (ptid);
@@ -1252,7 +1253,7 @@ inf_ttrace_extra_thread_info (struct thr
 }
 
 static char *
-inf_ttrace_pid_to_str (ptid_t ptid)
+inf_ttrace_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   pid_t pid = ptid_get_pid (ptid);
   lwpid_t lwpid = ptid_get_lwp (ptid);
Index: src/gdb/monitor.c
===================================================================
--- src.orig/gdb/monitor.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/monitor.c	2009-02-06 02:15:30.000000000 +0000
@@ -1063,7 +1063,8 @@ monitor_wait_filter (char *buf,
    status just as `wait' would.  */
 
 static ptid_t
-monitor_wait (ptid_t ptid, struct target_waitstatus *status)
+monitor_wait (struct target_ops *ops,
+	      ptid_t ptid, struct target_waitstatus *status)
 {
   int old_timeout = timeout;
   char buf[TARGET_BUF_SIZE];
@@ -2244,7 +2245,7 @@ monitor_thread_alive (ptid_t ptid)
    buffer.  */
 
 static char *
-monitor_pid_to_str (ptid_t ptid)
+monitor_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
 
Index: src/gdb/nto-procfs.c
===================================================================
--- src.orig/gdb/nto-procfs.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/nto-procfs.c	2009-02-06 02:15:30.000000000 +0000
@@ -59,8 +59,6 @@ static void procfs_open (char *, int);
 
 static int procfs_can_run (void);
 
-static ptid_t procfs_wait (ptid_t, struct target_waitstatus *);
-
 static int procfs_xfer_memory (CORE_ADDR, gdb_byte *, int, int,
 			       struct mem_attrib *attrib,
 			       struct target_ops *);
@@ -626,7 +624,8 @@ nto_interrupt (int signo)
 }
 
 static ptid_t
-procfs_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+procfs_wait (struct target_ops *ops,
+	     ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   sigset_t set;
   siginfo_t info;
@@ -1265,7 +1264,7 @@ procfs_thread_info (pid_t pid, short tid
 }
 
 char *
-procfs_pid_to_str (ptid_t ptid)
+procfs_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[1024];
   int pid, tid, n;
Index: src/gdb/procfs.c
===================================================================
--- src.orig/gdb/procfs.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/procfs.c	2009-02-06 02:15:30.000000000 +0000
@@ -139,7 +139,6 @@ static LONGEST procfs_xfer_partial (stru
 static int procfs_thread_alive (ptid_t);
 
 void procfs_find_new_threads (void);
-char *procfs_pid_to_str (ptid_t);
 
 static int proc_find_memory_regions (int (*) (CORE_ADDR,
 					      unsigned long,
@@ -5270,7 +5269,7 @@ procfs_thread_alive (ptid_t ptid)
 /* Convert PTID to a string.  Returns the string in a static buffer.  */
 
 char *
-procfs_pid_to_str (ptid_t ptid)
+procfs_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[80];
 
Index: src/gdb/remote-m32r-sdi.c
===================================================================
--- src.orig/gdb/remote-m32r-sdi.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/remote-m32r-sdi.c	2009-02-06 02:15:30.000000000 +0000
@@ -693,7 +693,8 @@ gdb_cntrl_c (int signo)
 }
 
 static ptid_t
-m32r_wait (ptid_t ptid, struct target_waitstatus *status)
+m32r_wait (struct target_ops *ops,
+	   ptid_t ptid, struct target_waitstatus *status)
 {
   static RETSIGTYPE (*prev_sigint) ();
   unsigned long bp_addr, pc_addr;
@@ -1507,7 +1508,7 @@ m32r_thread_alive (ptid_t ptid)
    buffer.  */
 
 static char *
-m32r_pid_to_str (ptid_t ptid)
+m32r_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
 
Index: src/gdb/remote-mips.c
===================================================================
--- src.orig/gdb/remote-mips.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/remote-mips.c	2009-02-06 02:15:30.000000000 +0000
@@ -89,9 +89,6 @@ static void mips_detach (struct target_o
 static void mips_resume (ptid_t ptid, int step,
                          enum target_signal siggnal);
 
-static ptid_t mips_wait (ptid_t ptid,
-                               struct target_waitstatus *status);
-
 static int mips_map_regno (struct gdbarch *, int);
 
 static void mips_fetch_registers (struct regcache *regcache, int regno);
@@ -1703,7 +1700,8 @@ mips_signal_from_protocol (int sig)
 /* Wait until the remote stops, and return a wait status.  */
 
 static ptid_t
-mips_wait (ptid_t ptid, struct target_waitstatus *status)
+mips_wait (struct target_ops *ops,
+	   ptid_t ptid, struct target_waitstatus *status)
 {
   int rstatus;
   int err;
Index: src/gdb/remote-sim.c
===================================================================
--- src.orig/gdb/remote-sim.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/remote-sim.c	2009-02-06 02:15:30.000000000 +0000
@@ -88,8 +88,6 @@ static void gdbsim_detach (struct target
 
 static void gdbsim_resume (ptid_t ptid, int step, enum target_signal siggnal);
 
-static ptid_t gdbsim_wait (ptid_t ptid, struct target_waitstatus *status);
-
 static void gdbsim_prepare_to_store (struct regcache *regcache);
 
 static void gdbsim_files_info (struct target_ops *target);
@@ -680,7 +678,8 @@ gdbsim_cntrl_c (int signo)
 }
 
 static ptid_t
-gdbsim_wait (ptid_t ptid, struct target_waitstatus *status)
+gdbsim_wait (struct target_ops *ops,
+	     ptid_t ptid, struct target_waitstatus *status)
 {
   static RETSIGTYPE (*prev_sigint) ();
   int sigrc = 0;
@@ -874,7 +873,7 @@ gdbsim_thread_alive (ptid_t ptid)
    buffer.  */
 
 static char *
-gdbsim_pid_to_str (ptid_t ptid)
+gdbsim_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
 
Index: src/gdb/remote.c
===================================================================
--- src.orig/gdb/remote.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/remote.c	2009-02-06 02:15:30.000000000 +0000
@@ -117,9 +117,6 @@ static void remote_send (char **buf, lon
 
 static int readchar (int timeout);
 
-static ptid_t remote_wait (ptid_t ptid,
-			   struct target_waitstatus *status);
-
 static void remote_kill (void);
 
 static int tohex (int nib);
@@ -4733,7 +4730,8 @@ remote_wait_as (ptid_t ptid, struct targ
    STATUS just as `wait' would.  */
 
 static ptid_t
-remote_wait (ptid_t ptid, struct target_waitstatus *status)
+remote_wait (struct target_ops *ops,
+	     ptid_t ptid, struct target_waitstatus *status)
 {
   ptid_t event_ptid;
 
@@ -7769,7 +7767,7 @@ Fetch and print the remote list of threa
    buffer.  */
 
 static char *
-remote_pid_to_str (ptid_t ptid)
+remote_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
   struct remote_state *rs = get_remote_state ();
@@ -7800,7 +7798,8 @@ remote_pid_to_str (ptid_t ptid)
    stored at OFFSET within the thread local storage for thread PTID.  */
 
 static CORE_ADDR
-remote_get_thread_local_address (ptid_t ptid, CORE_ADDR lm, CORE_ADDR offset)
+remote_get_thread_local_address (struct target_ops *ops,
+				 ptid_t ptid, CORE_ADDR lm, CORE_ADDR offset)
 {
   if (remote_protocol_packets[PACKET_qGetTLSAddr].support != PACKET_DISABLE)
     {
Index: src/gdb/rs6000-nat.c
===================================================================
--- src.orig/gdb/rs6000-nat.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/rs6000-nat.c	2009-02-06 02:15:30.000000000 +0000
@@ -517,7 +517,8 @@ rs6000_xfer_partial (struct target_ops *
    the status in *OURSTATUS.  */
 
 static ptid_t
-rs6000_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+rs6000_wait (struct target_ops *ops,
+	     ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   pid_t pid;
   int status, save_errno;
Index: src/gdb/sol-thread.c
===================================================================
--- src.orig/gdb/sol-thread.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/sol-thread.c	2009-02-06 02:15:30.000000000 +0000
@@ -80,7 +80,7 @@ struct target_ops sol_core_ops;
 extern int procfs_suppress_run;
 extern struct target_ops procfs_ops;	/* target vector for procfs.c */
 extern struct target_ops core_ops;	/* target vector for corelow.c */
-extern char *procfs_pid_to_str (ptid_t ptid);
+extern char *procfs_pid_to_str (struct target_ops *ops, ptid_t ptid);
 
 /* Prototypes for supply_gregset etc. */
 #include "gregset.h"
@@ -424,7 +424,8 @@ sol_thread_resume (ptid_t ptid, int step
    thread ID to an LWP ID, and vice versa on the way out.  */
 
 static ptid_t
-sol_thread_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+sol_thread_wait (struct target_ops *ops,
+		 ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   ptid_t rtnval;
   ptid_t save_ptid;
@@ -449,7 +450,7 @@ sol_thread_wait (ptid_t ptid, struct tar
 		 GET_THREAD (save_ptid));
     }
 
-  rtnval = procfs_ops.to_wait (ptid, ourstatus);
+  rtnval = procfs_ops.to_wait (&procfs_ops, ptid, ourstatus);
 
   if (ourstatus->kind != TARGET_WAITKIND_EXITED)
     {
@@ -1323,7 +1324,7 @@ ps_lgetLDT (gdb_ps_prochandle_t ph, lwpi
 /* Convert PTID to printable form.  */
 
 char *
-solaris_pid_to_str (ptid_t ptid)
+solaris_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[100];
 
Index: src/gdb/spu-linux-nat.c
===================================================================
--- src.orig/gdb/spu-linux-nat.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/spu-linux-nat.c	2009-02-06 02:15:30.000000000 +0000
@@ -404,7 +404,8 @@ spu_child_post_attach (int pid)
 /* Wait for child PTID to do something.  Return id of the child,
    minus_one_ptid in case of error; store status into *OURSTATUS.  */
 static ptid_t
-spu_child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+spu_child_wait (struct target_ops *ops,
+		ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   int save_errno;
   int status;
Index: src/gdb/windows-nat.c
===================================================================
--- src.orig/gdb/windows-nat.c	2009-02-06 02:01:36.000000000 +0000
+++ src/gdb/windows-nat.c	2009-02-06 02:15:30.000000000 +0000
@@ -1444,7 +1444,8 @@ out:
 
 /* Wait for interesting events to occur in the target process.  */
 static ptid_t
-windows_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+windows_wait (struct target_ops *ops,
+	      ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   int pid = -1;
 
@@ -2017,7 +2018,7 @@ windows_close (int x)
 
 /* Convert pid to printable format. */
 static char *
-windows_pid_to_str (ptid_t ptid)
+windows_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[80];
 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Get rid of linux-thread-db.c:target_beneath
  2009-02-06  3:05 Get rid of linux-thread-db.c:target_beneath Pedro Alves
@ 2009-02-06  4:57 ` teawater
  2009-02-06 15:50   ` Pedro Alves
  2009-02-06 22:23 ` Pedro Alves
  1 sibling, 1 reply; 5+ messages in thread
From: teawater @ 2009-02-06  4:57 UTC (permalink / raw)
  To: Pedro Alves; +Cc: gdb-patches

But we still meet the problem that if a function of beneath target is
NULL, current target use find_target_beneath to get the beneath
function pointer is not easy and dangerous like process record meet,
right?

What about make a interface to support safe beneath function?


Thanks,
Hui

On Fri, Feb 6, 2009 at 11:05, Pedro Alves <pedro_alves@portugalmail.pt> wrote:
>
> This started out as a different fix for the extended-remote crash I
> just posted about.  I was feeling tempted to hack something with the
> target_beaneath in linux-thread-db.c, so I thought I'd best get rid of
> it once and for all, to avoid such temptations.
>
> This patch gets rid of the target_beneath pointer in
> linux-thread-db.c, but making it use find_target_beneath instead.  To
> be able to do this, we need to make a few more target methods take a
> `this' target_ops pointer --- namely, to_wait, to_pid_to_str and
> to_get_thread_local_address.
>
> target_get_thread_local_address and target_get_thread_local_address_p
> are only used in target.c in a simple caller, so I can inline them.
>
> thread_db_can_async_p, thread_db_is_async_p and thread_db_async are
> unnecessary, we can just remove them.
>
> To the best of my grep abilities, I fixed all targets.
>
> I've tested this on x86-64-linux.  I'll build this on a couple more
> hosts tomorrow, and will check it in of there are no objections.
>
> 2009-02-06  Pedro Alves  <pedro@codesourcery.com>
>
>        * linux-nat.c (linux_nat_wait): Adjust.
>        (linux_nat_pid_to_str): Adjust.  Remove call to thread_db_init.
>        * linux-nat.h (thread_db_init): Delete declaration.
>        * linux-thread-db.c (target_beneath): Delete.
>        (thread_db_init): Delete.
>        (thread_db_detach): Use find_target_beneath.
>        (thread_db_wait): Adjust interface.  Use find_target_beneath.
>        (thread_db_mourn_inferior): Use find_target_beneath.
>        (thread_db_can_async_p, thread_db_is_async_p, thread_db_async)
>        (thread_db_async_mask): Delete.
>        (thread_db_pid_to_str): Adjust interface.  Use
>        find_target_beneath.
>        (thread_db_get_thread_local_address): Adjust interface.  Use
>        find_target_beneath.
>        (init_thread_db_ops): Delete references to delete functions.
>        * target.c (update_current_target): Don't inherit or default
>        to_wait.  Don't inherit to_pid_to_str and
>        to_get_thread_local_address.
>        (target_translate_tls_address): Look for a pushed target that
>        implements to_get_thread_local_address, and use it instead of
>        checking for target_get_thread_local_address_p.
>        (target_wait, target_pid_to_str): Reimplement as functions.
>        (dummy_pid_to_str): New.
>        (init_dummy_target): Register it.
>        (debug_to_wait): Delete.
>        * target.h (struct target_ops): Make to_wait, to_pid_to_str and
>        to_get_thread_local_address accept a pointer to struct target_ops.
>        (target_wait): Delete macro, and declare as function.
>        (target_pid_to_str): Likewise.
>        (target_get_thread_local_address)
>        (target_get_thread_local_address_p): Delete.
>        (noprocess): Add NORETURN and ATTR_NORETURN tags.
>        * inf-ptrace.c (inf_ptrace_wait): Adjust.
>        (inf_ptrace_pid_to_str): New.
>        (inf_ptrace_target): Use inf_ptrace_pid_to_str.
>        * aix-thread.c (aix_thread_wait, aix_thread_pid_to_str): Adjust.
>        * bsd-kvm.c (bsd_kvm_pid_to_str): Adjust.
>        * bsd-uthread.c (bsd_uthread_wait, bsd_uthread_pid_to_str):
>        Adjust.
>        * corelow.c (core_pid_to_str): Adjust.
>        * darwin-nat.c (darwin_wait, darwin_pid_to_str): Adjust.
>        * dec-thread.c (dec_thread_wait, dec_thread_pid_to_str): Adjust.
>        * gnu-nat.c (gnu_wait, gnu_pid_to_str): Adjust.
>        * go32-nat.c (go32_wait, go32_pid_to_str): Adjust.
>        * hpux-thread.c (hpux_thread_wait): Adjust.
>        * inf-ttrace.c (inf_ttrace_wait, inf_ttrace_pid_to_str): Adjust.
>        * monitor.c (monitor_wait, monitor_pid_to_str): Adjust.
>        * nto-procfs.c (procfs_wait, procfs_pid_to_str): Adjust.
>        * procfs.c (procfs_pid_to_str): Adjust.
>        * remote-m32r-sdi.c (m32r_wait, m32r_pid_to_str): Adjust.
>        * remote-mips.c (mips_wait): Adjust.
>        * remote-sim.c (gdbsim_wait, gdbsim_pid_to_str): Adjust.
>        * remote.c (remote_wait, remote_pid_to_str)
>        (remote_get_thread_local_address): Adjust.
>        * rs6000-nat.c (rs6000_wait): Adjust.
>        * sol-thread.c (procfs_pid_to_str): Adjust declaration.
>        (sol_thread_wait, solaris_pid_to_str): Adjust.
>        * spu-linux-nat.c (spu_child_wait): Adjust.
>        * windows-nat.c (windows_wait, windows_pid_to_str): Adjust.
>
> ---
>  gdb/aix-thread.c      |    9 ++--
>  gdb/bsd-kvm.c         |    2 -
>  gdb/bsd-uthread.c     |    8 ++--
>  gdb/corelow.c         |    2 -
>  gdb/darwin-nat.c      |    9 +---
>  gdb/dec-thread.c      |    9 ++--
>  gdb/gnu-nat.c         |    5 +-
>  gdb/go32-nat.c        |    7 +--
>  gdb/hpux-thread.c     |    6 ++-
>  gdb/inf-ptrace.c      |   11 ++++-
>  gdb/inf-ttrace.c      |    5 +-
>  gdb/linux-nat.c       |    9 +---
>  gdb/linux-nat.h       |    3 -
>  gdb/linux-thread-db.c |   66 ++++++++++-----------------------
>  gdb/monitor.c         |    5 +-
>  gdb/nto-procfs.c      |    7 +--
>  gdb/procfs.c          |    3 -
>  gdb/remote-m32r-sdi.c |    5 +-
>  gdb/remote-mips.c     |    6 +--
>  gdb/remote-sim.c      |    7 +--
>  gdb/remote.c          |   11 ++---
>  gdb/rs6000-nat.c      |    3 +
>  gdb/sol-thread.c      |    9 ++--
>  gdb/spu-linux-nat.c   |    3 +
>  gdb/target.c          |   98 +++++++++++++++++++++++++++++++++-----------------
>  gdb/target.h          |   23 ++++-------
>  gdb/windows-nat.c     |    5 +-
>  27 files changed, 171 insertions(+), 165 deletions(-)
>
> Index: src/gdb/linux-nat.c
> ===================================================================
> --- src.orig/gdb/linux-nat.c    2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/linux-nat.c 2009-02-06 02:15:30.000000000 +0000
> @@ -2776,7 +2776,8 @@ local_event_queue_to_pipe (void)
>  }
>
>  static ptid_t
> -linux_nat_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
> +linux_nat_wait (struct target_ops *ops,
> +               ptid_t ptid, struct target_waitstatus *ourstatus)
>  {
>   struct lwp_info *lp = NULL;
>   int options = 0;
> @@ -3266,7 +3267,7 @@ linux_nat_thread_alive (ptid_t ptid)
>  }
>
>  static char *
> -linux_nat_pid_to_str (ptid_t ptid)
> +linux_nat_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char buf[64];
>
> @@ -4659,10 +4660,6 @@ linux_nat_add_target (struct target_ops
>      also want to be used for single-threaded processes.  */
>
>   add_target (t);
> -
> -  /* TODO: Eliminate this and have libthread_db use
> -     find_target_beneath.  */
> -  thread_db_init (t);
>  }
>
>  /* Register a method to call whenever a new thread is attached.  */
> Index: src/gdb/linux-nat.h
> ===================================================================
> --- src.orig/gdb/linux-nat.h    2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/linux-nat.h 2009-02-06 02:15:30.000000000 +0000
> @@ -94,9 +94,6 @@ extern struct lwp_info *lwp_list;
>  /* Attempt to initialize libthread_db.  */
>  void check_for_thread_db (void);
>
> -/* Tell the thread_db layer what native target operations to use.  */
> -void thread_db_init (struct target_ops *);
> -
>  int thread_db_attach_lwp (ptid_t ptid);
>
>  /* Find process PID's pending signal set from /proc/pid/status.  */
> Index: src/gdb/linux-thread-db.c
> ===================================================================
> --- src.orig/gdb/linux-thread-db.c      2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/linux-thread-db.c   2009-02-06 02:15:30.000000000 +0000
> @@ -80,9 +80,6 @@
>  /* This module's target vector.  */
>  static struct target_ops thread_db_ops;
>
> -/* The target vector that we call for things this module can't handle.  */
> -static struct target_ops *target_beneath;
> -
>  /* Non-zero if we're using this module's target vector.  */
>  static int using_thread_db;
>
> @@ -379,12 +376,6 @@ thread_db_attach_lwp (ptid_t ptid)
>   return 1;
>  }
>
> -void
> -thread_db_init (struct target_ops *target)
> -{
> -  target_beneath = target;
> -}
> -
>  static void *
>  verbose_dlsym (void *handle, const char *name)
>  {
> @@ -782,6 +773,8 @@ detach_thread (ptid_t ptid)
>  static void
>  thread_db_detach (struct target_ops *ops, char *args, int from_tty)
>  {
> +  struct target_ops *target_beneath = find_target_beneath (ops);
> +
>   disable_thread_event_reporting ();
>
>   /* Forget about the child's process ID.  We shouldn't need it
> @@ -885,9 +878,12 @@ check_event (ptid_t ptid)
>  }
>
>  static ptid_t
> -thread_db_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
> +thread_db_wait (struct target_ops *ops,
> +               ptid_t ptid, struct target_waitstatus *ourstatus)
>  {
> -  ptid = target_beneath->to_wait (ptid, ourstatus);
> +  struct target_ops *beneath = find_target_beneath (ops);
> +
> +  ptid = beneath->to_wait (beneath, ptid, ourstatus);
>
>   if (ourstatus->kind == TARGET_WAITKIND_IGNORE)
>     return ptid;
> @@ -934,6 +930,8 @@ thread_db_wait (ptid_t ptid, struct targ
>  static void
>  thread_db_mourn_inferior (struct target_ops *ops)
>  {
> +  struct target_ops *target_beneath = find_target_beneath (ops);
> +
>   /* Forget about the child's process ID.  We shouldn't need it
>      anymore.  */
>   proc_handle.pid = 0;
> @@ -950,31 +948,6 @@ thread_db_mourn_inferior (struct target_
>  }
>
>  static int
> -thread_db_can_async_p (void)
> -{
> -  return target_beneath->to_can_async_p ();
> -}
> -
> -static int
> -thread_db_is_async_p (void)
> -{
> -  return target_beneath->to_is_async_p ();
> -}
> -
> -static void
> -thread_db_async (void (*callback) (enum inferior_event_type event_type,
> -                                  void *context), void *context)
> -{
> -  return target_beneath->to_async (callback, context);
> -}
> -
> -static int
> -thread_db_async_mask (int mask)
> -{
> -  return target_beneath->to_async_mask (mask);
> -}
> -
> -static int
>  find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
>  {
>   td_thrinfo_t ti;
> @@ -1045,9 +1018,10 @@ thread_db_find_new_threads (void)
>  }
>
>  static char *
> -thread_db_pid_to_str (ptid_t ptid)
> +thread_db_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   struct thread_info *thread_info = find_thread_pid (ptid);
> +  struct target_ops *beneath;
>
>   if (thread_info != NULL && thread_info->private != NULL)
>     {
> @@ -1062,8 +1036,9 @@ thread_db_pid_to_str (ptid_t ptid)
>       return buf;
>     }
>
> -  if (target_beneath->to_pid_to_str (ptid))
> -    return target_beneath->to_pid_to_str (ptid);
> +  beneath = find_target_beneath (ops);
> +  if (beneath->to_pid_to_str (beneath, ptid))
> +    return beneath->to_pid_to_str (beneath, ptid);
>
>   return normal_pid_to_str (ptid);
>  }
> @@ -1087,11 +1062,13 @@ thread_db_extra_thread_info (struct thre
>    is stored at OFFSET within the thread local storage for thread PTID.  */
>
>  static CORE_ADDR
> -thread_db_get_thread_local_address (ptid_t ptid,
> +thread_db_get_thread_local_address (struct target_ops *ops,
> +                                   ptid_t ptid,
>                                    CORE_ADDR lm,
>                                    CORE_ADDR offset)
>  {
>   struct thread_info *thread_info;
> +  struct target_ops *beneath;
>
>   /* If we have not discovered any threads yet, check now.  */
>   if (!have_threads ())
> @@ -1141,8 +1118,9 @@ thread_db_get_thread_local_address (ptid
>              : (CORE_ADDR) (uintptr_t) address);
>     }
>
> -  if (target_beneath->to_get_thread_local_address)
> -    return target_beneath->to_get_thread_local_address (ptid, lm, offset);
> +  beneath = find_target_beneath (ops);
> +  if (beneath->to_get_thread_local_address)
> +    return beneath->to_get_thread_local_address (beneath, ptid, lm, offset);
>   else
>     throw_error (TLS_GENERIC_ERROR,
>                 _("TLS not supported on this target"));
> @@ -1193,10 +1171,6 @@ init_thread_db_ops (void)
>   thread_db_ops.to_get_thread_local_address
>     = thread_db_get_thread_local_address;
>   thread_db_ops.to_extra_thread_info = thread_db_extra_thread_info;
> -  thread_db_ops.to_can_async_p = thread_db_can_async_p;
> -  thread_db_ops.to_is_async_p = thread_db_is_async_p;
> -  thread_db_ops.to_async = thread_db_async;
> -  thread_db_ops.to_async_mask = thread_db_async_mask;
>   thread_db_ops.to_get_ada_task_ptid = thread_db_get_ada_task_ptid;
>   thread_db_ops.to_magic = OPS_MAGIC;
>  }
> Index: src/gdb/target.c
> ===================================================================
> --- src.orig/gdb/target.c       2009-02-06 02:14:57.000000000 +0000
> +++ src/gdb/target.c    2009-02-06 02:58:32.000000000 +0000
> @@ -99,8 +99,6 @@ static void debug_to_open (char *, int);
>
>  static void debug_to_resume (ptid_t, int, enum target_signal);
>
> -static ptid_t debug_to_wait (ptid_t, struct target_waitstatus *);
> -
>  static void debug_to_fetch_registers (struct regcache *, int);
>
>  static void debug_to_store_registers (struct regcache *, int);
> @@ -415,7 +413,7 @@ update_current_target (void)
>       /* Do not inherit to_detach.  */
>       /* Do not inherit to_disconnect.  */
>       INHERIT (to_resume, t);
> -      INHERIT (to_wait, t);
> +      /* Do not inherit to_wait.  */
>       INHERIT (to_fetch_registers, t);
>       INHERIT (to_store_registers, t);
>       INHERIT (to_prepare_to_store, t);
> @@ -454,12 +452,12 @@ update_current_target (void)
>       INHERIT (to_insert_exec_catchpoint, t);
>       INHERIT (to_remove_exec_catchpoint, t);
>       INHERIT (to_has_exited, t);
> -      /* Do no inherit to_mourn_inferiour.  */
> +      /* Do not inherit to_mourn_inferiour.  */
>       INHERIT (to_can_run, t);
>       INHERIT (to_notice_signals, t);
>       INHERIT (to_thread_alive, t);
>       INHERIT (to_find_new_threads, t);
> -      INHERIT (to_pid_to_str, t);
> +      /* Do not inherit to_pid_to_str.  */
>       INHERIT (to_extra_thread_info, t);
>       INHERIT (to_stop, t);
>       /* Do not inherit to_xfer_partial.  */
> @@ -481,7 +479,7 @@ update_current_target (void)
>       INHERIT (to_async_mask, t);
>       INHERIT (to_find_memory_regions, t);
>       INHERIT (to_make_corefile_notes, t);
> -      INHERIT (to_get_thread_local_address, t);
> +      /* Do not inherit to_get_thread_local_address.  */
>       INHERIT (to_can_execute_reverse, t);
>       /* Do not inherit to_read_description.  */
>       INHERIT (to_get_ada_task_ptid, t);
> @@ -514,9 +512,6 @@ update_current_target (void)
>   de_fault (to_resume,
>            (void (*) (ptid_t, int, enum target_signal))
>            noprocess);
> -  de_fault (to_wait,
> -           (ptid_t (*) (ptid_t, struct target_waitstatus *))
> -           noprocess);
>   de_fault (to_fetch_registers,
>            (void (*) (struct regcache *, int))
>            target_ignore);
> @@ -853,8 +848,17 @@ CORE_ADDR
>  target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset)
>  {
>   volatile CORE_ADDR addr = 0;
> +  struct target_ops *target;
> +
> +  for (target = current_target.beneath;
> +       target != NULL;
> +       target = target->beneath)
> +    {
> +      if (target->to_get_thread_local_address != NULL)
> +       break;
> +    }
>
> -  if (target_get_thread_local_address_p ()
> +  if (target != NULL
>       && gdbarch_fetch_tls_load_module_address_p (target_gdbarch))
>     {
>       ptid_t ptid = inferior_ptid;
> @@ -872,7 +876,7 @@ target_translate_tls_address (struct obj
>            throw_error (TLS_LOAD_MODULE_NOT_FOUND_ERROR,
>                         _("TLS load module not found"));
>
> -         addr = target_get_thread_local_address (ptid, lm_addr, offset);
> +         addr = target->to_get_thread_local_address (target, ptid, lm_addr, offset);
>        }
>       /* If an error occurred, print TLS related messages here.  Otherwise,
>          throw the error to some higher catcher.  */
> @@ -1841,6 +1845,50 @@ target_disconnect (char *args, int from_
>   tcomplain ();
>  }
>
> +ptid_t
> +target_wait (ptid_t ptid, struct target_waitstatus *status)
> +{
> +  struct target_ops *t;
> +
> +  for (t = current_target.beneath; t != NULL; t = t->beneath)
> +    {
> +      if (t->to_wait != NULL)
> +       {
> +         ptid_t retval = (*t->to_wait) (t, ptid, status);
> +
> +         if (targetdebug)
> +           {
> +             char *status_string;
> +
> +             status_string = target_waitstatus_to_string (status);
> +             fprintf_unfiltered (gdb_stdlog,
> +                                 "target_wait (%d, status) = %d, %s\n",
> +                                 PIDGET (ptid), PIDGET (retval),
> +                                 status_string);
> +             xfree (status_string);
> +           }
> +
> +         return retval;
> +       }
> +    }
> +
> +  noprocess ();
> +}
> +
> +char *
> +target_pid_to_str (ptid_t ptid)
> +{
> +  struct target_ops *t;
> +
> +  for (t = current_target.beneath; t != NULL; t = t->beneath)
> +    {
> +      if (t->to_pid_to_str != NULL)
> +       return (*t->to_pid_to_str) (t, ptid);
> +    }
> +
> +  return normal_pid_to_str (ptid);
> +}
> +
>  void
>  target_resume (ptid_t ptid, int step, enum target_signal signal)
>  {
> @@ -2475,6 +2523,12 @@ normal_pid_to_str (ptid_t ptid)
>   return buf;
>  }
>
> +char *
> +dummy_pid_to_str (struct target_ops *ops, ptid_t ptid)
> +{
> +  return normal_pid_to_str (ptid);
> +}
> +
>  /* Error-catcher for target_find_memory_regions */
>  static int dummy_find_memory_regions (int (*ignore1) (), void *ignore2)
>  {
> @@ -2505,7 +2559,7 @@ init_dummy_target (void)
>   dummy_target.to_can_async_p = find_default_can_async_p;
>   dummy_target.to_is_async_p = find_default_is_async_p;
>   dummy_target.to_supports_non_stop = find_default_supports_non_stop;
> -  dummy_target.to_pid_to_str = normal_pid_to_str;
> +  dummy_target.to_pid_to_str = dummy_pid_to_str;
>   dummy_target.to_stratum = dummy_stratum;
>   dummy_target.to_find_memory_regions = dummy_find_memory_regions;
>   dummy_target.to_make_corefile_notes = dummy_make_corefile_notes;
> @@ -2613,25 +2667,6 @@ target_waitstatus_to_string (const struc
>     }
>  }
>
> -static ptid_t
> -debug_to_wait (ptid_t ptid, struct target_waitstatus *status)
> -{
> -  ptid_t retval;
> -  char *status_string;
> -
> -  retval = debug_target.to_wait (ptid, status);
> -
> -  fprintf_unfiltered (gdb_stdlog,
> -                     "target_wait (%d, status) = %d,   ", PIDGET (ptid),
> -                     PIDGET (retval));
> -
> -  status_string = target_waitstatus_to_string (status);
> -  fprintf_unfiltered (gdb_stdlog, "%s\n", status_string);
> -  xfree (status_string);
> -
> -  return retval;
> -}
> -
>  static void
>  debug_print_register (const char * func,
>                      struct regcache *regcache, int regno)
> @@ -3148,7 +3183,6 @@ setup_target_debug (void)
>   current_target.to_open = debug_to_open;
>   current_target.to_post_attach = debug_to_post_attach;
>   current_target.to_resume = debug_to_resume;
> -  current_target.to_wait = debug_to_wait;
>   current_target.to_fetch_registers = debug_to_fetch_registers;
>   current_target.to_store_registers = debug_to_store_registers;
>   current_target.to_prepare_to_store = debug_to_prepare_to_store;
> Index: src/gdb/target.h
> ===================================================================
> --- src.orig/gdb/target.h       2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/target.h    2009-02-06 02:15:30.000000000 +0000
> @@ -330,7 +330,8 @@ struct target_ops
>     void (*to_detach) (struct target_ops *ops, char *, int);
>     void (*to_disconnect) (struct target_ops *, char *, int);
>     void (*to_resume) (ptid_t, int, enum target_signal);
> -    ptid_t (*to_wait) (ptid_t, struct target_waitstatus *);
> +    ptid_t (*to_wait) (struct target_ops *ops,
> +                     ptid_t, struct target_waitstatus *);
>     void (*to_fetch_registers) (struct regcache *, int);
>     void (*to_store_registers) (struct regcache *, int);
>     void (*to_prepare_to_store) (struct regcache *);
> @@ -402,7 +403,7 @@ struct target_ops
>     void (*to_notice_signals) (ptid_t ptid);
>     int (*to_thread_alive) (ptid_t ptid);
>     void (*to_find_new_threads) (void);
> -    char *(*to_pid_to_str) (ptid_t);
> +    char *(*to_pid_to_str) (struct target_ops *ops, ptid_t);
>     char *(*to_extra_thread_info) (struct thread_info *);
>     void (*to_stop) (ptid_t);
>     void (*to_rcmd) (char *command, struct ui_file *output);
> @@ -438,7 +439,8 @@ struct target_ops
>        or executable file given by OBJFILE.  If that block of
>        thread-local storage hasn't been allocated yet, this function
>        may return an error.  */
> -    CORE_ADDR (*to_get_thread_local_address) (ptid_t ptid,
> +    CORE_ADDR (*to_get_thread_local_address) (struct target_ops *ops,
> +                                             ptid_t ptid,
>                                              CORE_ADDR load_module_addr,
>                                              CORE_ADDR offset);
>
> @@ -625,8 +627,7 @@ extern void target_resume (ptid_t ptid,
>    to the prompt with a debugging target but without the frame cache,
>    stop_pc, etc., set up.  */
>
> -#define        target_wait(ptid, status)               \
> -     (*current_target.to_wait) (ptid, status)
> +extern ptid_t target_wait (ptid_t ptid, struct target_waitstatus *status);
>
>  /* Fetch at least register REGNO, or all regs if regno == -1.  No result.  */
>
> @@ -1013,8 +1014,7 @@ int target_supports_non_stop (void);
>    `process xyz', but on some systems it may contain
>    `process xyz thread abc'.  */
>
> -#undef target_pid_to_str
> -#define target_pid_to_str(PID) current_target.to_pid_to_str (PID)
> +extern char *target_pid_to_str (ptid_t ptid);
>
>  extern char *normal_pid_to_str (ptid_t ptid);
>
> @@ -1057,13 +1057,6 @@ extern char *normal_pid_to_str (ptid_t p
>  #define target_make_corefile_notes(BFD, SIZE_P) \
>      (current_target.to_make_corefile_notes) (BFD, SIZE_P)
>
> -/* Thread-local values.  */
> -#define target_get_thread_local_address \
> -    (current_target.to_get_thread_local_address)
> -#define target_get_thread_local_address_p() \
> -    (target_get_thread_local_address != NULL)
> -
> -
>  /* Hardware watchpoint interfaces.  */
>
>  /* Returns non-zero if we were stopped by a hardware watchpoint (memory read or
> @@ -1252,7 +1245,7 @@ extern int default_memory_insert_breakpo
>
>  extern void initialize_targets (void);
>
> -extern void noprocess (void);
> +extern NORETURN void noprocess (void) ATTR_NORETURN;
>
>  extern void target_require_runnable (void);
>
> Index: src/gdb/inf-ptrace.c
> ===================================================================
> --- src.orig/gdb/inf-ptrace.c   2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/inf-ptrace.c        2009-02-06 02:15:30.000000000 +0000
> @@ -385,7 +385,8 @@ inf_ptrace_resume (ptid_t ptid, int step
>    the status in *OURSTATUS.  */
>
>  static ptid_t
> -inf_ptrace_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
> +inf_ptrace_wait (struct target_ops *ops,
> +                ptid_t ptid, struct target_waitstatus *ourstatus)
>  {
>   pid_t pid;
>   int status, save_errno;
> @@ -615,6 +616,12 @@ inf_ptrace_files_info (struct target_ops
>                   target_pid_to_str (inferior_ptid));
>  }
>
> +static char *
> +inf_ptrace_pid_to_str (struct target_ops *ops, ptid_t ptid)
> +{
> +  return normal_pid_to_str (ptid);
> +}
> +
>  /* Create a prototype ptrace target.  The client can override it with
>    local methods.  */
>
> @@ -637,7 +644,7 @@ inf_ptrace_target (void)
>  #endif
>   t->to_mourn_inferior = inf_ptrace_mourn_inferior;
>   t->to_thread_alive = inf_ptrace_thread_alive;
> -  t->to_pid_to_str = normal_pid_to_str;
> +  t->to_pid_to_str = inf_ptrace_pid_to_str;
>   t->to_stop = inf_ptrace_stop;
>   t->to_xfer_partial = inf_ptrace_xfer_partial;
>
> Index: src/gdb/aix-thread.c
> ===================================================================
> --- src.orig/gdb/aix-thread.c   2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/aix-thread.c        2009-02-06 02:15:30.000000000 +0000
> @@ -997,14 +997,15 @@ aix_thread_resume (ptid_t ptid, int step
>    thread.  */
>
>  static ptid_t
> -aix_thread_wait (ptid_t ptid, struct target_waitstatus *status)
> +aix_thread_wait (struct target_ops *ops,
> +                ptid_t ptid, struct target_waitstatus *status)
>  {
>   struct cleanup *cleanup = save_inferior_ptid ();
>
>   pid_to_prc (&ptid);
>
>   inferior_ptid = pid_to_ptid (PIDGET (inferior_ptid));
> -  ptid = base_target.to_wait (ptid, status);
> +  ptid = base_target.to_wait (&base_target, ptid, status);
>   do_cleanups (cleanup);
>
>   if (PIDGET (ptid) == -1)
> @@ -1691,12 +1692,12 @@ aix_thread_thread_alive (ptid_t ptid)
>    "info threads" output.  */
>
>  static char *
> -aix_thread_pid_to_str (ptid_t ptid)
> +aix_thread_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char *ret = NULL;
>
>   if (!PD_TID (ptid))
> -    return base_target.to_pid_to_str (ptid);
> +    return base_target.to_pid_to_str (&base_target, ptid);
>
>   /* Free previous return value; a new one will be allocated by
>      xstrprintf().  */
> Index: src/gdb/bsd-kvm.c
> ===================================================================
> --- src.orig/gdb/bsd-kvm.c      2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/bsd-kvm.c   2009-02-06 02:15:30.000000000 +0000
> @@ -316,7 +316,7 @@ bsd_kvm_thread_alive (ptid_t ptid)
>  }
>
>  static char *
> -bsd_kvm_pid_to_str (ptid_t ptid)
> +bsd_kvm_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char buf[64];
>   xsnprintf (buf, sizeof buf, "<kvm>");
> Index: src/gdb/bsd-uthread.c
> ===================================================================
> --- src.orig/gdb/bsd-uthread.c  2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/bsd-uthread.c       2009-02-06 02:15:30.000000000 +0000
> @@ -340,12 +340,14 @@ bsd_uthread_xfer_partial (struct target_
>  }
>
>  static ptid_t
> -bsd_uthread_wait (ptid_t ptid, struct target_waitstatus *status)
> +bsd_uthread_wait (struct target_ops *ops,
> +                 ptid_t ptid, struct target_waitstatus *status)
>  {
>   CORE_ADDR addr;
> +  struct target_ops *beneath = find_target_beneath (bsd_uthread_ops_hack);
>
>   /* Pass the request to the layer beneath.  */
> -  ptid = find_target_beneath (bsd_uthread_ops_hack)->to_wait (ptid, status);
> +  ptid = beneath->to_wait (beneath, ptid, status);
>
>   /* If the process is no longer alive, there's no point in figuring
>      out the thread ID.  It will fail anyway.  */
> @@ -487,7 +489,7 @@ bsd_uthread_extra_thread_info (struct th
>  }
>
>  static char *
> -bsd_uthread_pid_to_str (ptid_t ptid)
> +bsd_uthread_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   if (ptid_get_tid (ptid) != 0)
>     {
> Index: src/gdb/corelow.c
> ===================================================================
> --- src.orig/gdb/corelow.c      2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/corelow.c   2009-02-06 02:15:30.000000000 +0000
> @@ -680,7 +680,7 @@ core_read_description (struct target_ops
>  }
>
>  static char *
> -core_pid_to_str (ptid_t ptid)
> +core_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char buf[64];
>
> Index: src/gdb/darwin-nat.c
> ===================================================================
> --- src.orig/gdb/darwin-nat.c   2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/darwin-nat.c        2009-02-06 02:15:30.000000000 +0000
> @@ -89,8 +89,6 @@ static void darwin_stop (ptid_t);
>  static void darwin_resume (ptid_t ptid, int step,
>                           enum target_signal signal);
>
> -static ptid_t darwin_wait (ptid_t ptid, struct target_waitstatus *status);
> -
>  static void darwin_mourn_inferior (struct target_ops *ops);
>
>  static int darwin_lookup_task (char *args, task_t * ptask, int *ppid);
> @@ -106,8 +104,6 @@ static void darwin_create_inferior (stru
>
>  static void darwin_files_info (struct target_ops *ops);
>
> -static char *darwin_pid_to_str (ptid_t tpid);
> -
>  static int darwin_thread_alive (ptid_t tpid);
>
>  /* Current inferior.  */
> @@ -483,7 +479,8 @@ catch_exception_raise (mach_port_t port,
>  }
>
>  static ptid_t
> -darwin_wait (ptid_t ptid, struct target_waitstatus *status)
> +darwin_wait (struct target_ops *ops,
> +            ptid_t ptid, struct target_waitstatus *status)
>  {
>   kern_return_t kret;
>   mach_msg_header_t *hdr = &msgin.hdr;
> @@ -1049,7 +1046,7 @@ darwin_files_info (struct target_ops *op
>  }
>
>  static char *
> -darwin_pid_to_str (ptid_t ptid)
> +darwin_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char buf[128];
>
> Index: src/gdb/dec-thread.c
> ===================================================================
> --- src.orig/gdb/dec-thread.c   2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/dec-thread.c        2009-02-06 02:15:30.000000000 +0000
> @@ -453,13 +453,14 @@ get_active_ptid (void)
>  /* The "to_wait" method of the dec_thread_ops.  */
>
>  static ptid_t
> -dec_thread_wait (ptid_t ptid, struct target_waitstatus *status)
> +dec_thread_wait (struct target_ops *ops,
> +                ptid_t ptid, struct target_waitstatus *status)
>  {
>   ptid_t active_ptid;
>
>   debug ("dec_thread_wait");
>
> -  ptid = base_target.to_wait (ptid, status);
> +  ptid = base_target.to_wait (&base_target, ptid, status);
>
>   /* The ptid returned by the base_target is the ptid of the process.
>      We need to find which thread is currently active and return its
> @@ -622,12 +623,12 @@ dec_thread_thread_alive (ptid_t ptid)
>  /* The "to_pid_to_str" method of the dec_thread_ops.  */
>
>  static char *
> -dec_thread_pid_to_str (ptid_t ptid)
> +dec_thread_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char *ret = NULL;
>
>   if (ptid_get_tid (ptid) == 0)
> -    return base_target.to_pid_to_str (ptid);
> +    return base_target.to_pid_to_str (&base_target, ptid);
>
>   /* Free previous return value; a new one will be allocated by
>      xstrprintf().  */
> Index: src/gdb/gnu-nat.c
> ===================================================================
> --- src.orig/gdb/gnu-nat.c      2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/gnu-nat.c   2009-02-06 02:15:30.000000000 +0000
> @@ -1433,7 +1433,8 @@ struct inf *waiting_inf;
>
>  /* Wait for something to happen in the inferior, returning what in STATUS. */
>  static ptid_t
> -gnu_wait (ptid_t ptid, struct target_waitstatus *status)
> +gnu_wait (struct target_ops *ops,
> +         ptid_t ptid, struct target_waitstatus *status)
>  {
>   struct msg
>     {
> @@ -2594,7 +2595,7 @@ proc_string (struct proc *proc)
>  }
>
>  static char *
> -gnu_pid_to_str (ptid_t ptid)
> +gnu_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   struct inf *inf = gnu_current_inf;
>   int tid = ptid_get_tid (ptid);
> Index: src/gdb/go32-nat.c
> ===================================================================
> --- src.orig/gdb/go32-nat.c     2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/go32-nat.c  2009-02-06 02:15:30.000000000 +0000
> @@ -171,8 +171,6 @@ static void go32_attach (char *args, int
>  static void go32_detach (char *args, int from_tty);
>  static void go32_resume (ptid_t ptid, int step,
>                          enum target_signal siggnal);
> -static ptid_t go32_wait (ptid_t ptid,
> -                               struct target_waitstatus *status);
>  static void go32_fetch_registers (struct regcache *, int regno);
>  static void store_register (const struct regcache *, int regno);
>  static void go32_store_registers (struct regcache *, int regno);
> @@ -347,7 +345,8 @@ go32_resume (ptid_t ptid, int step, enum
>  static char child_cwd[FILENAME_MAX];
>
>  static ptid_t
> -go32_wait (ptid_t ptid, struct target_waitstatus *status)
> +go32_wait (struct target_ops *ops,
> +          ptid_t ptid, struct target_waitstatus *status)
>  {
>   int i;
>   unsigned char saved_opcode;
> @@ -866,7 +865,7 @@ go32_thread_alive (ptid_t ptid)
>  }
>
>  static char *
> -go32_pid_to_str (ptid_t ptid)
> +go32_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char buf[64];
>   xsnprintf (buf, sizeof buf, "Thread <main>");
> Index: src/gdb/hpux-thread.c
> ===================================================================
> --- src.orig/gdb/hpux-thread.c  2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/hpux-thread.c       2009-02-06 02:15:30.000000000 +0000
> @@ -191,7 +191,8 @@ hpux_thread_resume (ptid_t ptid, int ste
>    to a LWP id, and vice versa on the way out.  */
>
>  static ptid_t
> -hpux_thread_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
> +hpux_thread_wait (struct target_ops *ops,
> +                 ptid_t ptid, struct target_waitstatus *ourstatus)
>  {
>   ptid_t rtnval;
>   struct cleanup *old_chain;
> @@ -203,7 +204,8 @@ hpux_thread_wait (ptid_t ptid, struct ta
>   if (!ptid_equal (ptid, minus_one_ptid))
>     ptid = main_ptid;
>
> -  rtnval = deprecated_child_ops.to_wait (ptid, ourstatus);
> +  rtnval = deprecated_child_ops.to_wait (&deprecated_child_ops,
> +                                        ptid, ourstatus);
>
>   rtnval = find_active_thread ();
>
> Index: src/gdb/inf-ttrace.c
> ===================================================================
> --- src.orig/gdb/inf-ttrace.c   2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/inf-ttrace.c        2009-02-06 02:15:30.000000000 +0000
> @@ -915,7 +915,8 @@ inf_ttrace_resume (ptid_t ptid, int step
>  }
>
>  static ptid_t
> -inf_ttrace_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
> +inf_ttrace_wait (struct target_ops *ops,
> +                ptid_t ptid, struct target_waitstatus *ourstatus)
>  {
>   pid_t pid = ptid_get_pid (ptid);
>   lwpid_t lwpid = ptid_get_lwp (ptid);
> @@ -1252,7 +1253,7 @@ inf_ttrace_extra_thread_info (struct thr
>  }
>
>  static char *
> -inf_ttrace_pid_to_str (ptid_t ptid)
> +inf_ttrace_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   pid_t pid = ptid_get_pid (ptid);
>   lwpid_t lwpid = ptid_get_lwp (ptid);
> Index: src/gdb/monitor.c
> ===================================================================
> --- src.orig/gdb/monitor.c      2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/monitor.c   2009-02-06 02:15:30.000000000 +0000
> @@ -1063,7 +1063,8 @@ monitor_wait_filter (char *buf,
>    status just as `wait' would.  */
>
>  static ptid_t
> -monitor_wait (ptid_t ptid, struct target_waitstatus *status)
> +monitor_wait (struct target_ops *ops,
> +             ptid_t ptid, struct target_waitstatus *status)
>  {
>   int old_timeout = timeout;
>   char buf[TARGET_BUF_SIZE];
> @@ -2244,7 +2245,7 @@ monitor_thread_alive (ptid_t ptid)
>    buffer.  */
>
>  static char *
> -monitor_pid_to_str (ptid_t ptid)
> +monitor_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char buf[64];
>
> Index: src/gdb/nto-procfs.c
> ===================================================================
> --- src.orig/gdb/nto-procfs.c   2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/nto-procfs.c        2009-02-06 02:15:30.000000000 +0000
> @@ -59,8 +59,6 @@ static void procfs_open (char *, int);
>
>  static int procfs_can_run (void);
>
> -static ptid_t procfs_wait (ptid_t, struct target_waitstatus *);
> -
>  static int procfs_xfer_memory (CORE_ADDR, gdb_byte *, int, int,
>                               struct mem_attrib *attrib,
>                               struct target_ops *);
> @@ -626,7 +624,8 @@ nto_interrupt (int signo)
>  }
>
>  static ptid_t
> -procfs_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
> +procfs_wait (struct target_ops *ops,
> +            ptid_t ptid, struct target_waitstatus *ourstatus)
>  {
>   sigset_t set;
>   siginfo_t info;
> @@ -1265,7 +1264,7 @@ procfs_thread_info (pid_t pid, short tid
>  }
>
>  char *
> -procfs_pid_to_str (ptid_t ptid)
> +procfs_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char buf[1024];
>   int pid, tid, n;
> Index: src/gdb/procfs.c
> ===================================================================
> --- src.orig/gdb/procfs.c       2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/procfs.c    2009-02-06 02:15:30.000000000 +0000
> @@ -139,7 +139,6 @@ static LONGEST procfs_xfer_partial (stru
>  static int procfs_thread_alive (ptid_t);
>
>  void procfs_find_new_threads (void);
> -char *procfs_pid_to_str (ptid_t);
>
>  static int proc_find_memory_regions (int (*) (CORE_ADDR,
>                                              unsigned long,
> @@ -5270,7 +5269,7 @@ procfs_thread_alive (ptid_t ptid)
>  /* Convert PTID to a string.  Returns the string in a static buffer.  */
>
>  char *
> -procfs_pid_to_str (ptid_t ptid)
> +procfs_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char buf[80];
>
> Index: src/gdb/remote-m32r-sdi.c
> ===================================================================
> --- src.orig/gdb/remote-m32r-sdi.c      2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/remote-m32r-sdi.c   2009-02-06 02:15:30.000000000 +0000
> @@ -693,7 +693,8 @@ gdb_cntrl_c (int signo)
>  }
>
>  static ptid_t
> -m32r_wait (ptid_t ptid, struct target_waitstatus *status)
> +m32r_wait (struct target_ops *ops,
> +          ptid_t ptid, struct target_waitstatus *status)
>  {
>   static RETSIGTYPE (*prev_sigint) ();
>   unsigned long bp_addr, pc_addr;
> @@ -1507,7 +1508,7 @@ m32r_thread_alive (ptid_t ptid)
>    buffer.  */
>
>  static char *
> -m32r_pid_to_str (ptid_t ptid)
> +m32r_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char buf[64];
>
> Index: src/gdb/remote-mips.c
> ===================================================================
> --- src.orig/gdb/remote-mips.c  2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/remote-mips.c       2009-02-06 02:15:30.000000000 +0000
> @@ -89,9 +89,6 @@ static void mips_detach (struct target_o
>  static void mips_resume (ptid_t ptid, int step,
>                          enum target_signal siggnal);
>
> -static ptid_t mips_wait (ptid_t ptid,
> -                               struct target_waitstatus *status);
> -
>  static int mips_map_regno (struct gdbarch *, int);
>
>  static void mips_fetch_registers (struct regcache *regcache, int regno);
> @@ -1703,7 +1700,8 @@ mips_signal_from_protocol (int sig)
>  /* Wait until the remote stops, and return a wait status.  */
>
>  static ptid_t
> -mips_wait (ptid_t ptid, struct target_waitstatus *status)
> +mips_wait (struct target_ops *ops,
> +          ptid_t ptid, struct target_waitstatus *status)
>  {
>   int rstatus;
>   int err;
> Index: src/gdb/remote-sim.c
> ===================================================================
> --- src.orig/gdb/remote-sim.c   2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/remote-sim.c        2009-02-06 02:15:30.000000000 +0000
> @@ -88,8 +88,6 @@ static void gdbsim_detach (struct target
>
>  static void gdbsim_resume (ptid_t ptid, int step, enum target_signal siggnal);
>
> -static ptid_t gdbsim_wait (ptid_t ptid, struct target_waitstatus *status);
> -
>  static void gdbsim_prepare_to_store (struct regcache *regcache);
>
>  static void gdbsim_files_info (struct target_ops *target);
> @@ -680,7 +678,8 @@ gdbsim_cntrl_c (int signo)
>  }
>
>  static ptid_t
> -gdbsim_wait (ptid_t ptid, struct target_waitstatus *status)
> +gdbsim_wait (struct target_ops *ops,
> +            ptid_t ptid, struct target_waitstatus *status)
>  {
>   static RETSIGTYPE (*prev_sigint) ();
>   int sigrc = 0;
> @@ -874,7 +873,7 @@ gdbsim_thread_alive (ptid_t ptid)
>    buffer.  */
>
>  static char *
> -gdbsim_pid_to_str (ptid_t ptid)
> +gdbsim_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char buf[64];
>
> Index: src/gdb/remote.c
> ===================================================================
> --- src.orig/gdb/remote.c       2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/remote.c    2009-02-06 02:15:30.000000000 +0000
> @@ -117,9 +117,6 @@ static void remote_send (char **buf, lon
>
>  static int readchar (int timeout);
>
> -static ptid_t remote_wait (ptid_t ptid,
> -                          struct target_waitstatus *status);
> -
>  static void remote_kill (void);
>
>  static int tohex (int nib);
> @@ -4733,7 +4730,8 @@ remote_wait_as (ptid_t ptid, struct targ
>    STATUS just as `wait' would.  */
>
>  static ptid_t
> -remote_wait (ptid_t ptid, struct target_waitstatus *status)
> +remote_wait (struct target_ops *ops,
> +            ptid_t ptid, struct target_waitstatus *status)
>  {
>   ptid_t event_ptid;
>
> @@ -7769,7 +7767,7 @@ Fetch and print the remote list of threa
>    buffer.  */
>
>  static char *
> -remote_pid_to_str (ptid_t ptid)
> +remote_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char buf[64];
>   struct remote_state *rs = get_remote_state ();
> @@ -7800,7 +7798,8 @@ remote_pid_to_str (ptid_t ptid)
>    stored at OFFSET within the thread local storage for thread PTID.  */
>
>  static CORE_ADDR
> -remote_get_thread_local_address (ptid_t ptid, CORE_ADDR lm, CORE_ADDR offset)
> +remote_get_thread_local_address (struct target_ops *ops,
> +                                ptid_t ptid, CORE_ADDR lm, CORE_ADDR offset)
>  {
>   if (remote_protocol_packets[PACKET_qGetTLSAddr].support != PACKET_DISABLE)
>     {
> Index: src/gdb/rs6000-nat.c
> ===================================================================
> --- src.orig/gdb/rs6000-nat.c   2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/rs6000-nat.c        2009-02-06 02:15:30.000000000 +0000
> @@ -517,7 +517,8 @@ rs6000_xfer_partial (struct target_ops *
>    the status in *OURSTATUS.  */
>
>  static ptid_t
> -rs6000_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
> +rs6000_wait (struct target_ops *ops,
> +            ptid_t ptid, struct target_waitstatus *ourstatus)
>  {
>   pid_t pid;
>   int status, save_errno;
> Index: src/gdb/sol-thread.c
> ===================================================================
> --- src.orig/gdb/sol-thread.c   2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/sol-thread.c        2009-02-06 02:15:30.000000000 +0000
> @@ -80,7 +80,7 @@ struct target_ops sol_core_ops;
>  extern int procfs_suppress_run;
>  extern struct target_ops procfs_ops;   /* target vector for procfs.c */
>  extern struct target_ops core_ops;     /* target vector for corelow.c */
> -extern char *procfs_pid_to_str (ptid_t ptid);
> +extern char *procfs_pid_to_str (struct target_ops *ops, ptid_t ptid);
>
>  /* Prototypes for supply_gregset etc. */
>  #include "gregset.h"
> @@ -424,7 +424,8 @@ sol_thread_resume (ptid_t ptid, int step
>    thread ID to an LWP ID, and vice versa on the way out.  */
>
>  static ptid_t
> -sol_thread_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
> +sol_thread_wait (struct target_ops *ops,
> +                ptid_t ptid, struct target_waitstatus *ourstatus)
>  {
>   ptid_t rtnval;
>   ptid_t save_ptid;
> @@ -449,7 +450,7 @@ sol_thread_wait (ptid_t ptid, struct tar
>                 GET_THREAD (save_ptid));
>     }
>
> -  rtnval = procfs_ops.to_wait (ptid, ourstatus);
> +  rtnval = procfs_ops.to_wait (&procfs_ops, ptid, ourstatus);
>
>   if (ourstatus->kind != TARGET_WAITKIND_EXITED)
>     {
> @@ -1323,7 +1324,7 @@ ps_lgetLDT (gdb_ps_prochandle_t ph, lwpi
>  /* Convert PTID to printable form.  */
>
>  char *
> -solaris_pid_to_str (ptid_t ptid)
> +solaris_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char buf[100];
>
> Index: src/gdb/spu-linux-nat.c
> ===================================================================
> --- src.orig/gdb/spu-linux-nat.c        2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/spu-linux-nat.c     2009-02-06 02:15:30.000000000 +0000
> @@ -404,7 +404,8 @@ spu_child_post_attach (int pid)
>  /* Wait for child PTID to do something.  Return id of the child,
>    minus_one_ptid in case of error; store status into *OURSTATUS.  */
>  static ptid_t
> -spu_child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
> +spu_child_wait (struct target_ops *ops,
> +               ptid_t ptid, struct target_waitstatus *ourstatus)
>  {
>   int save_errno;
>   int status;
> Index: src/gdb/windows-nat.c
> ===================================================================
> --- src.orig/gdb/windows-nat.c  2009-02-06 02:01:36.000000000 +0000
> +++ src/gdb/windows-nat.c       2009-02-06 02:15:30.000000000 +0000
> @@ -1444,7 +1444,8 @@ out:
>
>  /* Wait for interesting events to occur in the target process.  */
>  static ptid_t
> -windows_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
> +windows_wait (struct target_ops *ops,
> +             ptid_t ptid, struct target_waitstatus *ourstatus)
>  {
>   int pid = -1;
>
> @@ -2017,7 +2018,7 @@ windows_close (int x)
>
>  /* Convert pid to printable format. */
>  static char *
> -windows_pid_to_str (ptid_t ptid)
> +windows_pid_to_str (struct target_ops *ops, ptid_t ptid)
>  {
>   static char buf[80];
>
>


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Get rid of linux-thread-db.c:target_beneath
  2009-02-06  4:57 ` teawater
@ 2009-02-06 15:50   ` Pedro Alves
  2009-02-08 13:15     ` teawater
  0 siblings, 1 reply; 5+ messages in thread
From: Pedro Alves @ 2009-02-06 15:50 UTC (permalink / raw)
  To: gdb-patches; +Cc: teawater

On Friday 06 February 2009 04:56:58, teawater wrote:
> But we still meet the problem that if a function of beneath target is
> NULL, current target use find_target_beneath to get the beneath
> function pointer is not easy and dangerous like process record meet,
> right?

linux-thread-db.c always sits on top of linux-nat.c currently, so
it is safe to use in the cases I adjusted.  When it isn't "safe",
linux-thread-db.c already checks for NULL-ness.

> What about make a interface to support safe beneath function?

For now, you can check that the function pointer is NULL before
calling it.  If it is NULL, then try the next target
beneath, etc.  See target_attach, target_flash_erase, etc.  You
could do something similar in the record.c target.  Things
are cleaner on the target method implementation side
if the target method takes a "this" pointer, like the one I'm
adding to target_wait.

If you do that, you get rid of the record_beneath_to_resume,
record_beneath_to_wait, record_beneath_to_store_registers, etc.
function pointer hacks you had.  The wrinkle that has, is that your
method ends up responsible for doing the default if no target
implements the method.  IMO, that would acceptible for
now.  But, it can be fixed.


Now we're mixing up threads, and I was going to start
doing / proposing this separately, but since you are
asking...:

There are diferent "kinds" of target methods.

- those that are defaulted to something that throws an error

  say, target_resume calls "noprocess" by default.

- some are always defaulted to something that returns
  a reasonable default, or just an ignore function

  say, to_fetch_registers, which defaults to "target_ignore".

- some are optional and so default to NULL.  Usually in these
  cases, the code in target.c checks for NULLness and
  continues looking up in the target beneath for a suitable
  function pointer.  

- some are implemented using inheritance when building up
  the current_target target (INHERIT in target.c).  On these,
  you want to call current_target.foofunc.

- some do the beneath lookup themselves to get away from
  this inheritance mechanism.

This is all naturally, a mess.  As we talked about before,
a target method should default to calling the same method
on the target beneath.  In the bottom of the stack, you have a
sentinel target (the dummy target) that should implement
the default behaviour of the target method.

This way, a target method is never null, so it is always
safe to call the beneath method:

 target_foomethod (struct target_ops *ops, ...)
 {
   beneath = find_target_beneath (ops);
   return beneath->foofunc (beneath, ...);
 }

See below an example of what I'm talking about.

There a couple of methods were this may get tricky, but
nothing unsurmountable.  Notice how doing this also
suggests that target.c/target.h could be half generated
by a target.sh script, similarly to what we do with
gdbarch.{c|h|sh}.

There are few methods in the dummy target, that default
to look up the default run target and run the method there.
This suggests that if we change things like I suggested above,
we need to either make all process_stratum targets implement
those methods, do the lookup beneath stops there, or, make
all process_stratum targets inherit (in the c++ sense) from
inf-child.c or similar; otherwise, e.g, we could be connected
to some remote-like target, while the method would be run on
the native target.

-- 
Pedro Alves


---
 gdb/target.c |   80 +++++++++++++++++++++++++++++++++--------------------------
 1 file changed, 45 insertions(+), 35 deletions(-)

Index: src/gdb/target.c
===================================================================
--- src.orig/gdb/target.c	2009-02-06 14:41:50.000000000 +0000
+++ src/gdb/target.c	2009-02-06 15:20:36.000000000 +0000
@@ -376,6 +376,19 @@ default_get_ada_task_ptid (long lwp, lon
   return ptid_build (ptid_get_pid (inferior_ptid), lwp, tid);
 }
 
+static ptid_t
+default_to_wait (struct target_ops *ops,
+		 ptid_t ptid, struct target_waitstatus *status)
+{
+  return (*ops->beneath->to_wait) (ops, ptid, status);
+}
+
+static void
+default_to_attach (struct target_ops *ops, char *args, int from_tty)
+{
+  (*ops->beneath->to_attach) (ops, args, from_tty);
+}
+
 /* Go through the target stack from top to bottom, copying over zero
    entries in current_target, then filling in still empty entries.  In
    effect, we are doing class inheritance through the pushed target
@@ -506,9 +519,11 @@ update_current_target (void)
   de_fault (to_close,
 	    (void (*) (int))
 	    target_ignore);
+  de_fault (to_attach, default_to_attach);
   de_fault (to_post_attach,
 	    (void (*) (int))
 	    target_ignore);
+  de_fault (to_wait, default_to_wait);
   de_fault (to_resume,
 	    (void (*) (ptid_t, int, enum target_signal))
 	    noprocess);
@@ -1848,31 +1863,22 @@ target_disconnect (char *args, int from_
 ptid_t
 target_wait (ptid_t ptid, struct target_waitstatus *status)
 {
-  struct target_ops *t;
+  struct target_ops *t = current_target.beneath;
+  ptid_t retval = (t->to_wait) (t, ptid, status);
 
-  for (t = current_target.beneath; t != NULL; t = t->beneath)
+  if (targetdebug)
     {
-      if (t->to_wait != NULL)
-	{
-	  ptid_t retval = (*t->to_wait) (t, ptid, status);
+      char *status_string;
 
-	  if (targetdebug)
-	    {
-	      char *status_string;
-
-	      status_string = target_waitstatus_to_string (status);
-	      fprintf_unfiltered (gdb_stdlog,
-				  "target_wait (%d, status) = %d, %s\n",
-				  PIDGET (ptid), PIDGET (retval),
-				  status_string);
-	      xfree (status_string);
-	    }
-
-	  return retval;
-	}
+      status_string = target_waitstatus_to_string (status);
+      fprintf_unfiltered (gdb_stdlog,
+			  "target_wait (%d, status) = %d, %s\n",
+			  PIDGET (ptid), PIDGET (retval),
+			  status_string);
+      xfree (status_string);
     }
 
-  noprocess ();
+  return retval;
 }
 
 char *
@@ -2529,6 +2535,19 @@ dummy_pid_to_str (struct target_ops *ops
   return normal_pid_to_str (ptid);
 }
 
+static ptid_t
+dummy_to_wait (struct target_ops *ops,
+	       ptid_t ptid, struct target_waitstatus *status)
+{
+  noprocess ();
+}
+
+void
+dummy_to_attach (char *args, int from_tty)
+{
+  noprocess ();
+}
+
 /* Error-catcher for target_find_memory_regions */
 static int dummy_find_memory_regions (int (*ignore1) (), void *ignore2)
 {
@@ -2557,6 +2576,7 @@ init_dummy_target (void)
     (void (*)(struct target_ops *, char *, int))target_ignore;
   dummy_target.to_create_inferior = find_default_create_inferior;
   dummy_target.to_can_async_p = find_default_can_async_p;
+  dummy_target.to_wait = dummy_to_wait;
   dummy_target.to_is_async_p = find_default_is_async_p;
   dummy_target.to_supports_non_stop = find_default_supports_non_stop;
   dummy_target.to_pid_to_str = dummy_pid_to_str;
@@ -2590,21 +2610,11 @@ target_close (struct target_ops *targ, i
 void
 target_attach (char *args, int from_tty)
 {
-  struct target_ops *t;
-  for (t = current_target.beneath; t != NULL; t = t->beneath)
-    {
-      if (t->to_attach != NULL)	
-	{
-	  t->to_attach (t, args, from_tty);
-	  if (targetdebug)
-	    fprintf_unfiltered (gdb_stdlog, "target_attach (%s, %d)\n",
-				args, from_tty);
-	  return;
-	}
-    }
-
-  internal_error (__FILE__, __LINE__,
-		  "could not find a target to attach");
+  struct target_ops *t = current_target.beneath;
+  (*t->to_attach) (t, args, from_tty);
+  if (targetdebug)
+    fprintf_unfiltered (gdb_stdlog, "target_attach (%s, %d)\n",
+			args, from_tty);
 }
 
 static void


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Get rid of linux-thread-db.c:target_beneath
  2009-02-06  3:05 Get rid of linux-thread-db.c:target_beneath Pedro Alves
  2009-02-06  4:57 ` teawater
@ 2009-02-06 22:23 ` Pedro Alves
  1 sibling, 0 replies; 5+ messages in thread
From: Pedro Alves @ 2009-02-06 22:23 UTC (permalink / raw)
  To: gdb-patches

On Friday 06 February 2009 03:05:28, Pedro Alves wrote:

> To the best of my grep abilities, I fixed all targets.
> 
> I've tested this on x86-64-linux.  I'll build this on a couple more
> hosts tomorrow, and will check it in of there are no objections.

I've built and smoke tested this version (which has a couple of extra
small adjustments to sol-thread.c) on i386-pc-cygwin, i386-solaris,
arm-elf (for remote-sim.c), gnu-hurd, and i386-openbsd4.3.

Checked in.

-- 
Pedro Alves

2009-02-06  Pedro Alves  <pedro@codesourcery.com>

	* linux-nat.c (linux_nat_wait): Adjust.
	(linux_nat_pid_to_str): Adjust.  Remove call to thread_db_init.
	* linux-nat.h (thread_db_init): Delete declaration.
	* linux-thread-db.c (target_beneath): Delete.
	(thread_db_init): Delete.
	(thread_db_detach): Use find_target_beneath.
	(thread_db_wait): Adjust interface.  Use find_target_beneath.
	(thread_db_mourn_inferior): Use find_target_beneath.
	(thread_db_can_async_p, thread_db_is_async_p, thread_db_async)
	(thread_db_async_mask): Delete.
	(thread_db_pid_to_str): Adjust interface.  Use
	find_target_beneath.
	(thread_db_get_thread_local_address): Adjust interface.  Use
	find_target_beneath.
	(init_thread_db_ops): Delete references to delete functions.
	* target.c (update_current_target): Don't inherit or default
	to_wait.  Don't inherit to_pid_to_str and
	to_get_thread_local_address.
	(target_translate_tls_address): Look for a pushed target that
	implements to_get_thread_local_address, and use it instead of
	checking for target_get_thread_local_address_p.
	(target_wait, target_pid_to_str): Reimplement as functions.
	(dummy_pid_to_str): New.
	(init_dummy_target): Register it.
	(debug_to_wait): Delete.
	* target.h (struct target_ops): Make to_wait, to_pid_to_str and
	to_get_thread_local_address accept a pointer to struct target_ops.
	(target_wait): Delete macro, and declare as function.
	(target_pid_to_str): Likewise.
	(target_get_thread_local_address)
	(target_get_thread_local_address_p): Delete.
	(noprocess): Add NORETURN and ATTR_NORETURN tags.
	* inf-ptrace.c (inf_ptrace_wait): Adjust.
	(inf_ptrace_pid_to_str): New.
	(inf_ptrace_target): Use inf_ptrace_pid_to_str.
	* aix-thread.c (aix_thread_wait, aix_thread_pid_to_str): Adjust.
	* bsd-kvm.c (bsd_kvm_pid_to_str): Adjust.
	* bsd-uthread.c (bsd_uthread_wait, bsd_uthread_pid_to_str):
	Adjust.
	* corelow.c (core_pid_to_str): Adjust.
	* darwin-nat.c (darwin_wait, darwin_pid_to_str): Adjust.
	* dec-thread.c (dec_thread_wait, dec_thread_pid_to_str): Adjust.
	* gnu-nat.c (gnu_wait, gnu_pid_to_str): Adjust.
	* go32-nat.c (go32_wait, go32_pid_to_str): Adjust.
	* hpux-thread.c (hpux_thread_wait): Adjust.
	* inf-ttrace.c (inf_ttrace_wait, inf_ttrace_pid_to_str): Adjust.
	* monitor.c (monitor_wait, monitor_pid_to_str): Adjust.
	* nto-procfs.c (procfs_wait, procfs_pid_to_str): Adjust.
	* procfs.c (procfs_pid_to_str): Adjust.
	* remote-m32r-sdi.c (m32r_wait, m32r_pid_to_str): Adjust.
	* remote-mips.c (mips_wait): Adjust.
	* remote-sim.c (gdbsim_wait, gdbsim_pid_to_str): Adjust.
	* remote.c (remote_wait, remote_pid_to_str)
	(remote_get_thread_local_address): Adjust.
	* rs6000-nat.c (rs6000_wait): Adjust.
	* sol-thread.c (procfs_pid_to_str): Adjust declaration.
	(sol_thread_wait, solaris_pid_to_str): Adjust.
	* spu-linux-nat.c (spu_child_wait): Adjust.
	* windows-nat.c (windows_wait, windows_pid_to_str): Adjust.

---
 gdb/aix-thread.c      |    9 ++--
 gdb/bsd-kvm.c         |    2 -
 gdb/bsd-uthread.c     |    8 ++--
 gdb/corelow.c         |    2 -
 gdb/darwin-nat.c      |    9 +---
 gdb/dec-thread.c      |    9 ++--
 gdb/gnu-nat.c         |    5 +-
 gdb/go32-nat.c        |    7 +--
 gdb/hpux-thread.c     |    6 ++-
 gdb/inf-ptrace.c      |   11 ++++-
 gdb/inf-ttrace.c      |    5 +-
 gdb/linux-nat.c       |    9 +---
 gdb/linux-nat.h       |    3 -
 gdb/linux-thread-db.c |   66 ++++++++++-----------------------
 gdb/monitor.c         |    5 +-
 gdb/nto-procfs.c      |    7 +--
 gdb/procfs.c          |   10 +++--
 gdb/remote-m32r-sdi.c |    5 +-
 gdb/remote-mips.c     |    6 +--
 gdb/remote-sim.c      |    7 +--
 gdb/remote.c          |   11 ++---
 gdb/rs6000-nat.c      |    3 +
 gdb/sol-thread.c      |   11 +++--
 gdb/spu-linux-nat.c   |    3 +
 gdb/target.c          |   98 +++++++++++++++++++++++++++++++++-----------------
 gdb/target.h          |   23 ++++-------
 gdb/windows-nat.c     |    5 +-
 27 files changed, 177 insertions(+), 168 deletions(-)

Index: src/gdb/linux-nat.c
===================================================================
--- src.orig/gdb/linux-nat.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/linux-nat.c	2009-02-06 22:08:20.000000000 +0000
@@ -2776,7 +2776,8 @@ local_event_queue_to_pipe (void)
 }
 
 static ptid_t
-linux_nat_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+linux_nat_wait (struct target_ops *ops,
+		ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   struct lwp_info *lp = NULL;
   int options = 0;
@@ -3266,7 +3267,7 @@ linux_nat_thread_alive (ptid_t ptid)
 }
 
 static char *
-linux_nat_pid_to_str (ptid_t ptid)
+linux_nat_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
 
@@ -4659,10 +4660,6 @@ linux_nat_add_target (struct target_ops 
      also want to be used for single-threaded processes.  */
 
   add_target (t);
-
-  /* TODO: Eliminate this and have libthread_db use
-     find_target_beneath.  */
-  thread_db_init (t);
 }
 
 /* Register a method to call whenever a new thread is attached.  */
Index: src/gdb/linux-nat.h
===================================================================
--- src.orig/gdb/linux-nat.h	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/linux-nat.h	2009-02-06 22:08:20.000000000 +0000
@@ -94,9 +94,6 @@ extern struct lwp_info *lwp_list;
 /* Attempt to initialize libthread_db.  */
 void check_for_thread_db (void);
 
-/* Tell the thread_db layer what native target operations to use.  */
-void thread_db_init (struct target_ops *);
-
 int thread_db_attach_lwp (ptid_t ptid);
 
 /* Find process PID's pending signal set from /proc/pid/status.  */
Index: src/gdb/linux-thread-db.c
===================================================================
--- src.orig/gdb/linux-thread-db.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/linux-thread-db.c	2009-02-06 22:08:20.000000000 +0000
@@ -80,9 +80,6 @@
 /* This module's target vector.  */
 static struct target_ops thread_db_ops;
 
-/* The target vector that we call for things this module can't handle.  */
-static struct target_ops *target_beneath;
-
 /* Non-zero if we're using this module's target vector.  */
 static int using_thread_db;
 
@@ -379,12 +376,6 @@ thread_db_attach_lwp (ptid_t ptid)
   return 1;
 }
 
-void
-thread_db_init (struct target_ops *target)
-{
-  target_beneath = target;
-}
-
 static void *
 verbose_dlsym (void *handle, const char *name)
 {
@@ -782,6 +773,8 @@ detach_thread (ptid_t ptid)
 static void
 thread_db_detach (struct target_ops *ops, char *args, int from_tty)
 {
+  struct target_ops *target_beneath = find_target_beneath (ops);
+
   disable_thread_event_reporting ();
 
   /* Forget about the child's process ID.  We shouldn't need it
@@ -885,9 +878,12 @@ check_event (ptid_t ptid)
 }
 
 static ptid_t
-thread_db_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+thread_db_wait (struct target_ops *ops,
+		ptid_t ptid, struct target_waitstatus *ourstatus)
 {
-  ptid = target_beneath->to_wait (ptid, ourstatus);
+  struct target_ops *beneath = find_target_beneath (ops);
+
+  ptid = beneath->to_wait (beneath, ptid, ourstatus);
 
   if (ourstatus->kind == TARGET_WAITKIND_IGNORE)
     return ptid;
@@ -934,6 +930,8 @@ thread_db_wait (ptid_t ptid, struct targ
 static void
 thread_db_mourn_inferior (struct target_ops *ops)
 {
+  struct target_ops *target_beneath = find_target_beneath (ops);
+
   /* Forget about the child's process ID.  We shouldn't need it
      anymore.  */
   proc_handle.pid = 0;
@@ -950,31 +948,6 @@ thread_db_mourn_inferior (struct target_
 }
 
 static int
-thread_db_can_async_p (void)
-{
-  return target_beneath->to_can_async_p ();
-}
-
-static int
-thread_db_is_async_p (void)
-{
-  return target_beneath->to_is_async_p ();
-}
-
-static void
-thread_db_async (void (*callback) (enum inferior_event_type event_type,
-				   void *context), void *context)
-{
-  return target_beneath->to_async (callback, context);
-}
-
-static int
-thread_db_async_mask (int mask)
-{
-  return target_beneath->to_async_mask (mask);
-}
-
-static int
 find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
 {
   td_thrinfo_t ti;
@@ -1045,9 +1018,10 @@ thread_db_find_new_threads (void)
 }
 
 static char *
-thread_db_pid_to_str (ptid_t ptid)
+thread_db_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   struct thread_info *thread_info = find_thread_pid (ptid);
+  struct target_ops *beneath;
 
   if (thread_info != NULL && thread_info->private != NULL)
     {
@@ -1062,8 +1036,9 @@ thread_db_pid_to_str (ptid_t ptid)
       return buf;
     }
 
-  if (target_beneath->to_pid_to_str (ptid))
-    return target_beneath->to_pid_to_str (ptid);
+  beneath = find_target_beneath (ops);
+  if (beneath->to_pid_to_str (beneath, ptid))
+    return beneath->to_pid_to_str (beneath, ptid);
 
   return normal_pid_to_str (ptid);
 }
@@ -1087,11 +1062,13 @@ thread_db_extra_thread_info (struct thre
    is stored at OFFSET within the thread local storage for thread PTID.  */
 
 static CORE_ADDR
-thread_db_get_thread_local_address (ptid_t ptid,
+thread_db_get_thread_local_address (struct target_ops *ops,
+				    ptid_t ptid,
 				    CORE_ADDR lm,
 				    CORE_ADDR offset)
 {
   struct thread_info *thread_info;
+  struct target_ops *beneath;
 
   /* If we have not discovered any threads yet, check now.  */
   if (!have_threads ())
@@ -1141,8 +1118,9 @@ thread_db_get_thread_local_address (ptid
 	      : (CORE_ADDR) (uintptr_t) address);
     }
 
-  if (target_beneath->to_get_thread_local_address)
-    return target_beneath->to_get_thread_local_address (ptid, lm, offset);
+  beneath = find_target_beneath (ops);
+  if (beneath->to_get_thread_local_address)
+    return beneath->to_get_thread_local_address (beneath, ptid, lm, offset);
   else
     throw_error (TLS_GENERIC_ERROR,
 	         _("TLS not supported on this target"));
@@ -1193,10 +1171,6 @@ init_thread_db_ops (void)
   thread_db_ops.to_get_thread_local_address
     = thread_db_get_thread_local_address;
   thread_db_ops.to_extra_thread_info = thread_db_extra_thread_info;
-  thread_db_ops.to_can_async_p = thread_db_can_async_p;
-  thread_db_ops.to_is_async_p = thread_db_is_async_p;
-  thread_db_ops.to_async = thread_db_async;
-  thread_db_ops.to_async_mask = thread_db_async_mask;
   thread_db_ops.to_get_ada_task_ptid = thread_db_get_ada_task_ptid;
   thread_db_ops.to_magic = OPS_MAGIC;
 }
Index: src/gdb/target.c
===================================================================
--- src.orig/gdb/target.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/target.c	2009-02-06 22:08:20.000000000 +0000
@@ -99,8 +99,6 @@ static void debug_to_open (char *, int);
 
 static void debug_to_resume (ptid_t, int, enum target_signal);
 
-static ptid_t debug_to_wait (ptid_t, struct target_waitstatus *);
-
 static void debug_to_fetch_registers (struct regcache *, int);
 
 static void debug_to_store_registers (struct regcache *, int);
@@ -415,7 +413,7 @@ update_current_target (void)
       /* Do not inherit to_detach.  */
       /* Do not inherit to_disconnect.  */
       INHERIT (to_resume, t);
-      INHERIT (to_wait, t);
+      /* Do not inherit to_wait.  */
       INHERIT (to_fetch_registers, t);
       INHERIT (to_store_registers, t);
       INHERIT (to_prepare_to_store, t);
@@ -454,12 +452,12 @@ update_current_target (void)
       INHERIT (to_insert_exec_catchpoint, t);
       INHERIT (to_remove_exec_catchpoint, t);
       INHERIT (to_has_exited, t);
-      /* Do no inherit to_mourn_inferiour.  */
+      /* Do not inherit to_mourn_inferiour.  */
       INHERIT (to_can_run, t);
       INHERIT (to_notice_signals, t);
       INHERIT (to_thread_alive, t);
       INHERIT (to_find_new_threads, t);
-      INHERIT (to_pid_to_str, t);
+      /* Do not inherit to_pid_to_str.  */
       INHERIT (to_extra_thread_info, t);
       INHERIT (to_stop, t);
       /* Do not inherit to_xfer_partial.  */
@@ -481,7 +479,7 @@ update_current_target (void)
       INHERIT (to_async_mask, t);
       INHERIT (to_find_memory_regions, t);
       INHERIT (to_make_corefile_notes, t);
-      INHERIT (to_get_thread_local_address, t);
+      /* Do not inherit to_get_thread_local_address.  */
       INHERIT (to_can_execute_reverse, t);
       /* Do not inherit to_read_description.  */
       INHERIT (to_get_ada_task_ptid, t);
@@ -514,9 +512,6 @@ update_current_target (void)
   de_fault (to_resume,
 	    (void (*) (ptid_t, int, enum target_signal))
 	    noprocess);
-  de_fault (to_wait,
-	    (ptid_t (*) (ptid_t, struct target_waitstatus *))
-	    noprocess);
   de_fault (to_fetch_registers,
 	    (void (*) (struct regcache *, int))
 	    target_ignore);
@@ -853,8 +848,17 @@ CORE_ADDR
 target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset)
 {
   volatile CORE_ADDR addr = 0;
+  struct target_ops *target;
+
+  for (target = current_target.beneath;
+       target != NULL;
+       target = target->beneath)
+    {
+      if (target->to_get_thread_local_address != NULL)
+	break;
+    }
 
-  if (target_get_thread_local_address_p ()
+  if (target != NULL
       && gdbarch_fetch_tls_load_module_address_p (target_gdbarch))
     {
       ptid_t ptid = inferior_ptid;
@@ -872,7 +876,7 @@ target_translate_tls_address (struct obj
 	    throw_error (TLS_LOAD_MODULE_NOT_FOUND_ERROR,
 			 _("TLS load module not found"));
 
-	  addr = target_get_thread_local_address (ptid, lm_addr, offset);
+	  addr = target->to_get_thread_local_address (target, ptid, lm_addr, offset);
 	}
       /* If an error occurred, print TLS related messages here.  Otherwise,
          throw the error to some higher catcher.  */
@@ -1841,6 +1845,50 @@ target_disconnect (char *args, int from_
   tcomplain ();
 }
 
+ptid_t
+target_wait (ptid_t ptid, struct target_waitstatus *status)
+{
+  struct target_ops *t;
+
+  for (t = current_target.beneath; t != NULL; t = t->beneath)
+    {
+      if (t->to_wait != NULL)
+	{
+	  ptid_t retval = (*t->to_wait) (t, ptid, status);
+
+	  if (targetdebug)
+	    {
+	      char *status_string;
+
+	      status_string = target_waitstatus_to_string (status);
+	      fprintf_unfiltered (gdb_stdlog,
+				  "target_wait (%d, status) = %d,   %s\n",
+				  PIDGET (ptid), PIDGET (retval),
+				  status_string);
+	      xfree (status_string);
+	    }
+
+	  return retval;
+	}
+    }
+
+  noprocess ();
+}
+
+char *
+target_pid_to_str (ptid_t ptid)
+{
+  struct target_ops *t;
+
+  for (t = current_target.beneath; t != NULL; t = t->beneath)
+    {
+      if (t->to_pid_to_str != NULL)
+	return (*t->to_pid_to_str) (t, ptid);
+    }
+
+  return normal_pid_to_str (ptid);
+}
+
 void
 target_resume (ptid_t ptid, int step, enum target_signal signal)
 {
@@ -2475,6 +2523,12 @@ normal_pid_to_str (ptid_t ptid)
   return buf;
 }
 
+char *
+dummy_pid_to_str (struct target_ops *ops, ptid_t ptid)
+{
+  return normal_pid_to_str (ptid);
+}
+
 /* Error-catcher for target_find_memory_regions */
 static int dummy_find_memory_regions (int (*ignore1) (), void *ignore2)
 {
@@ -2505,7 +2559,7 @@ init_dummy_target (void)
   dummy_target.to_can_async_p = find_default_can_async_p;
   dummy_target.to_is_async_p = find_default_is_async_p;
   dummy_target.to_supports_non_stop = find_default_supports_non_stop;
-  dummy_target.to_pid_to_str = normal_pid_to_str;
+  dummy_target.to_pid_to_str = dummy_pid_to_str;
   dummy_target.to_stratum = dummy_stratum;
   dummy_target.to_find_memory_regions = dummy_find_memory_regions;
   dummy_target.to_make_corefile_notes = dummy_make_corefile_notes;
@@ -2613,25 +2667,6 @@ target_waitstatus_to_string (const struc
     }
 }
 
-static ptid_t
-debug_to_wait (ptid_t ptid, struct target_waitstatus *status)
-{
-  ptid_t retval;
-  char *status_string;
-
-  retval = debug_target.to_wait (ptid, status);
-
-  fprintf_unfiltered (gdb_stdlog,
-		      "target_wait (%d, status) = %d,   ", PIDGET (ptid),
-		      PIDGET (retval));
-
-  status_string = target_waitstatus_to_string (status);
-  fprintf_unfiltered (gdb_stdlog, "%s\n", status_string);
-  xfree (status_string);
-
-  return retval;
-}
-
 static void
 debug_print_register (const char * func,
 		      struct regcache *regcache, int regno)
@@ -3148,7 +3183,6 @@ setup_target_debug (void)
   current_target.to_open = debug_to_open;
   current_target.to_post_attach = debug_to_post_attach;
   current_target.to_resume = debug_to_resume;
-  current_target.to_wait = debug_to_wait;
   current_target.to_fetch_registers = debug_to_fetch_registers;
   current_target.to_store_registers = debug_to_store_registers;
   current_target.to_prepare_to_store = debug_to_prepare_to_store;
Index: src/gdb/target.h
===================================================================
--- src.orig/gdb/target.h	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/target.h	2009-02-06 22:08:20.000000000 +0000
@@ -330,7 +330,8 @@ struct target_ops
     void (*to_detach) (struct target_ops *ops, char *, int);
     void (*to_disconnect) (struct target_ops *, char *, int);
     void (*to_resume) (ptid_t, int, enum target_signal);
-    ptid_t (*to_wait) (ptid_t, struct target_waitstatus *);
+    ptid_t (*to_wait) (struct target_ops *,
+		      ptid_t, struct target_waitstatus *);
     void (*to_fetch_registers) (struct regcache *, int);
     void (*to_store_registers) (struct regcache *, int);
     void (*to_prepare_to_store) (struct regcache *);
@@ -402,7 +403,7 @@ struct target_ops
     void (*to_notice_signals) (ptid_t ptid);
     int (*to_thread_alive) (ptid_t ptid);
     void (*to_find_new_threads) (void);
-    char *(*to_pid_to_str) (ptid_t);
+    char *(*to_pid_to_str) (struct target_ops *, ptid_t);
     char *(*to_extra_thread_info) (struct thread_info *);
     void (*to_stop) (ptid_t);
     void (*to_rcmd) (char *command, struct ui_file *output);
@@ -438,7 +439,8 @@ struct target_ops
        or executable file given by OBJFILE.  If that block of
        thread-local storage hasn't been allocated yet, this function
        may return an error.  */
-    CORE_ADDR (*to_get_thread_local_address) (ptid_t ptid,
+    CORE_ADDR (*to_get_thread_local_address) (struct target_ops *ops,
+					      ptid_t ptid,
 					      CORE_ADDR load_module_addr,
 					      CORE_ADDR offset);
 
@@ -625,8 +627,7 @@ extern void target_resume (ptid_t ptid, 
    to the prompt with a debugging target but without the frame cache,
    stop_pc, etc., set up.  */
 
-#define	target_wait(ptid, status)		\
-     (*current_target.to_wait) (ptid, status)
+extern ptid_t target_wait (ptid_t ptid, struct target_waitstatus *status);
 
 /* Fetch at least register REGNO, or all regs if regno == -1.  No result.  */
 
@@ -1013,8 +1014,7 @@ int target_supports_non_stop (void);
    `process xyz', but on some systems it may contain
    `process xyz thread abc'.  */
 
-#undef target_pid_to_str
-#define target_pid_to_str(PID) current_target.to_pid_to_str (PID)
+extern char *target_pid_to_str (ptid_t ptid);
 
 extern char *normal_pid_to_str (ptid_t ptid);
 
@@ -1057,13 +1057,6 @@ extern char *normal_pid_to_str (ptid_t p
 #define target_make_corefile_notes(BFD, SIZE_P) \
      (current_target.to_make_corefile_notes) (BFD, SIZE_P)
 
-/* Thread-local values.  */
-#define target_get_thread_local_address \
-    (current_target.to_get_thread_local_address)
-#define target_get_thread_local_address_p() \
-    (target_get_thread_local_address != NULL)
-
-
 /* Hardware watchpoint interfaces.  */
 
 /* Returns non-zero if we were stopped by a hardware watchpoint (memory read or
@@ -1252,7 +1245,7 @@ extern int default_memory_insert_breakpo
 
 extern void initialize_targets (void);
 
-extern void noprocess (void);
+extern NORETURN void noprocess (void) ATTR_NORETURN;
 
 extern void target_require_runnable (void);
 
Index: src/gdb/inf-ptrace.c
===================================================================
--- src.orig/gdb/inf-ptrace.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/inf-ptrace.c	2009-02-06 22:08:20.000000000 +0000
@@ -385,7 +385,8 @@ inf_ptrace_resume (ptid_t ptid, int step
    the status in *OURSTATUS.  */
 
 static ptid_t
-inf_ptrace_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+inf_ptrace_wait (struct target_ops *ops,
+		 ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   pid_t pid;
   int status, save_errno;
@@ -615,6 +616,12 @@ inf_ptrace_files_info (struct target_ops
 		   target_pid_to_str (inferior_ptid));
 }
 
+static char *
+inf_ptrace_pid_to_str (struct target_ops *ops, ptid_t ptid)
+{
+  return normal_pid_to_str (ptid);
+}
+
 /* Create a prototype ptrace target.  The client can override it with
    local methods.  */
 
@@ -637,7 +644,7 @@ inf_ptrace_target (void)
 #endif
   t->to_mourn_inferior = inf_ptrace_mourn_inferior;
   t->to_thread_alive = inf_ptrace_thread_alive;
-  t->to_pid_to_str = normal_pid_to_str;
+  t->to_pid_to_str = inf_ptrace_pid_to_str;
   t->to_stop = inf_ptrace_stop;
   t->to_xfer_partial = inf_ptrace_xfer_partial;
 
Index: src/gdb/aix-thread.c
===================================================================
--- src.orig/gdb/aix-thread.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/aix-thread.c	2009-02-06 22:08:20.000000000 +0000
@@ -997,14 +997,15 @@ aix_thread_resume (ptid_t ptid, int step
    thread.  */
 
 static ptid_t
-aix_thread_wait (ptid_t ptid, struct target_waitstatus *status)
+aix_thread_wait (struct target_ops *ops,
+		 ptid_t ptid, struct target_waitstatus *status)
 {
   struct cleanup *cleanup = save_inferior_ptid ();
 
   pid_to_prc (&ptid);
 
   inferior_ptid = pid_to_ptid (PIDGET (inferior_ptid));
-  ptid = base_target.to_wait (ptid, status);
+  ptid = base_target.to_wait (&base_target, ptid, status);
   do_cleanups (cleanup);
 
   if (PIDGET (ptid) == -1)
@@ -1691,12 +1692,12 @@ aix_thread_thread_alive (ptid_t ptid)
    "info threads" output.  */
 
 static char *
-aix_thread_pid_to_str (ptid_t ptid)
+aix_thread_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char *ret = NULL;
 
   if (!PD_TID (ptid))
-    return base_target.to_pid_to_str (ptid);
+    return base_target.to_pid_to_str (&base_target, ptid);
 
   /* Free previous return value; a new one will be allocated by
      xstrprintf().  */
Index: src/gdb/bsd-kvm.c
===================================================================
--- src.orig/gdb/bsd-kvm.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/bsd-kvm.c	2009-02-06 22:08:20.000000000 +0000
@@ -316,7 +316,7 @@ bsd_kvm_thread_alive (ptid_t ptid)
 }
 
 static char *
-bsd_kvm_pid_to_str (ptid_t ptid)
+bsd_kvm_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
   xsnprintf (buf, sizeof buf, "<kvm>");
Index: src/gdb/bsd-uthread.c
===================================================================
--- src.orig/gdb/bsd-uthread.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/bsd-uthread.c	2009-02-06 22:08:20.000000000 +0000
@@ -340,12 +340,14 @@ bsd_uthread_xfer_partial (struct target_
 }
 
 static ptid_t
-bsd_uthread_wait (ptid_t ptid, struct target_waitstatus *status)
+bsd_uthread_wait (struct target_ops *ops,
+		  ptid_t ptid, struct target_waitstatus *status)
 {
   CORE_ADDR addr;
+  struct target_ops *beneath = find_target_beneath (bsd_uthread_ops_hack);
 
   /* Pass the request to the layer beneath.  */
-  ptid = find_target_beneath (bsd_uthread_ops_hack)->to_wait (ptid, status);
+  ptid = beneath->to_wait (beneath, ptid, status);
 
   /* If the process is no longer alive, there's no point in figuring
      out the thread ID.  It will fail anyway.  */
@@ -487,7 +489,7 @@ bsd_uthread_extra_thread_info (struct th
 }
 
 static char *
-bsd_uthread_pid_to_str (ptid_t ptid)
+bsd_uthread_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   if (ptid_get_tid (ptid) != 0)
     {
Index: src/gdb/corelow.c
===================================================================
--- src.orig/gdb/corelow.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/corelow.c	2009-02-06 22:08:20.000000000 +0000
@@ -680,7 +680,7 @@ core_read_description (struct target_ops
 }
 
 static char *
-core_pid_to_str (ptid_t ptid)
+core_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
 
Index: src/gdb/darwin-nat.c
===================================================================
--- src.orig/gdb/darwin-nat.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/darwin-nat.c	2009-02-06 22:08:20.000000000 +0000
@@ -89,8 +89,6 @@ static void darwin_stop (ptid_t);
 static void darwin_resume (ptid_t ptid, int step,
 			   enum target_signal signal);
 
-static ptid_t darwin_wait (ptid_t ptid, struct target_waitstatus *status);
-
 static void darwin_mourn_inferior (struct target_ops *ops);
 
 static int darwin_lookup_task (char *args, task_t * ptask, int *ppid);
@@ -106,8 +104,6 @@ static void darwin_create_inferior (stru
 
 static void darwin_files_info (struct target_ops *ops);
 
-static char *darwin_pid_to_str (ptid_t tpid);
-
 static int darwin_thread_alive (ptid_t tpid);
 
 /* Current inferior.  */
@@ -483,7 +479,8 @@ catch_exception_raise (mach_port_t port,
 }
 
 static ptid_t
-darwin_wait (ptid_t ptid, struct target_waitstatus *status)
+darwin_wait (struct target_ops *ops,
+	     ptid_t ptid, struct target_waitstatus *status)
 {
   kern_return_t kret;
   mach_msg_header_t *hdr = &msgin.hdr;
@@ -1049,7 +1046,7 @@ darwin_files_info (struct target_ops *op
 }
 
 static char *
-darwin_pid_to_str (ptid_t ptid)
+darwin_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[128];
 
Index: src/gdb/dec-thread.c
===================================================================
--- src.orig/gdb/dec-thread.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/dec-thread.c	2009-02-06 22:08:20.000000000 +0000
@@ -453,13 +453,14 @@ get_active_ptid (void)
 /* The "to_wait" method of the dec_thread_ops.  */
 
 static ptid_t
-dec_thread_wait (ptid_t ptid, struct target_waitstatus *status)
+dec_thread_wait (struct target_ops *ops,
+		 ptid_t ptid, struct target_waitstatus *status)
 {
   ptid_t active_ptid;
 
   debug ("dec_thread_wait");
 
-  ptid = base_target.to_wait (ptid, status);
+  ptid = base_target.to_wait (&base_target, ptid, status);
 
   /* The ptid returned by the base_target is the ptid of the process.
      We need to find which thread is currently active and return its
@@ -622,12 +623,12 @@ dec_thread_thread_alive (ptid_t ptid)
 /* The "to_pid_to_str" method of the dec_thread_ops.  */
 
 static char *
-dec_thread_pid_to_str (ptid_t ptid)
+dec_thread_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char *ret = NULL;
 
   if (ptid_get_tid (ptid) == 0)
-    return base_target.to_pid_to_str (ptid);
+    return base_target.to_pid_to_str (&base_target, ptid);
 
   /* Free previous return value; a new one will be allocated by
      xstrprintf().  */
Index: src/gdb/gnu-nat.c
===================================================================
--- src.orig/gdb/gnu-nat.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/gnu-nat.c	2009-02-06 22:08:20.000000000 +0000
@@ -1433,7 +1433,8 @@ struct inf *waiting_inf;
 
 /* Wait for something to happen in the inferior, returning what in STATUS. */
 static ptid_t
-gnu_wait (ptid_t ptid, struct target_waitstatus *status)
+gnu_wait (struct target_ops *ops,
+	  ptid_t ptid, struct target_waitstatus *status)
 {
   struct msg
     {
@@ -2594,7 +2595,7 @@ proc_string (struct proc *proc)
 }
 
 static char *
-gnu_pid_to_str (ptid_t ptid)
+gnu_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   struct inf *inf = gnu_current_inf;
   int tid = ptid_get_tid (ptid);
Index: src/gdb/go32-nat.c
===================================================================
--- src.orig/gdb/go32-nat.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/go32-nat.c	2009-02-06 22:08:20.000000000 +0000
@@ -171,8 +171,6 @@ static void go32_attach (char *args, int
 static void go32_detach (char *args, int from_tty);
 static void go32_resume (ptid_t ptid, int step,
                          enum target_signal siggnal);
-static ptid_t go32_wait (ptid_t ptid,
-                               struct target_waitstatus *status);
 static void go32_fetch_registers (struct regcache *, int regno);
 static void store_register (const struct regcache *, int regno);
 static void go32_store_registers (struct regcache *, int regno);
@@ -347,7 +345,8 @@ go32_resume (ptid_t ptid, int step, enum
 static char child_cwd[FILENAME_MAX];
 
 static ptid_t
-go32_wait (ptid_t ptid, struct target_waitstatus *status)
+go32_wait (struct target_ops *ops,
+	   ptid_t ptid, struct target_waitstatus *status)
 {
   int i;
   unsigned char saved_opcode;
@@ -866,7 +865,7 @@ go32_thread_alive (ptid_t ptid)
 }
 
 static char *
-go32_pid_to_str (ptid_t ptid)
+go32_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
   xsnprintf (buf, sizeof buf, "Thread <main>");
Index: src/gdb/hpux-thread.c
===================================================================
--- src.orig/gdb/hpux-thread.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/hpux-thread.c	2009-02-06 22:08:20.000000000 +0000
@@ -191,7 +191,8 @@ hpux_thread_resume (ptid_t ptid, int ste
    to a LWP id, and vice versa on the way out.  */
 
 static ptid_t
-hpux_thread_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+hpux_thread_wait (struct target_ops *ops,
+		  ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   ptid_t rtnval;
   struct cleanup *old_chain;
@@ -203,7 +204,8 @@ hpux_thread_wait (ptid_t ptid, struct ta
   if (!ptid_equal (ptid, minus_one_ptid))
     ptid = main_ptid;
 
-  rtnval = deprecated_child_ops.to_wait (ptid, ourstatus);
+  rtnval = deprecated_child_ops.to_wait (&deprecated_child_ops,
+					 ptid, ourstatus);
 
   rtnval = find_active_thread ();
 
Index: src/gdb/inf-ttrace.c
===================================================================
--- src.orig/gdb/inf-ttrace.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/inf-ttrace.c	2009-02-06 22:08:20.000000000 +0000
@@ -915,7 +915,8 @@ inf_ttrace_resume (ptid_t ptid, int step
 }
 
 static ptid_t
-inf_ttrace_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+inf_ttrace_wait (struct target_ops *ops,
+		 ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   pid_t pid = ptid_get_pid (ptid);
   lwpid_t lwpid = ptid_get_lwp (ptid);
@@ -1252,7 +1253,7 @@ inf_ttrace_extra_thread_info (struct thr
 }
 
 static char *
-inf_ttrace_pid_to_str (ptid_t ptid)
+inf_ttrace_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   pid_t pid = ptid_get_pid (ptid);
   lwpid_t lwpid = ptid_get_lwp (ptid);
Index: src/gdb/monitor.c
===================================================================
--- src.orig/gdb/monitor.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/monitor.c	2009-02-06 22:08:20.000000000 +0000
@@ -1063,7 +1063,8 @@ monitor_wait_filter (char *buf,
    status just as `wait' would.  */
 
 static ptid_t
-monitor_wait (ptid_t ptid, struct target_waitstatus *status)
+monitor_wait (struct target_ops *ops,
+	      ptid_t ptid, struct target_waitstatus *status)
 {
   int old_timeout = timeout;
   char buf[TARGET_BUF_SIZE];
@@ -2244,7 +2245,7 @@ monitor_thread_alive (ptid_t ptid)
    buffer.  */
 
 static char *
-monitor_pid_to_str (ptid_t ptid)
+monitor_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
 
Index: src/gdb/nto-procfs.c
===================================================================
--- src.orig/gdb/nto-procfs.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/nto-procfs.c	2009-02-06 22:08:20.000000000 +0000
@@ -59,8 +59,6 @@ static void procfs_open (char *, int);
 
 static int procfs_can_run (void);
 
-static ptid_t procfs_wait (ptid_t, struct target_waitstatus *);
-
 static int procfs_xfer_memory (CORE_ADDR, gdb_byte *, int, int,
 			       struct mem_attrib *attrib,
 			       struct target_ops *);
@@ -626,7 +624,8 @@ nto_interrupt (int signo)
 }
 
 static ptid_t
-procfs_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+procfs_wait (struct target_ops *ops,
+	     ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   sigset_t set;
   siginfo_t info;
@@ -1265,7 +1264,7 @@ procfs_thread_info (pid_t pid, short tid
 }
 
 char *
-procfs_pid_to_str (ptid_t ptid)
+procfs_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[1024];
   int pid, tid, n;
Index: src/gdb/procfs.c
===================================================================
--- src.orig/gdb/procfs.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/procfs.c	2009-02-06 22:08:20.000000000 +0000
@@ -126,7 +126,8 @@ static void procfs_kill_inferior (void);
 static void procfs_mourn_inferior (struct target_ops *ops);
 static void procfs_create_inferior (struct target_ops *, char *, 
 				    char *, char **, int);
-static ptid_t procfs_wait (ptid_t, struct target_waitstatus *);
+static ptid_t procfs_wait (struct target_ops *,
+			   ptid_t, struct target_waitstatus *);
 static int procfs_xfer_memory (CORE_ADDR, gdb_byte *, int, int,
 			       struct mem_attrib *attrib,
 			       struct target_ops *);
@@ -139,7 +140,7 @@ static LONGEST procfs_xfer_partial (stru
 static int procfs_thread_alive (ptid_t);
 
 void procfs_find_new_threads (void);
-char *procfs_pid_to_str (ptid_t);
+char *procfs_pid_to_str (struct target_ops *, ptid_t);
 
 static int proc_find_memory_regions (int (*) (CORE_ADDR,
 					      unsigned long,
@@ -3969,7 +3970,8 @@ syscall_is_lwp_create (procinfo *pi, int
  */
 
 static ptid_t
-procfs_wait (ptid_t ptid, struct target_waitstatus *status)
+procfs_wait (struct target_ops *ops,
+	     ptid_t ptid, struct target_waitstatus *status)
 {
   /* First cut: loosely based on original version 2.1 */
   procinfo *pi;
@@ -5270,7 +5272,7 @@ procfs_thread_alive (ptid_t ptid)
 /* Convert PTID to a string.  Returns the string in a static buffer.  */
 
 char *
-procfs_pid_to_str (ptid_t ptid)
+procfs_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[80];
 
Index: src/gdb/remote-m32r-sdi.c
===================================================================
--- src.orig/gdb/remote-m32r-sdi.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/remote-m32r-sdi.c	2009-02-06 22:08:20.000000000 +0000
@@ -693,7 +693,8 @@ gdb_cntrl_c (int signo)
 }
 
 static ptid_t
-m32r_wait (ptid_t ptid, struct target_waitstatus *status)
+m32r_wait (struct target_ops *ops,
+	   ptid_t ptid, struct target_waitstatus *status)
 {
   static RETSIGTYPE (*prev_sigint) ();
   unsigned long bp_addr, pc_addr;
@@ -1507,7 +1508,7 @@ m32r_thread_alive (ptid_t ptid)
    buffer.  */
 
 static char *
-m32r_pid_to_str (ptid_t ptid)
+m32r_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
 
Index: src/gdb/remote-mips.c
===================================================================
--- src.orig/gdb/remote-mips.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/remote-mips.c	2009-02-06 22:08:20.000000000 +0000
@@ -89,9 +89,6 @@ static void mips_detach (struct target_o
 static void mips_resume (ptid_t ptid, int step,
                          enum target_signal siggnal);
 
-static ptid_t mips_wait (ptid_t ptid,
-                               struct target_waitstatus *status);
-
 static int mips_map_regno (struct gdbarch *, int);
 
 static void mips_fetch_registers (struct regcache *regcache, int regno);
@@ -1703,7 +1700,8 @@ mips_signal_from_protocol (int sig)
 /* Wait until the remote stops, and return a wait status.  */
 
 static ptid_t
-mips_wait (ptid_t ptid, struct target_waitstatus *status)
+mips_wait (struct target_ops *ops,
+	   ptid_t ptid, struct target_waitstatus *status)
 {
   int rstatus;
   int err;
Index: src/gdb/remote-sim.c
===================================================================
--- src.orig/gdb/remote-sim.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/remote-sim.c	2009-02-06 22:08:20.000000000 +0000
@@ -88,8 +88,6 @@ static void gdbsim_detach (struct target
 
 static void gdbsim_resume (ptid_t ptid, int step, enum target_signal siggnal);
 
-static ptid_t gdbsim_wait (ptid_t ptid, struct target_waitstatus *status);
-
 static void gdbsim_prepare_to_store (struct regcache *regcache);
 
 static void gdbsim_files_info (struct target_ops *target);
@@ -680,7 +678,8 @@ gdbsim_cntrl_c (int signo)
 }
 
 static ptid_t
-gdbsim_wait (ptid_t ptid, struct target_waitstatus *status)
+gdbsim_wait (struct target_ops *ops,
+	     ptid_t ptid, struct target_waitstatus *status)
 {
   static RETSIGTYPE (*prev_sigint) ();
   int sigrc = 0;
@@ -874,7 +873,7 @@ gdbsim_thread_alive (ptid_t ptid)
    buffer.  */
 
 static char *
-gdbsim_pid_to_str (ptid_t ptid)
+gdbsim_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
 
Index: src/gdb/remote.c
===================================================================
--- src.orig/gdb/remote.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/remote.c	2009-02-06 22:08:20.000000000 +0000
@@ -117,9 +117,6 @@ static void remote_send (char **buf, lon
 
 static int readchar (int timeout);
 
-static ptid_t remote_wait (ptid_t ptid,
-			   struct target_waitstatus *status);
-
 static void remote_kill (void);
 
 static int tohex (int nib);
@@ -4733,7 +4730,8 @@ remote_wait_as (ptid_t ptid, struct targ
    STATUS just as `wait' would.  */
 
 static ptid_t
-remote_wait (ptid_t ptid, struct target_waitstatus *status)
+remote_wait (struct target_ops *ops,
+	     ptid_t ptid, struct target_waitstatus *status)
 {
   ptid_t event_ptid;
 
@@ -7769,7 +7767,7 @@ Fetch and print the remote list of threa
    buffer.  */
 
 static char *
-remote_pid_to_str (ptid_t ptid)
+remote_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
   struct remote_state *rs = get_remote_state ();
@@ -7800,7 +7798,8 @@ remote_pid_to_str (ptid_t ptid)
    stored at OFFSET within the thread local storage for thread PTID.  */
 
 static CORE_ADDR
-remote_get_thread_local_address (ptid_t ptid, CORE_ADDR lm, CORE_ADDR offset)
+remote_get_thread_local_address (struct target_ops *ops,
+				 ptid_t ptid, CORE_ADDR lm, CORE_ADDR offset)
 {
   if (remote_protocol_packets[PACKET_qGetTLSAddr].support != PACKET_DISABLE)
     {
Index: src/gdb/rs6000-nat.c
===================================================================
--- src.orig/gdb/rs6000-nat.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/rs6000-nat.c	2009-02-06 22:08:20.000000000 +0000
@@ -517,7 +517,8 @@ rs6000_xfer_partial (struct target_ops *
    the status in *OURSTATUS.  */
 
 static ptid_t
-rs6000_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+rs6000_wait (struct target_ops *ops,
+	     ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   pid_t pid;
   int status, save_errno;
Index: src/gdb/sol-thread.c
===================================================================
--- src.orig/gdb/sol-thread.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/sol-thread.c	2009-02-06 22:08:20.000000000 +0000
@@ -80,7 +80,7 @@ struct target_ops sol_core_ops;
 extern int procfs_suppress_run;
 extern struct target_ops procfs_ops;	/* target vector for procfs.c */
 extern struct target_ops core_ops;	/* target vector for corelow.c */
-extern char *procfs_pid_to_str (ptid_t ptid);
+extern char *procfs_pid_to_str (struct target_ops *ops, ptid_t ptid);
 
 /* Prototypes for supply_gregset etc. */
 #include "gregset.h"
@@ -424,7 +424,8 @@ sol_thread_resume (ptid_t ptid, int step
    thread ID to an LWP ID, and vice versa on the way out.  */
 
 static ptid_t
-sol_thread_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+sol_thread_wait (struct target_ops *ops,
+		 ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   ptid_t rtnval;
   ptid_t save_ptid;
@@ -449,7 +450,7 @@ sol_thread_wait (ptid_t ptid, struct tar
 		 GET_THREAD (save_ptid));
     }
 
-  rtnval = procfs_ops.to_wait (ptid, ourstatus);
+  rtnval = procfs_ops.to_wait (&procfs_ops, ptid, ourstatus);
 
   if (ourstatus->kind != TARGET_WAITKIND_EXITED)
     {
@@ -1323,13 +1324,13 @@ ps_lgetLDT (gdb_ps_prochandle_t ph, lwpi
 /* Convert PTID to printable form.  */
 
 char *
-solaris_pid_to_str (ptid_t ptid)
+solaris_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[100];
 
   /* In case init failed to resolve the libthread_db library.  */
   if (!procfs_suppress_run)
-    return procfs_pid_to_str (ptid);
+    return procfs_pid_to_str (&procfs_ops, ptid);
 
   if (is_thread (ptid))
     {
Index: src/gdb/spu-linux-nat.c
===================================================================
--- src.orig/gdb/spu-linux-nat.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/spu-linux-nat.c	2009-02-06 22:08:20.000000000 +0000
@@ -404,7 +404,8 @@ spu_child_post_attach (int pid)
 /* Wait for child PTID to do something.  Return id of the child,
    minus_one_ptid in case of error; store status into *OURSTATUS.  */
 static ptid_t
-spu_child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+spu_child_wait (struct target_ops *ops,
+		ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   int save_errno;
   int status;
Index: src/gdb/windows-nat.c
===================================================================
--- src.orig/gdb/windows-nat.c	2009-02-06 22:03:15.000000000 +0000
+++ src/gdb/windows-nat.c	2009-02-06 22:08:20.000000000 +0000
@@ -1444,7 +1444,8 @@ out:
 
 /* Wait for interesting events to occur in the target process.  */
 static ptid_t
-windows_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
+windows_wait (struct target_ops *ops,
+	      ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   int pid = -1;
 
@@ -2017,7 +2018,7 @@ windows_close (int x)
 
 /* Convert pid to printable format. */
 static char *
-windows_pid_to_str (ptid_t ptid)
+windows_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[80];
 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Get rid of linux-thread-db.c:target_beneath
  2009-02-06 15:50   ` Pedro Alves
@ 2009-02-08 13:15     ` teawater
  0 siblings, 0 replies; 5+ messages in thread
From: teawater @ 2009-02-08 13:15 UTC (permalink / raw)
  To: Pedro Alves; +Cc: gdb-patches

Hi Pedro,

On Fri, Feb 6, 2009 at 23:50, Pedro Alves <pedro@codesourcery.com> wrote:
> On Friday 06 February 2009 04:56:58, teawater wrote:
>> But we still meet the problem that if a function of beneath target is
>> NULL, current target use find_target_beneath to get the beneath
>> function pointer is not easy and dangerous like process record meet,
>> right?
>
> linux-thread-db.c always sits on top of linux-nat.c currently, so
> it is safe to use in the cases I adjusted.  When it isn't "safe",
> linux-thread-db.c already checks for NULL-ness.
>
>> What about make a interface to support safe beneath function?
>
> For now, you can check that the function pointer is NULL before
> calling it.  If it is NULL, then try the next target
> beneath, etc.  See target_attach, target_flash_erase, etc.  You
> could do something similar in the record.c target.  Things
> are cleaner on the target method implementation side
> if the target method takes a "this" pointer, like the one I'm
> adding to target_wait.
>
> If you do that, you get rid of the record_beneath_to_resume,
> record_beneath_to_wait, record_beneath_to_store_registers, etc.
> function pointer hacks you had.  The wrinkle that has, is that your
> method ends up responsible for doing the default if no target
> implements the method.  IMO, that would acceptible for
> now.  But, it can be fixed.
>

I see.

So I make a new patch for it.  Could you please help me review it?
http://sourceware.org/ml/gdb-patches/2009-02/msg00187.html
http://sourceware.org/ml/gdb-patches/2009-02/msg00188.html

And I make some new patches to fix the format errors.  Please help me review it.
http://sourceware.org/ml/gdb-patches/2009-02/msg00189.html
http://sourceware.org/ml/gdb-patches/2009-02/msg00190.html
http://sourceware.org/ml/gdb-patches/2009-02/msg00192.html

Thanks,
Hui


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-02-08 13:15 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-06  3:05 Get rid of linux-thread-db.c:target_beneath Pedro Alves
2009-02-06  4:57 ` teawater
2009-02-06 15:50   ` Pedro Alves
2009-02-08 13:15     ` teawater
2009-02-06 22:23 ` Pedro Alves

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox