public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 1/4] target_stack -> current_top_target() throughout
  2018-05-28 16:10 [PATCH 0/4] Change target stack representation Pedro Alves
@ 2018-05-28 16:10 ` Pedro Alves
  2018-05-29  3:13   ` Tom Tromey
  2018-05-28 16:19 ` [PATCH 2/4] target_ops::beneath -> target_ops::beneath() Pedro Alves
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: Pedro Alves @ 2018-05-28 16:10 UTC (permalink / raw)
  To: gdb-patches

The recent C++ification of target_ops replaced references to the old
"current_target" squashed target throughout with references to a
"target_stack" pointer.  I had picked the "target_stack" name very
early in the multi-target work, and managed to stick with it, even
though it's a bit of a misnomer, since it isn't really a "target
stack" object, but a pointer into the current top target in the stack.
As I'm splitting more pieces off of the multi-target branch, I've come
to think that it's better to rename it now.  A following patch will
introduce a new class to represent a target stack, and "target_stack"
would be _its_ ideal name.  (In the branch, the class is called
a_target_stack to work around the clash.)

Thus this commit renames target_target to current_top_target and
replaces all references throughout.  Also, while at it,
current_top_target is made a function instead of a pointer, to make it
possible to change its internal implementation without leaking
implementation details out.  In a couple patches, the implementation
of the function will change to refer to a target stack object, and
then further down the multi-target work, it'll change again to find
the right target stack for the current inferior.

gdb/ChangeLog:
yyyy-mm-dd  Pedro Alves  <palves@redhat.com>

	* target.h (target_stack): Delete.
	(current_top_target): Declare function.
	* target.c (target_stack): Delete.
	(g_current_top_target): New.
	(current_top_target): New function.
	* auxv.c: Use current_top_target instead of target_stack
	throughout.
	* avr-tdep.c: Likewise.
	* breakpoint.c: Likewise.
	* corefile.c: Likewise.
	* elfread.c: Likewise.
	* eval.c: Likewise.
	* exceptions.c: Likewise.
	* frame.c: Likewise.
	* gdbarch-selftests.c: Likewise.
	* gnu-v3-abi.c: Likewise.
	* ia64-tdep.c: Likewise.
	* ia64-vms-tdep.c: Likewise.
	* infcall.c: Likewise.
	* infcmd.c: Likewise.
	* infrun.c: Likewise.
	* linespec.c: Likewise.
	* linux-tdep.c: Likewise.
	* minsyms.c: Likewise.
	* ppc-linux-nat.c: Likewise.
	* ppc-linux-tdep.c: Likewise.
	* procfs.c: Likewise.
	* regcache.c: Likewise.
	* remote.c: Likewise.
	* rs6000-tdep.c: Likewise.
	* s390-linux-nat.c: Likewise.
	* s390-tdep.c: Likewise.
	* solib-aix.c: Likewise.
	* solib-darwin.c: Likewise.
	* solib-dsbt.c: Likewise.
	* solib-spu.c: Likewise.
	* solib-svr4.c: Likewise.
	* solib-target.c: Likewise.
	* sparc-tdep.c: Likewise.
	* sparc64-tdep.c: Likewise.
	* spu-tdep.c: Likewise.
	* symfile.c: Likewise.
	* symtab.c: Likewise.
	* target-descriptions.c: Likewise.
	* target-memory.c: Likewise.
	* target.c: Likewise.
	* target.h: Likewise.
	* tracefile-tfile.c: Likewise.
	* tracepoint.c: Likewise.
	* valops.c: Likewise.
	* valprint.c: Likewise.
	* value.c: Likewise.
	* windows-tdep.c: Likewise.
	* mi/mi-main.c: Likewise.
---
 gdb/auxv.c                |   4 +-
 gdb/avr-tdep.c            |   4 +-
 gdb/breakpoint.c          |   7 +-
 gdb/corefile.c            |   2 +-
 gdb/elfread.c             |   9 +-
 gdb/eval.c                |   2 +-
 gdb/exceptions.c          |   2 +-
 gdb/frame.c               |   2 +-
 gdb/gdbarch-selftests.c   |   2 +-
 gdb/gnu-v3-abi.c          |   2 +-
 gdb/ia64-tdep.c           |   2 +-
 gdb/ia64-vms-tdep.c       |   2 +-
 gdb/infcall.c             |   7 +-
 gdb/infcmd.c              |  18 ++--
 gdb/infrun.c              |  12 +--
 gdb/linespec.c            |   2 +-
 gdb/linux-tdep.c          |  19 ++--
 gdb/mi/mi-main.c          |   8 +-
 gdb/minsyms.c             |   5 +-
 gdb/ppc-linux-nat.c       |   2 +-
 gdb/ppc-linux-tdep.c      |   4 +-
 gdb/procfs.c              |   2 +-
 gdb/regcache.c            |   4 +-
 gdb/remote.c              |  12 +--
 gdb/rs6000-tdep.c         |   2 +-
 gdb/s390-linux-nat.c      |   2 +-
 gdb/s390-tdep.c           |   2 +-
 gdb/solib-aix.c           |   2 +-
 gdb/solib-darwin.c        |   4 +-
 gdb/solib-dsbt.c          |   4 +-
 gdb/solib-spu.c           |   6 +-
 gdb/solib-svr4.c          |  23 ++---
 gdb/solib-target.c        |   3 +-
 gdb/sparc-tdep.c          |   2 +-
 gdb/sparc64-tdep.c        |   4 +-
 gdb/spu-tdep.c            |  32 +++----
 gdb/symfile.c             |   2 +-
 gdb/symtab.c              |   7 +-
 gdb/target-descriptions.c |   4 +-
 gdb/target-memory.c       |   4 +-
 gdb/target.c              | 214 ++++++++++++++++++++++++----------------------
 gdb/target.h              | 160 +++++++++++++++++-----------------
 gdb/tracefile-tfile.c     |   2 +-
 gdb/tracepoint.c          |   2 +-
 gdb/valops.c              |   4 +-
 gdb/valprint.c            |   2 +-
 gdb/value.c               |   2 +-
 gdb/windows-tdep.c        |   2 +-
 48 files changed, 321 insertions(+), 305 deletions(-)

diff --git a/gdb/auxv.c b/gdb/auxv.c
index 86a1ba88a6..2afa136efe 100644
--- a/gdb/auxv.c
+++ b/gdb/auxv.c
@@ -291,7 +291,7 @@ target_auxv_parse (gdb_byte **readptr,
   if (gdbarch_auxv_parse_p (gdbarch))
     return gdbarch_auxv_parse (gdbarch, readptr, endptr, typep, valp);
 
-  return target_stack->auxv_parse (readptr, endptr, typep, valp);
+  return current_top_target ()->auxv_parse (readptr, endptr, typep, valp);
 }
 
 
@@ -549,7 +549,7 @@ info_auxv_command (const char *cmd, int from_tty)
     error (_("The program has no auxiliary information now."));
   else
     {
-      int ents = fprint_target_auxv (gdb_stdout, target_stack);
+      int ents = fprint_target_auxv (gdb_stdout, current_top_target ());
 
       if (ents < 0)
 	error (_("No auxiliary vector found, or failed reading it."));
diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c
index 5aa61ba2d9..74602c13ec 100644
--- a/gdb/avr-tdep.c
+++ b/gdb/avr-tdep.c
@@ -1555,7 +1555,7 @@ avr_io_reg_read_command (const char *args, int from_tty)
 
   /* Find out how many io registers the target has.  */
   gdb::optional<gdb::byte_vector> buf
-    = target_read_alloc (target_stack, TARGET_OBJECT_AVR, "avr.io_reg");
+    = target_read_alloc (current_top_target (), TARGET_OBJECT_AVR, "avr.io_reg");
 
   if (!buf)
     {
@@ -1589,7 +1589,7 @@ avr_io_reg_read_command (const char *args, int from_tty)
         j = nreg - i;           /* last block is less than 8 registers */
 
       snprintf (query, sizeof (query) - 1, "avr.io_reg:%x,%x", i, j);
-      buf = target_read_alloc (target_stack, TARGET_OBJECT_AVR, query);
+      buf = target_read_alloc (current_top_target (), TARGET_OBJECT_AVR, query);
 
       if (!buf)
         {
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 721afd2c04..4fbf118ecd 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -3489,7 +3489,8 @@ create_exception_master_breakpoint (void)
 	}
 
       addr = BMSYMBOL_VALUE_ADDRESS (bp_objfile_data->exception_msym);
-      addr = gdbarch_convert_from_func_ptr_addr (gdbarch, addr, target_stack);
+      addr = gdbarch_convert_from_func_ptr_addr (gdbarch, addr,
+						 current_top_target ());
       b = create_internal_breakpoint (gdbarch, addr, bp_exception_master,
 				      &internal_breakpoint_ops);
       initialize_explicit_location (&explicit_loc);
@@ -4748,7 +4749,7 @@ watchpoints_triggered (struct target_waitstatus *ws)
       return 0;
     }
 
-  if (!target_stopped_data_address (target_stack, &addr))
+  if (!target_stopped_data_address (current_top_target (), &addr))
     {
       /* We were stopped by a watchpoint, but we don't know where.
 	 Mark all watchpoints as unknown.  */
@@ -4788,7 +4789,7 @@ watchpoints_triggered (struct target_waitstatus *ws)
 		  }
 	      }
 	    /* Exact match not required.  Within range is sufficient.  */
-	    else if (target_watchpoint_addr_within_range (target_stack,
+	    else if (target_watchpoint_addr_within_range (current_top_target (),
 							 addr, loc->address,
 							 loc->length))
 	      {
diff --git a/gdb/corefile.c b/gdb/corefile.c
index 5f66ead897..0e348938fa 100644
--- a/gdb/corefile.c
+++ b/gdb/corefile.c
@@ -214,7 +214,7 @@ read_memory_object (enum target_object object, CORE_ADDR memaddr,
       enum target_xfer_status status;
       ULONGEST xfered_len;
 
-      status = target_xfer_partial (target_stack, object, NULL,
+      status = target_xfer_partial (current_top_target (), object, NULL,
 				    myaddr + xfered, NULL,
 				    memaddr + xfered, len - xfered,
 				    &xfered_len);
diff --git a/gdb/elfread.c b/gdb/elfread.c
index b4b4a1b24c..c253b5a039 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -836,7 +836,8 @@ elf_gnu_ifunc_resolve_by_got (const char *name, CORE_ADDR *addr_p)
       if (target_read_memory (pointer_address, buf, ptr_size) != 0)
 	continue;
       addr = extract_typed_address (buf, ptr_type);
-      addr = gdbarch_convert_from_func_ptr_addr (gdbarch, addr, target_stack);
+      addr = gdbarch_convert_from_func_ptr_addr (gdbarch, addr,
+						 current_top_target ());
       addr = gdbarch_addr_bits_remove (gdbarch, addr);
 
       if (elf_gnu_ifunc_record_cache (name, addr))
@@ -903,12 +904,12 @@ elf_gnu_ifunc_resolve_addr (struct gdbarch *gdbarch, CORE_ADDR pc)
      parameter.  FUNCTION is the function entry address.  ADDRESS may be a
      function descriptor.  */
 
-  target_auxv_search (target_stack, AT_HWCAP, &hwcap);
+  target_auxv_search (current_top_target (), AT_HWCAP, &hwcap);
   hwcap_val = value_from_longest (builtin_type (gdbarch)
 				  ->builtin_unsigned_long, hwcap);
   address_val = call_function_by_hand (function, NULL, 1, &hwcap_val);
   address = value_as_address (address_val);
-  address = gdbarch_convert_from_func_ptr_addr (gdbarch, address, target_stack);
+  address = gdbarch_convert_from_func_ptr_addr (gdbarch, address, current_top_target ());
   address = gdbarch_addr_bits_remove (gdbarch, address);
 
   if (name_at_pc)
@@ -1015,7 +1016,7 @@ elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b)
   resolved_address = value_as_address (value);
   resolved_pc = gdbarch_convert_from_func_ptr_addr (gdbarch,
 						    resolved_address,
-						    target_stack);
+						    current_top_target ());
   resolved_pc = gdbarch_addr_bits_remove (gdbarch, resolved_pc);
 
   gdb_assert (current_program_space == b->pspace || b->pspace == NULL);
diff --git a/gdb/eval.c b/gdb/eval.c
index 5bd6e2cbfe..4b90d2f6b7 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -1748,7 +1748,7 @@ evaluate_subexp_standard (struct type *expect_type,
 	    /* The address might point to a function descriptor;
 	       resolve it to the actual code address instead.  */
 	    addr = gdbarch_convert_from_func_ptr_addr (exp->gdbarch, addr,
-						       target_stack);
+						       current_top_target ());
 
 	    /* Is it a high_level symbol?  */
 	    sym = find_pc_function (addr);
diff --git a/gdb/exceptions.c b/gdb/exceptions.c
index 5abbaf2137..54aab704b7 100644
--- a/gdb/exceptions.c
+++ b/gdb/exceptions.c
@@ -43,7 +43,7 @@ print_flush (void)
      stack, the NULL check is needed here because we can get here very
      early during startup, before the target stack is first
      initialized.  */
-  if (target_stack != NULL && target_supports_terminal_ours ())
+  if (current_top_target () != NULL && target_supports_terminal_ours ())
     {
       term_state.emplace ();
       target_terminal::ours_for_output ();
diff --git a/gdb/frame.c b/gdb/frame.c
index c0f6e64dfc..9d4546edcf 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -2222,7 +2222,7 @@ inside_main_func (struct frame_info *this_frame)
      returned.  */
   maddr = gdbarch_convert_from_func_ptr_addr (get_frame_arch (this_frame),
 					      BMSYMBOL_VALUE_ADDRESS (msymbol),
-					      target_stack);
+					      current_top_target ());
   return maddr == get_frame_func (this_frame);
 }
 
diff --git a/gdb/gdbarch-selftests.c b/gdb/gdbarch-selftests.c
index 23afe3d75e..73a31244b4 100644
--- a/gdb/gdbarch-selftests.c
+++ b/gdb/gdbarch-selftests.c
@@ -71,7 +71,7 @@ register_to_value_test (struct gdbarch *gdbarch)
 
   /* Error out if debugging something, because we're going to push the
      test target, which would pop any existing target.  */
-  if (target_stack->to_stratum >= process_stratum)
+  if (current_top_target ()->to_stratum >= process_stratum)
    error (_("target already pushed"));
 
   /* Create a mock environment.  An inferior with a thread, with a
diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c
index ddbec13891..3cef80c1ec 100644
--- a/gdb/gnu-v3-abi.c
+++ b/gdb/gnu-v3-abi.c
@@ -1217,7 +1217,7 @@ gnuv3_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
      of the real function from the function descriptor before passing on
      the address to other layers of GDB.  */
   func_addr = gdbarch_convert_from_func_ptr_addr (gdbarch, method_stop_pc,
-						  target_stack);
+						  current_top_target ());
   if (func_addr != 0)
     method_stop_pc = func_addr;
 
diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index 26e112e7bc..bf10eae92e 100644
--- a/gdb/ia64-tdep.c
+++ b/gdb/ia64-tdep.c
@@ -2660,7 +2660,7 @@ getunwind_table (gdb_byte **buf_p)
      we should find a way to override the corefile layer's
      xfer_partial method.  */
 
-  x = target_read_alloc (target_stack, TARGET_OBJECT_UNWIND_TABLE,
+  x = target_read_alloc (current_top_target (), TARGET_OBJECT_UNWIND_TABLE,
 			 NULL, buf_p);
 
   return x;
diff --git a/gdb/ia64-vms-tdep.c b/gdb/ia64-vms-tdep.c
index 9b78576608..e2d40e2079 100644
--- a/gdb/ia64-vms-tdep.c
+++ b/gdb/ia64-vms-tdep.c
@@ -42,7 +42,7 @@ ia64_vms_find_proc_info_x (unw_addr_space_t as, unw_word_t ip,
   CORE_ADDR table_addr;
   unsigned int info_len;
 
-  res = target_read (target_stack, TARGET_OBJECT_OPENVMS_UIB,
+  res = target_read (current_top_target (), TARGET_OBJECT_OPENVMS_UIB,
                      annex + 2, buf, 0, sizeof (buf));
 
   if (res != sizeof (buf))
diff --git a/gdb/infcall.c b/gdb/infcall.c
index b13f5b61d9..c20ab6f877 100644
--- a/gdb/infcall.c
+++ b/gdb/infcall.c
@@ -256,7 +256,7 @@ find_function_addr (struct value *function,
       if (TYPE_CODE (ftype) == TYPE_CODE_FUNC
 	  || TYPE_CODE (ftype) == TYPE_CODE_METHOD)
 	funaddr = gdbarch_convert_from_func_ptr_addr (gdbarch, funaddr,
-						      target_stack);
+						      current_top_target ());
     }
   if (TYPE_CODE (ftype) == TYPE_CODE_FUNC
       || TYPE_CODE (ftype) == TYPE_CODE_METHOD)
@@ -307,8 +307,9 @@ find_function_addr (struct value *function,
 
 	      funaddr = value_as_address (value_addr (function));
 	      nfunaddr = funaddr;
-	      funaddr = gdbarch_convert_from_func_ptr_addr (gdbarch, funaddr,
-							    target_stack);
+	      funaddr
+		= gdbarch_convert_from_func_ptr_addr (gdbarch, funaddr,
+						      current_top_target ());
 	      if (funaddr != nfunaddr)
 		found_descriptor = 1;
 	    }
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index af3fa5fd1a..b3f0238eba 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -660,7 +660,7 @@ run_command_1 (const char *args, int from_tty, enum run_how run_how)
 
   /* Pass zero for FROM_TTY, because at this point the "run" command
      has done its thing; now we are setting up the running program.  */
-  post_create_inferior (target_stack, 0);
+  post_create_inferior (current_top_target (), 0);
 
   /* Queue a pending event so that the program stops immediately.  */
   if (run_how == RUN_STOP_AT_FIRST_INSN)
@@ -896,7 +896,7 @@ continue_command (const char *args, int from_tty)
       ensure_not_running ();
     }
 
-  prepare_execution_command (target_stack, async_exec);
+  prepare_execution_command (current_top_target (), async_exec);
 
   if (from_tty)
     printf_filtered (_("Continuing.\n"));
@@ -1043,7 +1043,7 @@ step_1 (int skip_subroutines, int single_inst, const char *count_string)
     = strip_bg_char (count_string, &async_exec);
   count_string = stripped.get ();
 
-  prepare_execution_command (target_stack, async_exec);
+  prepare_execution_command (current_top_target (), async_exec);
 
   count = count_string ? parse_and_eval_long (count_string) : 1;
 
@@ -1232,7 +1232,7 @@ jump_command (const char *arg, int from_tty)
   gdb::unique_xmalloc_ptr<char> stripped = strip_bg_char (arg, &async_exec);
   arg = stripped.get ();
 
-  prepare_execution_command (target_stack, async_exec);
+  prepare_execution_command (current_top_target (), async_exec);
 
   if (!arg)
     error_no_arg (_("starting address"));
@@ -1312,7 +1312,7 @@ signal_command (const char *signum_exp, int from_tty)
     = strip_bg_char (signum_exp, &async_exec);
   signum_exp = stripped.get ();
 
-  prepare_execution_command (target_stack, async_exec);
+  prepare_execution_command (current_top_target (), async_exec);
 
   if (!signum_exp)
     error_no_arg (_("signal number"));
@@ -1585,7 +1585,7 @@ until_command (const char *arg, int from_tty)
   gdb::unique_xmalloc_ptr<char> stripped = strip_bg_char (arg, &async_exec);
   arg = stripped.get ();
 
-  prepare_execution_command (target_stack, async_exec);
+  prepare_execution_command (current_top_target (), async_exec);
 
   if (arg)
     until_break_command (arg, from_tty, 0);
@@ -1610,7 +1610,7 @@ advance_command (const char *arg, int from_tty)
   gdb::unique_xmalloc_ptr<char> stripped = strip_bg_char (arg, &async_exec);
   arg = stripped.get ();
 
-  prepare_execution_command (target_stack, async_exec);
+  prepare_execution_command (current_top_target (), async_exec);
 
   until_break_command (arg, from_tty, 1);
 }
@@ -1990,7 +1990,7 @@ finish_command (const char *arg, int from_tty)
   gdb::unique_xmalloc_ptr<char> stripped = strip_bg_char (arg, &async_exec);
   arg = stripped.get ();
 
-  prepare_execution_command (target_stack, async_exec);
+  prepare_execution_command (current_top_target (), async_exec);
 
   if (arg)
     error (_("The \"finish\" command does not take any arguments."));
@@ -2686,7 +2686,7 @@ setup_inferior (int from_tty)
   /* Take any necessary post-attaching actions for this platform.  */
   target_post_attach (ptid_get_pid (inferior_ptid));
 
-  post_create_inferior (target_stack, from_tty);
+  post_create_inferior (current_top_target (), from_tty);
 }
 
 /* What to do after the first program stops after attaching.  */
diff --git a/gdb/infrun.c b/gdb/infrun.c
index df19478ef3..94a88c13d7 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -3240,7 +3240,7 @@ start_remote (int from_tty)
   /* Now that the inferior has stopped, do any bookkeeping like
      loading shared libraries.  We want to do this before normal_stop,
      so that the displayed frame is up to date.  */
-  post_create_inferior (target_stack, from_tty);
+  post_create_inferior (current_top_target (), from_tty);
 
   normal_stop ();
 }
@@ -5697,7 +5697,7 @@ handle_signal_stop (struct execution_control_state *ecs)
 
 	  fprintf_unfiltered (gdb_stdlog, "infrun: stopped by watchpoint\n");
 
-	  if (target_stopped_data_address (target_stack, &addr))
+	  if (target_stopped_data_address (current_top_target (), &addr))
             fprintf_unfiltered (gdb_stdlog,
                                 "infrun: stopped data address = %s\n",
                                 paddress (gdbarch, addr));
@@ -8744,7 +8744,7 @@ siginfo_value_read (struct value *v)
   validate_registers_access ();
 
   transferred =
-    target_read (target_stack, TARGET_OBJECT_SIGNAL_INFO,
+    target_read (current_top_target (), TARGET_OBJECT_SIGNAL_INFO,
 		 NULL,
 		 value_contents_all_raw (v),
 		 value_offset (v),
@@ -8766,7 +8766,7 @@ siginfo_value_write (struct value *v, struct value *fromval)
      vice versa.  */
   validate_registers_access ();
 
-  transferred = target_write (target_stack,
+  transferred = target_write (current_top_target (),
 			      TARGET_OBJECT_SIGNAL_INFO,
 			      NULL,
 			      value_contents_all_raw (fromval),
@@ -8845,7 +8845,7 @@ save_infcall_suspend_state (void)
       siginfo_data = (gdb_byte *) xmalloc (len);
       back_to = make_cleanup (xfree, siginfo_data);
 
-      if (target_read (target_stack, TARGET_OBJECT_SIGNAL_INFO, NULL,
+      if (target_read (current_top_target (), TARGET_OBJECT_SIGNAL_INFO, NULL,
 		       siginfo_data, 0, len) == len)
 	discard_cleanups (back_to);
       else
@@ -8895,7 +8895,7 @@ restore_infcall_suspend_state (struct infcall_suspend_state *inf_state)
       struct type *type = gdbarch_get_siginfo_type (gdbarch);
 
       /* Errors ignored.  */
-      target_write (target_stack, TARGET_OBJECT_SIGNAL_INFO, NULL,
+      target_write (current_top_target (), TARGET_OBJECT_SIGNAL_INFO, NULL,
 		    inf_state->siginfo_data, 0, TYPE_LENGTH (type));
     }
 
diff --git a/gdb/linespec.c b/gdb/linespec.c
index 835650750c..763f4ed4a5 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -2303,7 +2303,7 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls)
 				= (gdbarch_convert_from_func_ptr_addr
 				   (gdbarch,
 				    msym_addr,
-				    target_stack));
+				    current_top_target ()));
 			    }
 
 			  if (msym_addr == addr)
diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c
index 4d3919df31..5a40a6802a 100644
--- a/gdb/linux-tdep.c
+++ b/gdb/linux-tdep.c
@@ -402,8 +402,8 @@ linux_is_uclinux (void)
 {
   CORE_ADDR dummy;
 
-  return (target_auxv_search (target_stack, AT_NULL, &dummy) > 0
-	  && target_auxv_search (target_stack, AT_PAGESZ, &dummy) == 0);
+  return (target_auxv_search (current_top_target (), AT_NULL, &dummy) > 0
+	  && target_auxv_search (current_top_target (), AT_PAGESZ, &dummy) == 0);
 }
 
 static int
@@ -1423,7 +1423,8 @@ linux_spu_make_corefile_notes (bfd *obfd, char *note_data, int *note_size)
 
   /* Determine list of SPU ids.  */
   gdb::optional<gdb::byte_vector>
-    spu_ids = target_read_alloc (target_stack, TARGET_OBJECT_SPU, NULL);
+    spu_ids = target_read_alloc (current_top_target (),
+				 TARGET_OBJECT_SPU, NULL);
 
   if (!spu_ids)
     return note_data;
@@ -1439,7 +1440,7 @@ linux_spu_make_corefile_notes (bfd *obfd, char *note_data, int *note_size)
 
 	  xsnprintf (annex, sizeof annex, "%d/%s", fd, spu_files[j]);
 	  gdb::optional<gdb::byte_vector> spu_data
-	    = target_read_alloc (target_stack, TARGET_OBJECT_SPU, annex);
+	    = target_read_alloc (current_top_target (), TARGET_OBJECT_SPU, annex);
 
 	  if (spu_data && !spu_data->empty ())
 	    {
@@ -1661,7 +1662,7 @@ linux_get_siginfo_data (thread_info *thread, struct gdbarch *gdbarch)
 
   gdb::byte_vector buf (TYPE_LENGTH (siginfo_type));
 
-  bytes_read = target_read (target_stack, TARGET_OBJECT_SIGNAL_INFO, NULL,
+  bytes_read = target_read (current_top_target (), TARGET_OBJECT_SIGNAL_INFO, NULL,
 			    buf.data (), 0, TYPE_LENGTH (siginfo_type));
   if (bytes_read != TYPE_LENGTH (siginfo_type))
     buf.clear ();
@@ -1970,7 +1971,7 @@ linux_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
 
   /* Auxillary vector.  */
   gdb::optional<gdb::byte_vector> auxv =
-    target_read_alloc (target_stack, TARGET_OBJECT_AUXV, NULL);
+    target_read_alloc (current_top_target (), TARGET_OBJECT_AUXV, NULL);
   if (auxv && !auxv->empty ())
     {
       note_data = elfcore_write_note (obfd, note_data, note_size,
@@ -2253,7 +2254,7 @@ linux_vsyscall_range_raw (struct gdbarch *gdbarch, struct mem_range *range)
   char filename[100];
   long pid;
 
-  if (target_auxv_search (target_stack, AT_SYSINFO_EHDR, &range->start) <= 0)
+  if (target_auxv_search (current_top_target (), AT_SYSINFO_EHDR, &range->start) <= 0)
     return 0;
 
   /* It doesn't make sense to access the host's /proc when debugging a
@@ -2443,14 +2444,14 @@ linux_displaced_step_location (struct gdbarch *gdbarch)
      local-store address and is thus not usable as displaced stepping
      location.  The auxiliary vector gets us the PowerPC-side entry
      point address instead.  */
-  if (target_auxv_search (target_stack, AT_ENTRY, &addr) <= 0)
+  if (target_auxv_search (current_top_target (), AT_ENTRY, &addr) <= 0)
     throw_error (NOT_SUPPORTED_ERROR,
 		 _("Cannot find AT_ENTRY auxiliary vector entry."));
 
   /* Make certain that the address points at real code, and not a
      function descriptor.  */
   addr = gdbarch_convert_from_func_ptr_addr (gdbarch, addr,
-					     target_stack);
+					     current_top_target ());
 
   /* Inferior calls also use the entry point as a breakpoint location.
      We don't want displaced stepping to interfere with those
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index 76e783daf9..14b3e6853a 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -266,7 +266,7 @@ proceed_thread_callback (struct thread_info *thread, void *arg)
 static void
 exec_continue (char **argv, int argc)
 {
-  prepare_execution_command (target_stack, mi_async_p ());
+  prepare_execution_command (current_top_target (), mi_async_p ());
 
   if (non_stop)
     {
@@ -1353,8 +1353,8 @@ mi_cmd_data_read_memory (const char *command, char **argv, int argc)
 
   gdb::byte_vector mbuf (total_bytes);
 
-  nr_bytes = target_read (target_stack, TARGET_OBJECT_MEMORY, NULL, mbuf.data (),
-			  addr, total_bytes);
+  nr_bytes = target_read (current_top_target (), TARGET_OBJECT_MEMORY, NULL,
+			  mbuf.data (), addr, total_bytes);
   if (nr_bytes <= 0)
     error (_("Unable to read memory."));
 
@@ -1473,7 +1473,7 @@ mi_cmd_data_read_memory_bytes (const char *command, char **argv, int argc)
   length = atol (argv[1]);
 
   std::vector<memory_read_result> result
-    = read_memory_robust (target_stack, addr, length);
+    = read_memory_robust (current_top_target (), addr, length);
 
   if (result.size () == 0)
     error (_("Unable to read memory."));
diff --git a/gdb/minsyms.c b/gdb/minsyms.c
index b98f121d5f..46d6d09153 100644
--- a/gdb/minsyms.c
+++ b/gdb/minsyms.c
@@ -73,8 +73,9 @@ msymbol_is_function (struct objfile *objfile, minimal_symbol *minsym,
     case mst_data_gnu_ifunc:
       {
 	struct gdbarch *gdbarch = get_objfile_arch (objfile);
-	CORE_ADDR pc = gdbarch_convert_from_func_ptr_addr (gdbarch, msym_addr,
-							   target_stack);
+	CORE_ADDR pc
+	  = gdbarch_convert_from_func_ptr_addr (gdbarch, msym_addr,
+						current_top_target ());
 	if (pc != msym_addr)
 	  {
 	    if (func_address_p != NULL)
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
index eb21f91c13..a5984dfba3 100644
--- a/gdb/ppc-linux-nat.c
+++ b/gdb/ppc-linux-nat.c
@@ -1170,7 +1170,7 @@ ppc_linux_get_hwcap (void)
 {
   CORE_ADDR field;
 
-  if (target_auxv_search (target_stack, AT_HWCAP, &field) != 1)
+  if (target_auxv_search (current_top_target (), AT_HWCAP, &field) != 1)
     return 0;
 
   return field;
diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c
index 5716f82810..bf111b9d2c 100644
--- a/gdb/ppc-linux-tdep.c
+++ b/gdb/ppc-linux-tdep.c
@@ -1271,7 +1271,7 @@ ppc_linux_spe_context (int wordsize, enum bfd_endian byte_order,
   /* Look up cached address of thread-local variable.  */
   if (!ptid_equal (spe_context_cache_ptid, inferior_ptid))
     {
-      struct target_ops *target = target_stack;
+      struct target_ops *target = current_top_target ();
 
       TRY
 	{
@@ -1431,7 +1431,7 @@ ppu2spu_sniffer (const struct frame_unwind *self,
 	return 0;
 
       xsnprintf (annex, sizeof annex, "%d/regs", data.id);
-      if (target_read (target_stack, TARGET_OBJECT_SPU, annex,
+      if (target_read (current_top_target (), TARGET_OBJECT_SPU, annex,
 		       data.gprs, 0, sizeof data.gprs)
 	  == sizeof data.gprs)
 	{
diff --git a/gdb/procfs.c b/gdb/procfs.c
index 70619f1c15..6c76b4e82c 100644
--- a/gdb/procfs.c
+++ b/gdb/procfs.c
@@ -3894,7 +3894,7 @@ procfs_target::make_corefile_notes (bfd *obfd, int *note_size)
 			     &thread_args);
   note_data = thread_args.note_data;
 
-  auxv_len = target_read_alloc (target_stack, TARGET_OBJECT_AUXV,
+  auxv_len = target_read_alloc (current_top_target (), TARGET_OBJECT_AUXV,
 				NULL, &auxv);
   if (auxv_len > 0)
     {
diff --git a/gdb/regcache.c b/gdb/regcache.c
index 83bcbd22a3..24627c96f7 100644
--- a/gdb/regcache.c
+++ b/gdb/regcache.c
@@ -1554,7 +1554,7 @@ cooked_read_test (struct gdbarch *gdbarch)
 {
   /* Error out if debugging something, because we're going to push the
      test target, which would pop any existing target.  */
-  if (target_stack->to_stratum >= process_stratum)
+  if (current_top_target ()->to_stratum >= process_stratum)
     error (_("target already pushed"));
 
   /* Create a mock environment.  An inferior with a thread, with a
@@ -1728,7 +1728,7 @@ cooked_write_test (struct gdbarch *gdbarch)
 {
   /* Error out if debugging something, because we're going to push the
      test target, which would pop any existing target.  */
-  if (target_stack->to_stratum >= process_stratum)
+  if (current_top_target ()->to_stratum >= process_stratum)
     error (_("target already pushed"));
 
   /* Create a mock environment.  A process_stratum target pushed.  */
diff --git a/gdb/remote.c b/gdb/remote.c
index e7ade41c34..bc0c8e1292 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -4924,7 +4924,7 @@ remote_target::remote_check_symbols ()
 	     instead of any data function descriptor.  */
 	  sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
 							 sym_addr,
-							 target_stack);
+							 current_top_target ());
 
 	  xsnprintf (msg, get_remote_packet_size (), "qSymbol:%s:%s",
 		     phex_nz (sym_addr, addr_size), &reply[8]);
@@ -11392,7 +11392,7 @@ remote_target::memory_map ()
 {
   std::vector<mem_region> result;
   gdb::optional<gdb::char_vector> text
-    = target_read_stralloc (target_stack, TARGET_OBJECT_MEMORY_MAP, NULL);
+    = target_read_stralloc (current_top_target (), TARGET_OBJECT_MEMORY_MAP, NULL);
 
   if (text)
     result = parse_memory_map (text->data ());
@@ -13581,7 +13581,7 @@ traceframe_info_up
 remote_target::traceframe_info ()
 {
   gdb::optional<gdb::char_vector> text
-    = target_read_stralloc (target_stack, TARGET_OBJECT_TRACEFRAME_INFO,
+    = target_read_stralloc (current_top_target (), TARGET_OBJECT_TRACEFRAME_INFO,
 			    NULL);
   if (text)
     return parse_traceframe_info (text->data ());
@@ -13810,7 +13810,7 @@ static void
 btrace_read_config (struct btrace_config *conf)
 {
   gdb::optional<gdb::char_vector> xml
-    = target_read_stralloc (target_stack, TARGET_OBJECT_BTRACE_CONF, "");
+    = target_read_stralloc (current_top_target (), TARGET_OBJECT_BTRACE_CONF, "");
   if (xml)
     parse_xml_btrace_conf (conf, xml->data ());
 }
@@ -14006,7 +14006,7 @@ remote_target::read_btrace (struct btrace_data *btrace,
     }
 
   gdb::optional<gdb::char_vector> xml
-    = target_read_stralloc (target_stack, TARGET_OBJECT_BTRACE, annex);
+    = target_read_stralloc (current_top_target (), TARGET_OBJECT_BTRACE, annex);
   if (!xml)
     return BTRACE_ERR_UNKNOWN;
 
@@ -14063,7 +14063,7 @@ remote_target::pid_to_exec_file (int pid)
       xsnprintf (annex, annex_size, "%x", pid);
     }
 
-  filename = target_read_stralloc (target_stack,
+  filename = target_read_stralloc (current_top_target (),
 				   TARGET_OBJECT_EXEC_FILE, annex);
 
   return filename ? filename->data () : nullptr;
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
index ff4699c191..c73dc0e1cb 100644
--- a/gdb/rs6000-tdep.c
+++ b/gdb/rs6000-tdep.c
@@ -4702,7 +4702,7 @@ ppc_process_record_op31 (struct gdbarch *gdbarch, struct regcache *regcache,
       return 0;
 
     case 1014:		/* Data Cache Block set to Zero */
-      if (target_auxv_search (target_stack, AT_DCACHEBSIZE, &at_dcsz) <= 0
+      if (target_auxv_search (current_top_target (), AT_DCACHEBSIZE, &at_dcsz) <= 0
 	  || at_dcsz == 0)
 	at_dcsz = 128; /* Assume 128-byte cache line size (POWER8)  */
 
diff --git a/gdb/s390-linux-nat.c b/gdb/s390-linux-nat.c
index 3c65c5eaa5..2168a2a503 100644
--- a/gdb/s390-linux-nat.c
+++ b/gdb/s390-linux-nat.c
@@ -1019,7 +1019,7 @@ s390_linux_nat_target::read_description ()
   {
     CORE_ADDR hwcap = 0;
 
-    target_auxv_search (target_stack, AT_HWCAP, &hwcap);
+    target_auxv_search (current_top_target (), AT_HWCAP, &hwcap);
     have_regset_tdb = (hwcap & HWCAP_S390_TE)
       && check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset);
 
diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c
index 4af035fbfc..4f1e12a96e 100644
--- a/gdb/s390-tdep.c
+++ b/gdb/s390-tdep.c
@@ -661,7 +661,7 @@ s390_load (struct s390_prologue_data *data,
   if (pv_is_constant (addr))
     {
       struct target_section *secp;
-      secp = target_section_by_addr (target_stack, addr.k);
+      secp = target_section_by_addr (current_top_target (), addr.k);
       if (secp != NULL
 	  && (bfd_get_section_flags (secp->the_bfd_section->owner,
 				     secp->the_bfd_section)
diff --git a/gdb/solib-aix.c b/gdb/solib-aix.c
index f3dfdb577c..6e5b8b1326 100644
--- a/gdb/solib-aix.c
+++ b/gdb/solib-aix.c
@@ -280,7 +280,7 @@ solib_aix_get_library_list (struct inferior *inf, const char *warning_msg)
     return data->library_list;
 
   gdb::optional<gdb::char_vector> library_document
-    = target_read_stralloc (target_stack, TARGET_OBJECT_LIBRARIES_AIX,
+    = target_read_stralloc (current_top_target (), TARGET_OBJECT_LIBRARIES_AIX,
 			    NULL);
   if (!library_document && warning_msg != NULL)
     {
diff --git a/gdb/solib-darwin.c b/gdb/solib-darwin.c
index 557fb156b2..e655110d2d 100644
--- a/gdb/solib-darwin.c
+++ b/gdb/solib-darwin.c
@@ -497,8 +497,8 @@ darwin_solib_read_all_image_info_addr (struct darwin_info *info)
   if (TYPE_LENGTH (ptr_type) > sizeof (buf))
     return;
 
-  len = target_read (target_stack, TARGET_OBJECT_DARWIN_DYLD_INFO, NULL,
-		     buf, 0, TYPE_LENGTH (ptr_type));
+  len = target_read (current_top_target (), TARGET_OBJECT_DARWIN_DYLD_INFO,
+		     NULL, buf, 0, TYPE_LENGTH (ptr_type));
   if (len <= 0)
     return;
 
diff --git a/gdb/solib-dsbt.c b/gdb/solib-dsbt.c
index 9868606249..bf643febf8 100644
--- a/gdb/solib-dsbt.c
+++ b/gdb/solib-dsbt.c
@@ -293,7 +293,7 @@ dsbt_get_initial_loadmaps (void)
 {
   struct dsbt_info *info = get_dsbt_info ();
   gdb::optional<gdb::byte_vector> buf
-    = target_read_alloc (target_stack, TARGET_OBJECT_FDPIC, "exec");
+    = target_read_alloc (current_top_target (), TARGET_OBJECT_FDPIC, "exec");
 
   if (!buf || buf->empty ())
     {
@@ -304,7 +304,7 @@ dsbt_get_initial_loadmaps (void)
   if (solib_dsbt_debug)
     dsbt_print_loadmap (info->exec_loadmap);
 
-  buf = target_read_alloc (target_stack, TARGET_OBJECT_FDPIC, "exec");
+  buf = target_read_alloc (current_top_target (), TARGET_OBJECT_FDPIC, "exec");
   if (!buf || buf->empty ())
     {
       info->interp_loadmap = NULL;
diff --git a/gdb/solib-spu.c b/gdb/solib-spu.c
index a0fe8965bf..8419c2c139 100644
--- a/gdb/solib-spu.c
+++ b/gdb/solib-spu.c
@@ -171,7 +171,7 @@ spu_current_sos (void)
     ;
 
   /* Determine list of SPU ids.  */
-  size = target_read (target_stack, TARGET_OBJECT_SPU, NULL,
+  size = target_read (current_top_target (), TARGET_OBJECT_SPU, NULL,
 		      buf, 0, sizeof buf);
 
   /* Do not add stand-alone SPE executable context as shared library,
@@ -206,7 +206,7 @@ spu_current_sos (void)
 	 already created the SPE context, but not installed the object-id
 	 yet.  Skip such entries; we'll be back for them later.  */
       xsnprintf (annex, sizeof annex, "%d/object-id", fd);
-      len = target_read (target_stack, TARGET_OBJECT_SPU, annex,
+      len = target_read (current_top_target (), TARGET_OBJECT_SPU, annex,
 			 (gdb_byte *) id, 0, sizeof id);
       if (len <= 0 || len >= sizeof id)
 	continue;
@@ -418,7 +418,7 @@ spu_enable_break (struct objfile *objfile)
       CORE_ADDR addr = BMSYMBOL_VALUE_ADDRESS (spe_event_sym);
 
       addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (), addr,
-						 target_stack);
+						 current_top_target ());
       create_solib_event_breakpoint (target_gdbarch (), addr);
       return 1;
     }
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index f9936b36de..d012f082b8 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -432,11 +432,11 @@ read_program_header (int type, int *p_sect_size, int *p_arch_size,
   int pt_phdr_p = 0;
 
   /* Get required auxv elements from target.  */
-  if (target_auxv_search (target_stack, AT_PHDR, &at_phdr) <= 0)
+  if (target_auxv_search (current_top_target (), AT_PHDR, &at_phdr) <= 0)
     return 0;
-  if (target_auxv_search (target_stack, AT_PHENT, &at_phent) <= 0)
+  if (target_auxv_search (current_top_target (), AT_PHENT, &at_phent) <= 0)
     return 0;
-  if (target_auxv_search (target_stack, AT_PHNUM, &at_phnum) <= 0)
+  if (target_auxv_search (current_top_target (), AT_PHNUM, &at_phnum) <= 0)
     return 0;
   if (!at_phdr || !at_phnum)
     return 0;
@@ -1244,7 +1244,7 @@ svr4_current_sos_via_xfer_libraries (struct svr4_library_list *list,
 
   /* Fetch the list of shared libraries.  */
   gdb::optional<gdb::char_vector> svr4_library_document
-    = target_read_stralloc (target_stack, TARGET_OBJECT_LIBRARIES_SVR4,
+    = target_read_stralloc (current_top_target (), TARGET_OBJECT_LIBRARIES_SVR4,
 			    annex);
   if (!svr4_library_document)
     return 0;
@@ -2217,9 +2217,10 @@ enable_break (struct svr4_info *info, int from_tty)
       struct obj_section *os;
 
       sym_addr = gdbarch_addr_bits_remove
-	(target_gdbarch (), gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
-							     sym_addr,
-							     target_stack));
+	(target_gdbarch (),
+	 gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
+					     sym_addr,
+					     current_top_target ()));
 
       /* On at least some versions of Solaris there's a dynamic relocation
 	 on _r_debug.r_brk and SYM_ADDR may not be relocated yet, e.g., if
@@ -2334,7 +2335,7 @@ enable_break (struct svr4_info *info, int from_tty)
       /* If we were not able to find the base address of the loader
          from our so_list, then try using the AT_BASE auxilliary entry.  */
       if (!load_addr_found)
-	if (target_auxv_search (target_stack, AT_BASE, &load_addr) > 0)
+	if (target_auxv_search (current_top_target (), AT_BASE, &load_addr) > 0)
 	  {
 	    int addr_bit = gdbarch_addr_bit (target_gdbarch ());
 
@@ -2459,7 +2460,7 @@ enable_break (struct svr4_info *info, int from_tty)
 	  sym_addr = BMSYMBOL_VALUE_ADDRESS (msymbol);
 	  sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
 							 sym_addr,
-							 target_stack);
+							 current_top_target ());
 	  svr4_create_solib_event_breakpoints (target_gdbarch (), sym_addr);
 	  return 1;
 	}
@@ -2476,7 +2477,7 @@ enable_break (struct svr4_info *info, int from_tty)
 	      sym_addr = BMSYMBOL_VALUE_ADDRESS (msymbol);
 	      sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
 							     sym_addr,
-							     target_stack);
+							     current_top_target ());
 	      svr4_create_solib_event_breakpoints (target_gdbarch (), sym_addr);
 	      return 1;
 	    }
@@ -2571,7 +2572,7 @@ svr4_exec_displacement (CORE_ADDR *displacementp)
   if ((bfd_get_file_flags (exec_bfd) & DYNAMIC) == 0)
     return 0;
 
-  if (target_auxv_search (target_stack, AT_ENTRY, &entry_point) <= 0)
+  if (target_auxv_search (current_top_target (), AT_ENTRY, &entry_point) <= 0)
     return 0;
 
   exec_displacement = entry_point - bfd_get_start_address (exec_bfd);
diff --git a/gdb/solib-target.c b/gdb/solib-target.c
index adbab7ea32..3c9872c116 100644
--- a/gdb/solib-target.c
+++ b/gdb/solib-target.c
@@ -258,7 +258,8 @@ solib_target_current_sos (void)
 
   /* Fetch the list of shared libraries.  */
   gdb::optional<gdb::char_vector> library_document
-    = target_read_stralloc (target_stack, TARGET_OBJECT_LIBRARIES, NULL);
+    = target_read_stralloc (current_top_target (), TARGET_OBJECT_LIBRARIES,
+			    NULL);
   if (!library_document)
     return NULL;
 
diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c
index 7300080d8d..0e177734d0 100644
--- a/gdb/sparc-tdep.c
+++ b/gdb/sparc-tdep.c
@@ -189,7 +189,7 @@ ULONGEST
 sparc_fetch_wcookie (struct gdbarch *gdbarch)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  struct target_ops *ops = target_stack;
+  struct target_ops *ops = current_top_target ();
   gdb_byte buf[8];
   int len;
 
diff --git a/gdb/sparc64-tdep.c b/gdb/sparc64-tdep.c
index 9fd6a66199..1a7a952867 100644
--- a/gdb/sparc64-tdep.c
+++ b/gdb/sparc64-tdep.c
@@ -222,10 +222,10 @@ adi_available (void)
     return proc->stat.is_avail;
 
   proc->stat.checked_avail = true;
-  if (target_auxv_search (target_stack, AT_ADI_BLKSZ, &value) <= 0)
+  if (target_auxv_search (current_top_target (), AT_ADI_BLKSZ, &value) <= 0)
     return false;
   proc->stat.blksize = value;
-  target_auxv_search (target_stack, AT_ADI_NBITS, &value);
+  target_auxv_search (current_top_target (), AT_ADI_NBITS, &value);
   proc->stat.nbits = value;
   proc->stat.max_version = (1 << proc->stat.nbits) - 2;
   proc->stat.is_avail = true;
diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c
index 2567c240d4..409e2c2336 100644
--- a/gdb/spu-tdep.c
+++ b/gdb/spu-tdep.c
@@ -198,7 +198,7 @@ spu_pseudo_register_read_spu (readable_regcache *regcache, const char *regname,
     return status;
   xsnprintf (annex, sizeof annex, "%d/%s", (int) id, regname);
   memset (reg, 0, sizeof reg);
-  target_read (target_stack, TARGET_OBJECT_SPU, annex,
+  target_read (current_top_target (), TARGET_OBJECT_SPU, annex,
 	       reg, 0, sizeof reg);
 
   ul = strtoulst ((char *) reg, NULL, 16);
@@ -229,7 +229,7 @@ spu_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
       if (status != REG_VALID)
 	return status;
       xsnprintf (annex, sizeof annex, "%d/fpcr", (int) id);
-      target_read (target_stack, TARGET_OBJECT_SPU, annex, buf, 0, 16);
+      target_read (current_top_target (), TARGET_OBJECT_SPU, annex, buf, 0, 16);
       return status;
 
     case SPU_SRR0_REGNUM:
@@ -263,7 +263,7 @@ spu_pseudo_register_write_spu (struct regcache *regcache, const char *regname,
   xsnprintf (annex, sizeof annex, "%d/%s", (int) id, regname);
   xsnprintf (reg, sizeof reg, "0x%s",
 	     phex_nz (extract_unsigned_integer (buf, 4, byte_order), 4));
-  target_write (target_stack, TARGET_OBJECT_SPU, annex,
+  target_write (current_top_target (), TARGET_OBJECT_SPU, annex,
 		(gdb_byte *) reg, 0, strlen (reg));
 }
 
@@ -286,7 +286,7 @@ spu_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
     case SPU_FPSCR_REGNUM:
       regcache_raw_read_unsigned (regcache, SPU_ID_REGNUM, &id);
       xsnprintf (annex, sizeof annex, "%d/fpcr", (int) id);
-      target_write (target_stack, TARGET_OBJECT_SPU, annex, buf, 0, 16);
+      target_write (current_top_target (), TARGET_OBJECT_SPU, annex, buf, 0, 16);
       break;
 
     case SPU_SRR0_REGNUM:
@@ -2079,7 +2079,7 @@ info_spu_event_command (const char *args, int from_tty)
   id = get_frame_register_unsigned (frame, SPU_ID_REGNUM);
 
   xsnprintf (annex, sizeof annex, "%d/event_status", id);
-  len = target_read (target_stack, TARGET_OBJECT_SPU, annex,
+  len = target_read (current_top_target (), TARGET_OBJECT_SPU, annex,
 		     buf, 0, (sizeof (buf) - 1));
   if (len <= 0)
     error (_("Could not read event_status."));
@@ -2087,7 +2087,7 @@ info_spu_event_command (const char *args, int from_tty)
   event_status = strtoulst ((char *) buf, NULL, 16);
  
   xsnprintf (annex, sizeof annex, "%d/event_mask", id);
-  len = target_read (target_stack, TARGET_OBJECT_SPU, annex,
+  len = target_read (current_top_target (), TARGET_OBJECT_SPU, annex,
 		     buf, 0, (sizeof (buf) - 1));
   if (len <= 0)
     error (_("Could not read event_mask."));
@@ -2127,7 +2127,8 @@ info_spu_signal_command (const char *args, int from_tty)
   id = get_frame_register_unsigned (frame, SPU_ID_REGNUM);
 
   xsnprintf (annex, sizeof annex, "%d/signal1", id);
-  len = target_read (target_stack, TARGET_OBJECT_SPU, annex, buf, 0, 4);
+  len = target_read (current_top_target (), TARGET_OBJECT_SPU,
+		     annex, buf, 0, 4);
   if (len < 0)
     error (_("Could not read signal1."));
   else if (len == 4)
@@ -2137,7 +2138,7 @@ info_spu_signal_command (const char *args, int from_tty)
     }
     
   xsnprintf (annex, sizeof annex, "%d/signal1_type", id);
-  len = target_read (target_stack, TARGET_OBJECT_SPU, annex,
+  len = target_read (current_top_target (), TARGET_OBJECT_SPU, annex,
 		     buf, 0, (sizeof (buf) - 1));
   if (len <= 0)
     error (_("Could not read signal1_type."));
@@ -2145,7 +2146,8 @@ info_spu_signal_command (const char *args, int from_tty)
   signal1_type = strtoulst ((char *) buf, NULL, 16);
 
   xsnprintf (annex, sizeof annex, "%d/signal2", id);
-  len = target_read (target_stack, TARGET_OBJECT_SPU, annex, buf, 0, 4);
+  len = target_read (current_top_target (), TARGET_OBJECT_SPU,
+		     annex, buf, 0, 4);
   if (len < 0)
     error (_("Could not read signal2."));
   else if (len == 4)
@@ -2155,7 +2157,7 @@ info_spu_signal_command (const char *args, int from_tty)
     }
     
   xsnprintf (annex, sizeof annex, "%d/signal2_type", id);
-  len = target_read (target_stack, TARGET_OBJECT_SPU, annex,
+  len = target_read (current_top_target (), TARGET_OBJECT_SPU, annex,
 		     buf, 0, (sizeof (buf) - 1));
   if (len <= 0)
     error (_("Could not read signal2_type."));
@@ -2243,7 +2245,7 @@ info_spu_mailbox_command (const char *args, int from_tty)
   ui_out_emit_tuple tuple_emitter (current_uiout, "SPUInfoMailbox");
 
   xsnprintf (annex, sizeof annex, "%d/mbox_info", id);
-  len = target_read (target_stack, TARGET_OBJECT_SPU, annex,
+  len = target_read (current_top_target (), TARGET_OBJECT_SPU, annex,
 		     buf, 0, sizeof buf);
   if (len < 0)
     error (_("Could not read mbox_info."));
@@ -2252,7 +2254,7 @@ info_spu_mailbox_command (const char *args, int from_tty)
 			 "mbox", "SPU Outbound Mailbox");
 
   xsnprintf (annex, sizeof annex, "%d/ibox_info", id);
-  len = target_read (target_stack, TARGET_OBJECT_SPU, annex,
+  len = target_read (current_top_target (), TARGET_OBJECT_SPU, annex,
 		     buf, 0, sizeof buf);
   if (len < 0)
     error (_("Could not read ibox_info."));
@@ -2261,7 +2263,7 @@ info_spu_mailbox_command (const char *args, int from_tty)
 			 "ibox", "SPU Outbound Interrupt Mailbox");
 
   xsnprintf (annex, sizeof annex, "%d/wbox_info", id);
-  len = target_read (target_stack, TARGET_OBJECT_SPU, annex,
+  len = target_read (current_top_target (), TARGET_OBJECT_SPU, annex,
 		     buf, 0, sizeof buf);
   if (len < 0)
     error (_("Could not read wbox_info."));
@@ -2473,7 +2475,7 @@ info_spu_dma_command (const char *args, int from_tty)
   id = get_frame_register_unsigned (frame, SPU_ID_REGNUM);
 
   xsnprintf (annex, sizeof annex, "%d/dma_info", id);
-  len = target_read (target_stack, TARGET_OBJECT_SPU, annex,
+  len = target_read (current_top_target (), TARGET_OBJECT_SPU, annex,
 		     buf, 0, 40 + 16 * 32);
   if (len <= 0)
     error (_("Could not read dma_info."));
@@ -2550,7 +2552,7 @@ info_spu_proxydma_command (const char *args, int from_tty)
   id = get_frame_register_unsigned (frame, SPU_ID_REGNUM);
 
   xsnprintf (annex, sizeof annex, "%d/proxydma_info", id);
-  len = target_read (target_stack, TARGET_OBJECT_SPU, annex,
+  len = target_read (current_top_target (), TARGET_OBJECT_SPU, annex,
 		     buf, 0, 24 + 8 * 32);
   if (len <= 0)
     error (_("Could not read proxydma_info."));
diff --git a/gdb/symfile.c b/gdb/symfile.c
index a57bd6a593..6555eb23d6 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -864,7 +864,7 @@ init_entry_point_info (struct objfile *objfile)
       entry_point
 	= gdbarch_convert_from_func_ptr_addr (get_objfile_arch (objfile),
 					      entry_point,
-					      target_stack);
+					      current_top_target ());
 
       /* Remove any ISA markers, so that this matches entries in the
 	 symbol table.  */
diff --git a/gdb/symtab.c b/gdb/symtab.c
index e1f033d1d8..d02909d551 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -4983,9 +4983,10 @@ find_gnu_ifunc (const symbol *sym)
 	  if (MSYMBOL_TYPE (minsym) == mst_data_gnu_ifunc)
 	    {
 	      struct gdbarch *gdbarch = get_objfile_arch (objfile);
-	      msym_addr = gdbarch_convert_from_func_ptr_addr (gdbarch,
-							      msym_addr,
-							      target_stack);
+	      msym_addr
+		= gdbarch_convert_from_func_ptr_addr (gdbarch,
+						      msym_addr,
+						      current_top_target ());
 	    }
 	  if (msym_addr == address)
 	    {
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 83a6f6cafc..3076d79a13 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -521,11 +521,11 @@ target_find_description (void)
   /* Next try to read the description from the current target using
      target objects.  */
   if (current_target_desc == NULL)
-    current_target_desc = target_read_description_xml (target_stack);
+    current_target_desc = target_read_description_xml (current_top_target ());
 
   /* If that failed try a target-specific hook.  */
   if (current_target_desc == NULL)
-    current_target_desc = target_read_description (target_stack);
+    current_target_desc = target_read_description (current_top_target ());
 
   /* If a non-NULL description was returned, then update the current
      architecture.  */
diff --git a/gdb/target-memory.c b/gdb/target-memory.c
index 8db64d7284..783e59dd55 100644
--- a/gdb/target-memory.c
+++ b/gdb/target-memory.c
@@ -338,7 +338,7 @@ target_write_memory_blocks (const std::vector<memory_write_request> &requests,
     {
       LONGEST len;
 
-      len = target_write_with_progress (target_stack,
+      len = target_write_with_progress (current_top_target (),
 					TARGET_OBJECT_MEMORY, NULL,
 					iter.data, iter.begin,
 					iter.end - iter.begin,
@@ -361,7 +361,7 @@ target_write_memory_blocks (const std::vector<memory_write_request> &requests,
 	{
 	  LONGEST len;
 
-	  len = target_write_with_progress (target_stack,
+	  len = target_write_with_progress (current_top_target (),
 					    TARGET_OBJECT_FLASH, NULL,
 					    iter.data, iter.begin,
 					    iter.end - iter.begin,
diff --git a/gdb/target.c b/gdb/target.c
index d96cdec418..13f7e68fdf 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -123,7 +123,13 @@ static struct target_ops *the_debug_target;
 /* The target structure we are currently using to talk to a process
    or file or whatever "inferior" we have.  */
 
-struct target_ops *target_stack;
+static target_ops *g_current_top_target;
+
+target_ops *
+current_top_target ()
+{
+  return g_current_top_target;
+}
 
 /* Command list for target.  */
 
@@ -264,7 +270,7 @@ target_has_all_memory_1 (void)
 {
   struct target_ops *t;
 
-  for (t = target_stack; t != NULL; t = t->beneath)
+  for (t = current_top_target (); t != NULL; t = t->beneath)
     if (t->has_all_memory ())
       return 1;
 
@@ -276,7 +282,7 @@ target_has_memory_1 (void)
 {
   struct target_ops *t;
 
-  for (t = target_stack; t != NULL; t = t->beneath)
+  for (t = current_top_target (); t != NULL; t = t->beneath)
     if (t->has_memory ())
       return 1;
 
@@ -288,7 +294,7 @@ target_has_stack_1 (void)
 {
   struct target_ops *t;
 
-  for (t = target_stack; t != NULL; t = t->beneath)
+  for (t = current_top_target (); t != NULL; t = t->beneath)
     if (t->has_stack ())
       return 1;
 
@@ -300,7 +306,7 @@ target_has_registers_1 (void)
 {
   struct target_ops *t;
 
-  for (t = target_stack; t != NULL; t = t->beneath)
+  for (t = current_top_target (); t != NULL; t = t->beneath)
     if (t->has_registers ())
       return 1;
 
@@ -312,7 +318,7 @@ target_has_execution_1 (ptid_t the_ptid)
 {
   struct target_ops *t;
 
-  for (t = target_stack; t != NULL; t = t->beneath)
+  for (t = current_top_target (); t != NULL; t = t->beneath)
     if (t->has_execution (the_ptid))
       return 1;
 
@@ -395,14 +401,14 @@ add_deprecated_target_alias (const target_info &tinfo, const char *alias)
 void
 target_kill (void)
 {
-  target_stack->kill ();
+  current_top_target ()->kill ();
 }
 
 void
 target_load (const char *arg, int from_tty)
 {
   target_dcache_invalidate ();
-  target_stack->load (arg, from_tty);
+  current_top_target ()->load (arg, from_tty);
 }
 
 /* Define it.  */
@@ -415,7 +421,7 @@ target_terminal_state target_terminal::m_terminal_state
 void
 target_terminal::init (void)
 {
-  target_stack->terminal_init ();
+  current_top_target ()->terminal_init ();
 
   m_terminal_state = target_terminal_state::is_ours;
 }
@@ -446,7 +452,7 @@ target_terminal::inferior (void)
 
   if (inf->terminal_state != target_terminal_state::is_inferior)
     {
-      target_stack->terminal_inferior ();
+      current_top_target ()->terminal_inferior ();
       inf->terminal_state = target_terminal_state::is_inferior;
     }
 
@@ -482,7 +488,7 @@ target_terminal::restore_inferior (void)
 	if (inf->terminal_state == target_terminal_state::is_ours_for_output)
 	  {
 	    set_current_inferior (inf);
-	    target_stack->terminal_inferior ();
+	    current_top_target ()->terminal_inferior ();
 	    inf->terminal_state = target_terminal_state::is_inferior;
 	  }
       }
@@ -515,7 +521,7 @@ target_terminal_is_ours_kind (target_terminal_state desired_state)
       if (inf->terminal_state == target_terminal_state::is_inferior)
 	{
 	  set_current_inferior (inf);
-	  target_stack->terminal_save_inferior ();
+	  current_top_target ()->terminal_save_inferior ();
 	}
     }
 
@@ -530,9 +536,9 @@ target_terminal_is_ours_kind (target_terminal_state desired_state)
 	{
 	  set_current_inferior (inf);
 	  if (desired_state == target_terminal_state::is_ours)
-	    target_stack->terminal_ours ();
+	    current_top_target ()->terminal_ours ();
 	  else if (desired_state == target_terminal_state::is_ours_for_output)
-	    target_stack->terminal_ours_for_output ();
+	    current_top_target ()->terminal_ours_for_output ();
 	  else
 	    gdb_assert_not_reached ("unhandled desired state");
 	  inf->terminal_state = desired_state;
@@ -581,7 +587,7 @@ target_terminal::ours_for_output ()
 void
 target_terminal::info (const char *arg, int from_tty)
 {
-  target_stack->terminal_info (arg, from_tty);
+  current_top_target ()->terminal_info (arg, from_tty);
 }
 
 /* See target.h.  */
@@ -589,14 +595,14 @@ target_terminal::info (const char *arg, int from_tty)
 int
 target_supports_terminal_ours (void)
 {
-  return target_stack->supports_terminal_ours ();
+  return current_top_target ()->supports_terminal_ours ();
 }
 
 static void
 tcomplain (void)
 {
   error (_("You can't do that when your target is `%s'"),
-	 target_stack->shortname ());
+	 current_top_target ()->shortname ());
 }
 
 void
@@ -648,7 +654,7 @@ push_target (struct target_ops *t)
   struct target_ops **cur;
 
   /* Find the proper stratum to install this target in.  */
-  for (cur = &target_stack; (*cur) != NULL; cur = &(*cur)->beneath)
+  for (cur = &g_current_top_target; (*cur) != NULL; cur = &(*cur)->beneath)
     {
       if ((int) (t->to_stratum) >= (int) (*cur)->to_stratum)
 	break;
@@ -689,7 +695,7 @@ unpush_target (struct target_ops *t)
   /* Look for the specified target.  Note that we assume that a target
      can only occur once in the target stack.  */
 
-  for (cur = &target_stack; (*cur) != NULL; cur = &(*cur)->beneath)
+  for (cur = &g_current_top_target; (*cur) != NULL; cur = &(*cur)->beneath)
     {
       if ((*cur) == t)
 	break;
@@ -731,8 +737,8 @@ unpush_target_and_assert (struct target_ops *target)
 void
 pop_all_targets_above (enum strata above_stratum)
 {
-  while ((int) (target_stack->to_stratum) > (int) above_stratum)
-    unpush_target_and_assert (target_stack);
+  while ((int) (current_top_target ()->to_stratum) > (int) above_stratum)
+    unpush_target_and_assert (current_top_target ());
 }
 
 /* See target.h.  */
@@ -740,8 +746,8 @@ pop_all_targets_above (enum strata above_stratum)
 void
 pop_all_targets_at_and_above (enum strata stratum)
 {
-  while ((int) (target_stack->to_stratum) >= (int) stratum)
-    unpush_target_and_assert (target_stack);
+  while ((int) (current_top_target ()->to_stratum) >= (int) stratum)
+    unpush_target_and_assert (current_top_target ());
 }
 
 void
@@ -757,7 +763,7 @@ target_is_pushed (struct target_ops *t)
 {
   struct target_ops *cur;
 
-  for (cur = target_stack; cur != NULL; cur = cur->beneath)
+  for (cur = current_top_target (); cur != NULL; cur = cur->beneath)
     if (cur == t)
       return 1;
 
@@ -779,7 +785,7 @@ CORE_ADDR
 target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset)
 {
   volatile CORE_ADDR addr = 0;
-  struct target_ops *target = target_stack;
+  struct target_ops *target = current_top_target ();
 
   if (gdbarch_fetch_tls_load_module_address_p (target_gdbarch ()))
     {
@@ -1345,7 +1351,7 @@ target_xfer_partial (struct target_ops *ops,
 int
 target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
 {
-  if (target_read (target_stack, TARGET_OBJECT_MEMORY, NULL,
+  if (target_read (current_top_target (), TARGET_OBJECT_MEMORY, NULL,
 		   myaddr, memaddr, len) == len)
     return 0;
   else
@@ -1375,7 +1381,7 @@ target_read_uint32 (CORE_ADDR memaddr, uint32_t *result)
 int
 target_read_raw_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
 {
-  if (target_read (target_stack, TARGET_OBJECT_RAW_MEMORY, NULL,
+  if (target_read (current_top_target (), TARGET_OBJECT_RAW_MEMORY, NULL,
 		   myaddr, memaddr, len) == len)
     return 0;
   else
@@ -1388,7 +1394,7 @@ target_read_raw_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
 int
 target_read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
 {
-  if (target_read (target_stack, TARGET_OBJECT_STACK_MEMORY, NULL,
+  if (target_read (current_top_target (), TARGET_OBJECT_STACK_MEMORY, NULL,
 		   myaddr, memaddr, len) == len)
     return 0;
   else
@@ -1401,7 +1407,7 @@ target_read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
 int
 target_read_code (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
 {
-  if (target_read (target_stack, TARGET_OBJECT_CODE_MEMORY, NULL,
+  if (target_read (current_top_target (), TARGET_OBJECT_CODE_MEMORY, NULL,
 		   myaddr, memaddr, len) == len)
     return 0;
   else
@@ -1417,7 +1423,7 @@ target_read_code (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
 int
 target_write_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len)
 {
-  if (target_write (target_stack, TARGET_OBJECT_MEMORY, NULL,
+  if (target_write (current_top_target (), TARGET_OBJECT_MEMORY, NULL,
 		    myaddr, memaddr, len) == len)
     return 0;
   else
@@ -1433,7 +1439,7 @@ target_write_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len)
 int
 target_write_raw_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len)
 {
-  if (target_write (target_stack, TARGET_OBJECT_RAW_MEMORY, NULL,
+  if (target_write (current_top_target (), TARGET_OBJECT_RAW_MEMORY, NULL,
 		    myaddr, memaddr, len) == len)
     return 0;
   else
@@ -1445,7 +1451,7 @@ target_write_raw_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len)
 std::vector<mem_region>
 target_memory_map (void)
 {
-  std::vector<mem_region> result = target_stack->memory_map ();
+  std::vector<mem_region> result = current_top_target ()->memory_map ();
   if (result.empty ())
     return result;
 
@@ -1475,13 +1481,13 @@ target_memory_map (void)
 void
 target_flash_erase (ULONGEST address, LONGEST length)
 {
-  target_stack->flash_erase (address, length);
+  current_top_target ()->flash_erase (address, length);
 }
 
 void
 target_flash_done (void)
 {
-  target_stack->flash_done ();
+  current_top_target ()->flash_done ();
 }
 
 static void
@@ -1936,7 +1942,7 @@ target_insert_breakpoint (struct gdbarch *gdbarch,
       return 1;
     }
 
-  return target_stack->insert_breakpoint (gdbarch, bp_tgt);
+  return current_top_target ()->insert_breakpoint (gdbarch, bp_tgt);
 }
 
 /* See target.h.  */
@@ -1956,7 +1962,7 @@ target_remove_breakpoint (struct gdbarch *gdbarch,
       return 1;
     }
 
-  return target_stack->remove_breakpoint (gdbarch, bp_tgt, reason);
+  return current_top_target ()->remove_breakpoint (gdbarch, bp_tgt, reason);
 }
 
 static void
@@ -1969,7 +1975,7 @@ info_target_command (const char *args, int from_tty)
     printf_unfiltered (_("Symbols from \"%s\".\n"),
 		       objfile_name (symfile_objfile));
 
-  for (t = target_stack; t != NULL; t = t->beneath)
+  for (t = current_top_target (); t != NULL; t = t->beneath)
     {
       if (!t->has_memory ())
 	continue;
@@ -2105,7 +2111,7 @@ target_detach (inferior *inf, int from_tty)
 
   prepare_for_detach ();
 
-  target_stack->detach (inf, from_tty);
+  current_top_target ()->detach (inf, from_tty);
 }
 
 void
@@ -2116,7 +2122,7 @@ target_disconnect (const char *args, int from_tty)
      disconnecting.  */
   remove_breakpoints ();
 
-  target_stack->disconnect (args, from_tty);
+  current_top_target ()->disconnect (args, from_tty);
 }
 
 /* See target/target.h.  */
@@ -2124,7 +2130,7 @@ target_disconnect (const char *args, int from_tty)
 ptid_t
 target_wait (ptid_t ptid, struct target_waitstatus *status, int options)
 {
-  return target_stack->wait (ptid, status, options);
+  return current_top_target ()->wait (ptid, status, options);
 }
 
 /* See target.h.  */
@@ -2141,13 +2147,13 @@ default_target_wait (struct target_ops *ops,
 const char *
 target_pid_to_str (ptid_t ptid)
 {
-  return target_stack->pid_to_str (ptid);
+  return current_top_target ()->pid_to_str (ptid);
 }
 
 const char *
 target_thread_name (struct thread_info *info)
 {
-  return target_stack->thread_name (info);
+  return current_top_target ()->thread_name (info);
 }
 
 struct thread_info *
@@ -2155,7 +2161,7 @@ target_thread_handle_to_thread_info (const gdb_byte *thread_handle,
 				     int handle_len,
 				     struct inferior *inf)
 {
-  return target_stack->thread_handle_to_thread_info (thread_handle,
+  return current_top_target ()->thread_handle_to_thread_info (thread_handle,
 						     handle_len, inf);
 }
 
@@ -2164,7 +2170,7 @@ target_resume (ptid_t ptid, int step, enum gdb_signal signal)
 {
   target_dcache_invalidate ();
 
-  target_stack->resume (ptid, step, signal);
+  current_top_target ()->resume (ptid, step, signal);
 
   registers_changed_ptid (ptid);
   /* We only set the internal executing state here.  The user/frontend
@@ -2184,7 +2190,7 @@ target_commit_resume (void)
   if (defer_target_commit_resume)
     return;
 
-  target_stack->commit_resume ();
+  current_top_target ()->commit_resume ();
 }
 
 /* See target.h.  */
@@ -2198,13 +2204,13 @@ make_scoped_defer_target_commit_resume ()
 void
 target_pass_signals (int numsigs, unsigned char *pass_signals)
 {
-  target_stack->pass_signals (numsigs, pass_signals);
+  current_top_target ()->pass_signals (numsigs, pass_signals);
 }
 
 void
 target_program_signals (int numsigs, unsigned char *program_signals)
 {
-  target_stack->program_signals (numsigs, program_signals);
+  current_top_target ()->program_signals (numsigs, program_signals);
 }
 
 static int
@@ -2222,7 +2228,7 @@ default_follow_fork (struct target_ops *self, int follow_child,
 int
 target_follow_fork (int follow_child, int detach_fork)
 {
-  return target_stack->follow_fork (follow_child, detach_fork);
+  return current_top_target ()->follow_fork (follow_child, detach_fork);
 }
 
 /* Target wrapper for follow exec hook.  */
@@ -2230,7 +2236,7 @@ target_follow_fork (int follow_child, int detach_fork)
 void
 target_follow_exec (struct inferior *inf, char *execd_pathname)
 {
-  target_stack->follow_exec (inf, execd_pathname);
+  current_top_target ()->follow_exec (inf, execd_pathname);
 }
 
 static void
@@ -2244,7 +2250,7 @@ void
 target_mourn_inferior (ptid_t ptid)
 {
   gdb_assert (ptid_equal (ptid, inferior_ptid));
-  target_stack->mourn_inferior ();
+  current_top_target ()->mourn_inferior ();
 
   /* We no longer need to keep handles on any of the object files.
      Make sure to release them to avoid unnecessarily locking any
@@ -2371,7 +2377,7 @@ default_search_memory (struct target_ops *self,
 		       CORE_ADDR *found_addrp)
 {
   /* Start over from the top of the target stack.  */
-  return simple_search_memory (target_stack,
+  return simple_search_memory (current_top_target (),
 			       start_addr, search_space_len,
 			       pattern, pattern_len, found_addrp);
 }
@@ -2388,7 +2394,7 @@ target_search_memory (CORE_ADDR start_addr, ULONGEST search_space_len,
 		      const gdb_byte *pattern, ULONGEST pattern_len,
 		      CORE_ADDR *found_addrp)
 {
-  return target_stack->search_memory (start_addr, search_space_len,
+  return current_top_target ()->search_memory (start_addr, search_space_len,
 				      pattern, pattern_len, found_addrp);
 }
 
@@ -2401,7 +2407,7 @@ target_require_runnable (void)
 {
   struct target_ops *t;
 
-  for (t = target_stack; t != NULL; t = t->beneath)
+  for (t = current_top_target (); t != NULL; t = t->beneath)
     {
       /* If this target knows how to create a new program, then
 	 assume we will still be able to after killing the current
@@ -2491,7 +2497,7 @@ struct target_ops *
 find_attach_target (void)
 {
   /* If a target on the current stack can attach, use it.  */
-  for (target_ops *t = target_stack; t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath)
     {
       if (t->can_attach ())
 	return t;
@@ -2507,7 +2513,7 @@ struct target_ops *
 find_run_target (void)
 {
   /* If a target on the current stack can run, use it.  */
-  for (target_ops *t = target_stack; t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath)
     {
       if (t->can_create_inferior ())
 	return t;
@@ -2566,7 +2572,7 @@ find_default_supports_disable_randomization (struct target_ops *self)
 int
 target_supports_disable_randomization (void)
 {
-  return target_stack->supports_disable_randomization ();
+  return current_top_target ()->supports_disable_randomization ();
 }
 
 /* See target/target.h.  */
@@ -2574,7 +2580,7 @@ target_supports_disable_randomization (void)
 int
 target_supports_multi_process (void)
 {
-  return target_stack->supports_multi_process ();
+  return current_top_target ()->supports_multi_process ();
 }
 
 /* See target.h.  */
@@ -2621,7 +2627,7 @@ target_thread_address_space (ptid_t ptid)
 {
   struct address_space *aspace;
 
-  aspace = target_stack->thread_address_space (ptid);
+  aspace = current_top_target ()->thread_address_space (ptid);
   gdb_assert (aspace != NULL);
 
   return aspace;
@@ -2668,7 +2674,7 @@ target_can_run ()
 {
   struct target_ops *t;
 
-  for (t = target_stack; t != NULL; t = t->beneath)
+  for (t = current_top_target (); t != NULL; t = t->beneath)
     {
       if (t->can_run ())
 	return 1;
@@ -3235,7 +3241,7 @@ find_target_at (enum strata stratum)
 {
   struct target_ops *t;
 
-  for (t = target_stack; t != NULL; t = t->beneath)
+  for (t = current_top_target (); t != NULL; t = t->beneath)
     if (t->to_stratum == stratum)
       return t;
 
@@ -3385,13 +3391,13 @@ target_close (struct target_ops *targ)
 int
 target_thread_alive (ptid_t ptid)
 {
-  return target_stack->thread_alive (ptid);
+  return current_top_target ()->thread_alive (ptid);
 }
 
 void
 target_update_thread_list (void)
 {
-  target_stack->update_thread_list ();
+  current_top_target ()->update_thread_list ();
 }
 
 void
@@ -3403,7 +3409,7 @@ target_stop (ptid_t ptid)
       return;
     }
 
-  target_stack->stop (ptid);
+  current_top_target ()->stop (ptid);
 }
 
 void
@@ -3415,7 +3421,7 @@ target_interrupt ()
       return;
     }
 
-  target_stack->interrupt ();
+  current_top_target ()->interrupt ();
 }
 
 /* See target.h.  */
@@ -3423,7 +3429,7 @@ target_interrupt ()
 void
 target_pass_ctrlc (void)
 {
-  target_stack->pass_ctrlc ();
+  current_top_target ()->pass_ctrlc ();
 }
 
 /* See target.h.  */
@@ -3518,7 +3524,7 @@ target_options_to_string (int target_options)
 void
 target_fetch_registers (struct regcache *regcache, int regno)
 {
-  target_stack->fetch_registers (regcache, regno);
+  current_top_target ()->fetch_registers (regcache, regno);
   if (targetdebug)
     regcache->debug_print_register ("target_fetch_registers", regno);
 }
@@ -3529,7 +3535,7 @@ target_store_registers (struct regcache *regcache, int regno)
   if (!may_write_registers)
     error (_("Writing to registers is not allowed (regno %d)"), regno);
 
-  target_stack->store_registers (regcache, regno);
+  current_top_target ()->store_registers (regcache, regno);
   if (targetdebug)
     {
       regcache->debug_print_register ("target_store_registers", regno);
@@ -3539,7 +3545,7 @@ target_store_registers (struct regcache *regcache, int regno)
 int
 target_core_of_thread (ptid_t ptid)
 {
-  return target_stack->core_of_thread (ptid);
+  return current_top_target ()->core_of_thread (ptid);
 }
 
 int
@@ -3577,14 +3583,14 @@ default_verify_memory (struct target_ops *self,
 		       const gdb_byte *data, CORE_ADDR memaddr, ULONGEST size)
 {
   /* Start over from the top of the target stack.  */
-  return simple_verify_memory (target_stack,
+  return simple_verify_memory (current_top_target (),
 			       data, memaddr, size);
 }
 
 int
 target_verify_memory (const gdb_byte *data, CORE_ADDR memaddr, ULONGEST size)
 {
-  return target_stack->verify_memory (data, memaddr, size);
+  return current_top_target ()->verify_memory (data, memaddr, size);
 }
 
 /* The documentation for this function is in its prototype declaration in
@@ -3594,7 +3600,7 @@ int
 target_insert_mask_watchpoint (CORE_ADDR addr, CORE_ADDR mask,
 			       enum target_hw_bp_type rw)
 {
-  return target_stack->insert_mask_watchpoint (addr, mask, rw);
+  return current_top_target ()->insert_mask_watchpoint (addr, mask, rw);
 }
 
 /* The documentation for this function is in its prototype declaration in
@@ -3604,7 +3610,7 @@ int
 target_remove_mask_watchpoint (CORE_ADDR addr, CORE_ADDR mask,
 			       enum target_hw_bp_type rw)
 {
-  return target_stack->remove_mask_watchpoint (addr, mask, rw);
+  return current_top_target ()->remove_mask_watchpoint (addr, mask, rw);
 }
 
 /* The documentation for this function is in its prototype declaration
@@ -3613,7 +3619,7 @@ target_remove_mask_watchpoint (CORE_ADDR addr, CORE_ADDR mask,
 int
 target_masked_watch_num_registers (CORE_ADDR addr, CORE_ADDR mask)
 {
-  return target_stack->masked_watch_num_registers (addr, mask);
+  return current_top_target ()->masked_watch_num_registers (addr, mask);
 }
 
 /* The documentation for this function is in its prototype declaration
@@ -3622,7 +3628,7 @@ target_masked_watch_num_registers (CORE_ADDR addr, CORE_ADDR mask)
 int
 target_ranged_break_num_registers (void)
 {
-  return target_stack->ranged_break_num_registers ();
+  return current_top_target ()->ranged_break_num_registers ();
 }
 
 /* See target.h.  */
@@ -3630,7 +3636,7 @@ target_ranged_break_num_registers (void)
 struct btrace_target_info *
 target_enable_btrace (ptid_t ptid, const struct btrace_config *conf)
 {
-  return target_stack->enable_btrace (ptid, conf);
+  return current_top_target ()->enable_btrace (ptid, conf);
 }
 
 /* See target.h.  */
@@ -3638,7 +3644,7 @@ target_enable_btrace (ptid_t ptid, const struct btrace_config *conf)
 void
 target_disable_btrace (struct btrace_target_info *btinfo)
 {
-  target_stack->disable_btrace (btinfo);
+  current_top_target ()->disable_btrace (btinfo);
 }
 
 /* See target.h.  */
@@ -3646,7 +3652,7 @@ target_disable_btrace (struct btrace_target_info *btinfo)
 void
 target_teardown_btrace (struct btrace_target_info *btinfo)
 {
-  target_stack->teardown_btrace (btinfo);
+  current_top_target ()->teardown_btrace (btinfo);
 }
 
 /* See target.h.  */
@@ -3656,7 +3662,7 @@ target_read_btrace (struct btrace_data *btrace,
 		    struct btrace_target_info *btinfo,
 		    enum btrace_read_type type)
 {
-  return target_stack->read_btrace (btrace, btinfo, type);
+  return current_top_target ()->read_btrace (btrace, btinfo, type);
 }
 
 /* See target.h.  */
@@ -3664,7 +3670,7 @@ target_read_btrace (struct btrace_data *btrace,
 const struct btrace_config *
 target_btrace_conf (const struct btrace_target_info *btinfo)
 {
-  return target_stack->btrace_conf (btinfo);
+  return current_top_target ()->btrace_conf (btinfo);
 }
 
 /* See target.h.  */
@@ -3672,7 +3678,7 @@ target_btrace_conf (const struct btrace_target_info *btinfo)
 void
 target_stop_recording (void)
 {
-  target_stack->stop_recording ();
+  current_top_target ()->stop_recording ();
 }
 
 /* See target.h.  */
@@ -3680,7 +3686,7 @@ target_stop_recording (void)
 void
 target_save_record (const char *filename)
 {
-  target_stack->save_record (filename);
+  current_top_target ()->save_record (filename);
 }
 
 /* See target.h.  */
@@ -3688,7 +3694,7 @@ target_save_record (const char *filename)
 int
 target_supports_delete_record ()
 {
-  return target_stack->supports_delete_record ();
+  return current_top_target ()->supports_delete_record ();
 }
 
 /* See target.h.  */
@@ -3696,7 +3702,7 @@ target_supports_delete_record ()
 void
 target_delete_record (void)
 {
-  target_stack->delete_record ();
+  current_top_target ()->delete_record ();
 }
 
 /* See target.h.  */
@@ -3704,7 +3710,7 @@ target_delete_record (void)
 enum record_method
 target_record_method (ptid_t ptid)
 {
-  return target_stack->record_method (ptid);
+  return current_top_target ()->record_method (ptid);
 }
 
 /* See target.h.  */
@@ -3712,7 +3718,7 @@ target_record_method (ptid_t ptid)
 int
 target_record_is_replaying (ptid_t ptid)
 {
-  return target_stack->record_is_replaying (ptid);
+  return current_top_target ()->record_is_replaying (ptid);
 }
 
 /* See target.h.  */
@@ -3720,7 +3726,7 @@ target_record_is_replaying (ptid_t ptid)
 int
 target_record_will_replay (ptid_t ptid, int dir)
 {
-  return target_stack->record_will_replay (ptid, dir);
+  return current_top_target ()->record_will_replay (ptid, dir);
 }
 
 /* See target.h.  */
@@ -3728,7 +3734,7 @@ target_record_will_replay (ptid_t ptid, int dir)
 void
 target_record_stop_replaying (void)
 {
-  target_stack->record_stop_replaying ();
+  current_top_target ()->record_stop_replaying ();
 }
 
 /* See target.h.  */
@@ -3736,7 +3742,7 @@ target_record_stop_replaying (void)
 void
 target_goto_record_begin (void)
 {
-  target_stack->goto_record_begin ();
+  current_top_target ()->goto_record_begin ();
 }
 
 /* See target.h.  */
@@ -3744,7 +3750,7 @@ target_goto_record_begin (void)
 void
 target_goto_record_end (void)
 {
-  target_stack->goto_record_end ();
+  current_top_target ()->goto_record_end ();
 }
 
 /* See target.h.  */
@@ -3752,7 +3758,7 @@ target_goto_record_end (void)
 void
 target_goto_record (ULONGEST insn)
 {
-  target_stack->goto_record (insn);
+  current_top_target ()->goto_record (insn);
 }
 
 /* See target.h.  */
@@ -3760,7 +3766,7 @@ target_goto_record (ULONGEST insn)
 void
 target_insn_history (int size, gdb_disassembly_flags flags)
 {
-  target_stack->insn_history (size, flags);
+  current_top_target ()->insn_history (size, flags);
 }
 
 /* See target.h.  */
@@ -3769,7 +3775,7 @@ void
 target_insn_history_from (ULONGEST from, int size,
 			  gdb_disassembly_flags flags)
 {
-  target_stack->insn_history_from (from, size, flags);
+  current_top_target ()->insn_history_from (from, size, flags);
 }
 
 /* See target.h.  */
@@ -3778,7 +3784,7 @@ void
 target_insn_history_range (ULONGEST begin, ULONGEST end,
 			   gdb_disassembly_flags flags)
 {
-  target_stack->insn_history_range (begin, end, flags);
+  current_top_target ()->insn_history_range (begin, end, flags);
 }
 
 /* See target.h.  */
@@ -3786,7 +3792,7 @@ target_insn_history_range (ULONGEST begin, ULONGEST end,
 void
 target_call_history (int size, record_print_flags flags)
 {
-  target_stack->call_history (size, flags);
+  current_top_target ()->call_history (size, flags);
 }
 
 /* See target.h.  */
@@ -3794,7 +3800,7 @@ target_call_history (int size, record_print_flags flags)
 void
 target_call_history_from (ULONGEST begin, int size, record_print_flags flags)
 {
-  target_stack->call_history_from (begin, size, flags);
+  current_top_target ()->call_history_from (begin, size, flags);
 }
 
 /* See target.h.  */
@@ -3802,7 +3808,7 @@ target_call_history_from (ULONGEST begin, int size, record_print_flags flags)
 void
 target_call_history_range (ULONGEST begin, ULONGEST end, record_print_flags flags)
 {
-  target_stack->call_history_range (begin, end, flags);
+  current_top_target ()->call_history_range (begin, end, flags);
 }
 
 /* See target.h.  */
@@ -3810,7 +3816,7 @@ target_call_history_range (ULONGEST begin, ULONGEST end, record_print_flags flag
 const struct frame_unwind *
 target_get_unwinder (void)
 {
-  return target_stack->get_unwinder ();
+  return current_top_target ()->get_unwinder ();
 }
 
 /* See target.h.  */
@@ -3818,7 +3824,7 @@ target_get_unwinder (void)
 const struct frame_unwind *
 target_get_tailcall_unwinder (void)
 {
-  return target_stack->get_tailcall_unwinder ();
+  return current_top_target ()->get_tailcall_unwinder ();
 }
 
 /* See target.h.  */
@@ -3826,7 +3832,7 @@ target_get_tailcall_unwinder (void)
 void
 target_prepare_to_generate_core (void)
 {
-  target_stack->prepare_to_generate_core ();
+  current_top_target ()->prepare_to_generate_core ();
 }
 
 /* See target.h.  */
@@ -3834,7 +3840,7 @@ target_prepare_to_generate_core (void)
 void
 target_done_generating_core (void)
 {
-  target_stack->done_generating_core ();
+  current_top_target ()->done_generating_core ();
 }
 
 \f
@@ -3904,7 +3910,7 @@ maintenance_print_target_stack (const char *cmd, int from_tty)
 
   printf_filtered (_("The current target stack is:\n"));
 
-  for (t = target_stack; t != NULL; t = t->beneath)
+  for (t = current_top_target (); t != NULL; t = t->beneath)
     {
       if (t->to_stratum == debug_stratum)
 	continue;
@@ -3918,7 +3924,7 @@ void
 target_async (int enable)
 {
   infrun_async (enable);
-  target_stack->async (enable);
+  current_top_target ()->async (enable);
 }
 
 /* See target.h.  */
@@ -3926,7 +3932,7 @@ target_async (int enable)
 void
 target_thread_events (int enable)
 {
-  target_stack->thread_events (enable);
+  current_top_target ()->thread_events (enable);
 }
 
 /* Controls if targets can report that they can/are async.  This is
@@ -3966,7 +3972,7 @@ maint_show_target_async_command (struct ui_file *file, int from_tty,
 static int
 target_always_non_stop_p (void)
 {
-  return target_stack->always_non_stop_p ();
+  return current_top_target ()->always_non_stop_p ();
 }
 
 /* See target.h.  */
diff --git a/gdb/target.h b/gdb/target.h
index e2d1e61cdc..fbd5c53f36 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -1269,12 +1269,12 @@ extern target_ops *get_native_target ();
 /* The ops structure for our "current" target process.  This should
    never be NULL.  If there is no target, it points to the dummy_target.  */
 
-extern struct target_ops *target_stack;
+extern target_ops *current_top_target ();
 
 /* Define easy words for doing these operations on our current target.  */
 
-#define	target_shortname	(target_stack->shortname ())
-#define	target_longname		(target_stack->longname ())
+#define	target_shortname	(current_top_target ()->shortname ())
+#define	target_longname		(current_top_target ()->longname ())
 
 /* Does whatever cleanup is required for a target that we are no
    longer going to be calling.  This routine is automatically always
@@ -1302,7 +1302,7 @@ extern struct target_ops *find_run_target (void);
    These targets must set to_attach_no_wait.  */
 
 #define target_attach_no_wait() \
-  (target_stack->attach_no_wait ())
+  (current_top_target ()->attach_no_wait ())
 
 /* The target_attach operation places a process under debugger control,
    and stops the process.
@@ -1310,7 +1310,7 @@ extern struct target_ops *find_run_target (void);
    This operation provides a target-specific hook that allows the
    necessary bookkeeping to be performed after an attach completes.  */
 #define target_post_attach(pid) \
-     (target_stack->post_attach) (pid)
+     (current_top_target ()->post_attach) (pid)
 
 /* Display a message indicating we're about to detach from the current
    inferior process.  */
@@ -1392,7 +1392,7 @@ extern void target_store_registers (struct regcache *regcache, int regs);
    debugged.  */
 
 #define	target_prepare_to_store(regcache)	\
-     (target_stack->prepare_to_store) (regcache)
+     (current_top_target ()->prepare_to_store) (regcache)
 
 /* Determine current address space of thread PTID.  */
 
@@ -1413,22 +1413,22 @@ int target_supports_disable_randomization (void);
    while a trace experiment is running.  */
 
 #define target_supports_enable_disable_tracepoint() \
-  (target_stack->supports_enable_disable_tracepoint) ()
+  (current_top_target ()->supports_enable_disable_tracepoint) ()
 
 #define target_supports_string_tracing() \
-  (target_stack->supports_string_tracing) ()
+  (current_top_target ()->supports_string_tracing) ()
 
 /* Returns true if this target can handle breakpoint conditions
    on its end.  */
 
 #define target_supports_evaluation_of_breakpoint_conditions() \
-  (target_stack->supports_evaluation_of_breakpoint_conditions) ()
+  (current_top_target ()->supports_evaluation_of_breakpoint_conditions) ()
 
 /* Returns true if this target can handle breakpoint commands
    on its end.  */
 
 #define target_can_run_breakpoint_commands() \
-  (target_stack->can_run_breakpoint_commands) ()
+  (current_top_target ()->can_run_breakpoint_commands) ()
 
 extern int target_read_string (CORE_ADDR, gdb::unique_xmalloc_ptr<char> *,
 			       int, int *);
@@ -1511,7 +1511,7 @@ int target_write_memory_blocks
 /* Print a line about the current target.  */
 
 #define	target_files_info()	\
-     (target_stack->files_info) ()
+     (current_top_target ()->files_info) ()
 
 /* Insert a breakpoint at address BP_TGT->placed_address in
    the target machine.  Returns 0 for success, and returns non-zero or
@@ -1561,7 +1561,7 @@ extern void target_load (const char *arg, int from_tty);
    Such targets will supply an appropriate definition for this function.  */
 
 #define target_post_startup_inferior(ptid) \
-     (target_stack->post_startup_inferior) (ptid)
+     (current_top_target ()->post_startup_inferior) (ptid)
 
 /* On some targets, we can catch an inferior fork or vfork event when
    it occurs.  These functions insert/remove an already-created
@@ -1569,16 +1569,16 @@ extern void target_load (const char *arg, int from_tty);
    catchpoint type is not supported and -1 for failure.  */
 
 #define target_insert_fork_catchpoint(pid) \
-     (target_stack->insert_fork_catchpoint) (pid)
+     (current_top_target ()->insert_fork_catchpoint) (pid)
 
 #define target_remove_fork_catchpoint(pid) \
-     (target_stack->remove_fork_catchpoint) (pid)
+     (current_top_target ()->remove_fork_catchpoint) (pid)
 
 #define target_insert_vfork_catchpoint(pid) \
-     (target_stack->insert_vfork_catchpoint) (pid)
+     (current_top_target ()->insert_vfork_catchpoint) (pid)
 
 #define target_remove_vfork_catchpoint(pid) \
-     (target_stack->remove_vfork_catchpoint) (pid)
+     (current_top_target ()->remove_vfork_catchpoint) (pid)
 
 /* If the inferior forks or vforks, this function will be called at
    the next resume in order to perform any bookkeeping and fiddling
@@ -1601,10 +1601,10 @@ void target_follow_exec (struct inferior *inf, char *execd_pathname);
    catchpoint type is not supported and -1 for failure.  */
 
 #define target_insert_exec_catchpoint(pid) \
-     (target_stack->insert_exec_catchpoint) (pid)
+     (current_top_target ()->insert_exec_catchpoint) (pid)
 
 #define target_remove_exec_catchpoint(pid) \
-     (target_stack->remove_exec_catchpoint) (pid)
+     (current_top_target ()->remove_exec_catchpoint) (pid)
 
 /* Syscall catch.
 
@@ -1623,7 +1623,7 @@ void target_follow_exec (struct inferior *inf, char *execd_pathname);
    for failure.  */
 
 #define target_set_syscall_catchpoint(pid, needed, any_count, syscall_counts) \
-     (target_stack->set_syscall_catchpoint) (pid, needed, any_count, \
+     (current_top_target ()->set_syscall_catchpoint) (pid, needed, any_count, \
 					     syscall_counts)
 
 /* The debugger has completed a blocking wait() call.  There is now
@@ -1707,7 +1707,7 @@ extern void default_target_pass_ctrlc (struct target_ops *ops);
    placed in OUTBUF.  */
 
 #define target_rcmd(command, outbuf) \
-     (target_stack->rcmd) (command, outbuf)
+     (current_top_target ()->rcmd) (command, outbuf)
 
 
 /* Does the target include all of memory, or only part of it?  This
@@ -1762,16 +1762,16 @@ extern int default_child_has_execution (ptid_t the_ptid);
    Can it lock the thread scheduler?  */
 
 #define target_can_lock_scheduler \
-  (target_stack->get_thread_control_capabilities () & tc_schedlock)
+  (current_top_target ()->get_thread_control_capabilities () & tc_schedlock)
 
 /* Controls whether async mode is permitted.  */
 extern int target_async_permitted;
 
 /* Can the target support asynchronous execution?  */
-#define target_can_async_p() (target_stack->can_async_p ())
+#define target_can_async_p() (current_top_target ()->can_async_p ())
 
 /* Is the target in asynchronous execution mode?  */
-#define target_is_async_p() (target_stack->is_async_p ())
+#define target_is_async_p() (current_top_target ()->is_async_p ())
 
 /* Enables/disabled async target events.  */
 extern void target_async (int enable);
@@ -1789,7 +1789,7 @@ extern enum auto_boolean target_non_stop_enabled;
 extern int target_is_non_stop_p (void);
 
 #define target_execution_direction() \
-  (target_stack->execution_direction ())
+  (current_top_target ()->execution_direction ())
 
 /* Converts a process id to a string.  Usually, the string just contains
    `process xyz', but on some systems it may contain
@@ -1804,7 +1804,7 @@ extern const char *normal_pid_to_str (ptid_t ptid);
    is okay.  */
 
 #define target_extra_thread_info(TP) \
-     (target_stack->extra_thread_info (TP))
+     (current_top_target ()->extra_thread_info (TP))
 
 /* Return the thread's name, or NULL if the target is unable to determine it.
    The returned value must not be freed by the caller.  */
@@ -1830,12 +1830,12 @@ extern struct thread_info *target_thread_handle_to_thread_info
    it must persist.  */
 
 #define target_pid_to_exec_file(pid) \
-     (target_stack->pid_to_exec_file) (pid)
+     (current_top_target ()->pid_to_exec_file) (pid)
 
 /* See the to_thread_architecture description in struct target_ops.  */
 
 #define target_thread_architecture(ptid) \
-     (target_stack->thread_architecture (ptid))
+     (current_top_target ()->thread_architecture (ptid))
 
 /*
  * Iterator function for target memory regions.
@@ -1845,21 +1845,21 @@ extern struct thread_info *target_thread_handle_to_thread_info
  */
 
 #define target_find_memory_regions(FUNC, DATA) \
-     (target_stack->find_memory_regions) (FUNC, DATA)
+     (current_top_target ()->find_memory_regions) (FUNC, DATA)
 
 /*
  * Compose corefile .note section.
  */
 
 #define target_make_corefile_notes(BFD, SIZE_P) \
-     (target_stack->make_corefile_notes) (BFD, SIZE_P)
+     (current_top_target ()->make_corefile_notes) (BFD, SIZE_P)
 
 /* Bookmark interfaces.  */
 #define target_get_bookmark(ARGS, FROM_TTY) \
-     (target_stack->get_bookmark) (ARGS, FROM_TTY)
+     (current_top_target ()->get_bookmark) (ARGS, FROM_TTY)
 
 #define target_goto_bookmark(ARG, FROM_TTY) \
-     (target_stack->goto_bookmark) (ARG, FROM_TTY)
+     (current_top_target ()->goto_bookmark) (ARG, FROM_TTY)
 
 /* Hardware watchpoint interfaces.  */
 
@@ -1867,32 +1867,32 @@ extern struct thread_info *target_thread_handle_to_thread_info
    write).  Only the INFERIOR_PTID task is being queried.  */
 
 #define target_stopped_by_watchpoint()		\
-  ((target_stack->stopped_by_watchpoint) ())
+  ((current_top_target ()->stopped_by_watchpoint) ())
 
 /* Returns non-zero if the target stopped because it executed a
    software breakpoint instruction.  */
 
 #define target_stopped_by_sw_breakpoint()		\
-  ((target_stack->stopped_by_sw_breakpoint) ())
+  ((current_top_target ()->stopped_by_sw_breakpoint) ())
 
 #define target_supports_stopped_by_sw_breakpoint() \
-  ((target_stack->supports_stopped_by_sw_breakpoint) ())
+  ((current_top_target ()->supports_stopped_by_sw_breakpoint) ())
 
 #define target_stopped_by_hw_breakpoint()				\
-  ((target_stack->stopped_by_hw_breakpoint) ())
+  ((current_top_target ()->stopped_by_hw_breakpoint) ())
 
 #define target_supports_stopped_by_hw_breakpoint() \
-  ((target_stack->supports_stopped_by_hw_breakpoint) ())
+  ((current_top_target ()->supports_stopped_by_hw_breakpoint) ())
 
 /* Non-zero if we have steppable watchpoints  */
 
 #define target_have_steppable_watchpoint \
-  (target_stack->have_steppable_watchpoint ())
+  (current_top_target ()->have_steppable_watchpoint ())
 
 /* Non-zero if we have continuable watchpoints  */
 
 #define target_have_continuable_watchpoint \
-  (target_stack->have_continuable_watchpoint ())
+  (current_top_target ()->have_continuable_watchpoint ())
 
 /* Provide defaults for hardware watchpoint functions.  */
 
@@ -1909,18 +1909,18 @@ extern struct thread_info *target_thread_handle_to_thread_info
    this one used so far.  */
 
 #define target_can_use_hardware_watchpoint(TYPE,CNT,OTHERTYPE) \
- (target_stack->can_use_hw_breakpoint) ( \
+ (current_top_target ()->can_use_hw_breakpoint) ( \
 					     TYPE, CNT, OTHERTYPE)
 
 /* Returns the number of debug registers needed to watch the given
    memory region, or zero if not supported.  */
 
 #define target_region_ok_for_hw_watchpoint(addr, len) \
-    (target_stack->region_ok_for_hw_watchpoint) (addr, len)
+    (current_top_target ()->region_ok_for_hw_watchpoint) (addr, len)
 
 
 #define target_can_do_single_step() \
-  (target_stack->can_do_single_step) ()
+  (current_top_target ()->can_do_single_step) ()
 
 /* Set/clear a hardware watchpoint starting at ADDR, for LEN bytes.
    TYPE is 0 for write, 1 for read, and 2 for read/write accesses.
@@ -1929,10 +1929,10 @@ extern struct thread_info *target_thread_handle_to_thread_info
    -1 for failure.  */
 
 #define	target_insert_watchpoint(addr, len, type, cond) \
-     (target_stack->insert_watchpoint) (addr, len, type, cond)
+     (current_top_target ()->insert_watchpoint) (addr, len, type, cond)
 
 #define	target_remove_watchpoint(addr, len, type, cond) \
-     (target_stack->remove_watchpoint) (addr, len, type, cond)
+     (current_top_target ()->remove_watchpoint) (addr, len, type, cond)
 
 /* Insert a new masked watchpoint at ADDR using the mask MASK.
    RW may be hw_read for a read watchpoint, hw_write for a write watchpoint
@@ -1956,10 +1956,10 @@ extern int target_remove_mask_watchpoint (CORE_ADDR, CORE_ADDR,
    message) otherwise.  */
 
 #define target_insert_hw_breakpoint(gdbarch, bp_tgt) \
-     (target_stack->insert_hw_breakpoint) (gdbarch, bp_tgt)
+     (current_top_target ()->insert_hw_breakpoint) (gdbarch, bp_tgt)
 
 #define target_remove_hw_breakpoint(gdbarch, bp_tgt) \
-     (target_stack->remove_hw_breakpoint) (gdbarch, bp_tgt)
+     (current_top_target ()->remove_hw_breakpoint) (gdbarch, bp_tgt)
 
 /* Return number of debug registers needed for a ranged breakpoint,
    or -1 if ranged breakpoints are not supported.  */
@@ -1988,7 +1988,7 @@ extern int target_ranged_break_num_registers (void);
    For this reason, GDB will still evaluate the condition expression when
    the watchpoint triggers.  */
 #define target_can_accel_watchpoint_condition(addr, len, type, cond) \
-  (target_stack->can_accel_watchpoint_condition) (addr, len, type, cond)
+  (current_top_target ()->can_accel_watchpoint_condition) (addr, len, type, cond)
 
 /* Return number of debug registers needed for a masked watchpoint,
    -1 if masked watchpoints are not supported or -2 if the given address
@@ -1998,12 +1998,12 @@ extern int target_masked_watch_num_registers (CORE_ADDR addr, CORE_ADDR mask);
 
 /* Target can execute in reverse?  */
 #define target_can_execute_reverse \
-      target_stack->can_execute_reverse ()
+      current_top_target ()->can_execute_reverse ()
 
 extern const struct target_desc *target_read_description (struct target_ops *);
 
 #define target_get_ada_task_ptid(lwp, tid) \
-     (target_stack->get_ada_task_ptid) (lwp,tid)
+     (current_top_target ()->get_ada_task_ptid) (lwp,tid)
 
 /* Utility implementation of searching memory.  */
 extern int simple_search_memory (struct target_ops* ops,
@@ -2025,7 +2025,7 @@ extern int target_search_memory (CORE_ADDR start_addr,
 /* Return nonzero if the filesystem seen by the current inferior
    is the local filesystem, zero otherwise.  */
 #define target_filesystem_is_local() \
-  target_stack->filesystem_is_local ()
+  current_top_target ()->filesystem_is_local ()
 
 /* Open FILENAME on the target, in the filesystem as seen by INF,
    using FLAGS and MODE.  If INF is NULL, use the filesystem seen
@@ -2112,100 +2112,100 @@ extern gdb::unique_xmalloc_ptr<char> target_fileio_read_stralloc
 /* Tracepoint-related operations.  */
 
 #define target_trace_init() \
-  (target_stack->trace_init) ()
+  (current_top_target ()->trace_init) ()
 
 #define target_download_tracepoint(t) \
-  (target_stack->download_tracepoint) (t)
+  (current_top_target ()->download_tracepoint) (t)
 
 #define target_can_download_tracepoint() \
-  (target_stack->can_download_tracepoint) ()
+  (current_top_target ()->can_download_tracepoint) ()
 
 #define target_download_trace_state_variable(tsv) \
-  (target_stack->download_trace_state_variable) (tsv)
+  (current_top_target ()->download_trace_state_variable) (tsv)
 
 #define target_enable_tracepoint(loc) \
-  (target_stack->enable_tracepoint) (loc)
+  (current_top_target ()->enable_tracepoint) (loc)
 
 #define target_disable_tracepoint(loc) \
-  (target_stack->disable_tracepoint) (loc)
+  (current_top_target ()->disable_tracepoint) (loc)
 
 #define target_trace_start() \
-  (target_stack->trace_start) ()
+  (current_top_target ()->trace_start) ()
 
 #define target_trace_set_readonly_regions() \
-  (target_stack->trace_set_readonly_regions) ()
+  (current_top_target ()->trace_set_readonly_regions) ()
 
 #define target_get_trace_status(ts) \
-  (target_stack->get_trace_status) (ts)
+  (current_top_target ()->get_trace_status) (ts)
 
 #define target_get_tracepoint_status(tp,utp)		\
-  (target_stack->get_tracepoint_status) (tp, utp)
+  (current_top_target ()->get_tracepoint_status) (tp, utp)
 
 #define target_trace_stop() \
-  (target_stack->trace_stop) ()
+  (current_top_target ()->trace_stop) ()
 
 #define target_trace_find(type,num,addr1,addr2,tpp) \
-  (target_stack->trace_find) (\
+  (current_top_target ()->trace_find) (\
 				   (type), (num), (addr1), (addr2), (tpp))
 
 #define target_get_trace_state_variable_value(tsv,val) \
-  (target_stack->get_trace_state_variable_value) ((tsv), (val))
+  (current_top_target ()->get_trace_state_variable_value) ((tsv), (val))
 
 #define target_save_trace_data(filename) \
-  (target_stack->save_trace_data) (filename)
+  (current_top_target ()->save_trace_data) (filename)
 
 #define target_upload_tracepoints(utpp) \
-  (target_stack->upload_tracepoints) (utpp)
+  (current_top_target ()->upload_tracepoints) (utpp)
 
 #define target_upload_trace_state_variables(utsvp) \
-  (target_stack->upload_trace_state_variables) (utsvp)
+  (current_top_target ()->upload_trace_state_variables) (utsvp)
 
 #define target_get_raw_trace_data(buf,offset,len) \
-  (target_stack->get_raw_trace_data) ((buf), (offset), (len))
+  (current_top_target ()->get_raw_trace_data) ((buf), (offset), (len))
 
 #define target_get_min_fast_tracepoint_insn_len() \
-  (target_stack->get_min_fast_tracepoint_insn_len) ()
+  (current_top_target ()->get_min_fast_tracepoint_insn_len) ()
 
 #define target_set_disconnected_tracing(val) \
-  (target_stack->set_disconnected_tracing) (val)
+  (current_top_target ()->set_disconnected_tracing) (val)
 
 #define	target_set_circular_trace_buffer(val)	\
-  (target_stack->set_circular_trace_buffer) (val)
+  (current_top_target ()->set_circular_trace_buffer) (val)
 
 #define	target_set_trace_buffer_size(val)	\
-  (target_stack->set_trace_buffer_size) (val)
+  (current_top_target ()->set_trace_buffer_size) (val)
 
 #define	target_set_trace_notes(user,notes,stopnotes)		\
-  (target_stack->set_trace_notes) ((user), (notes), (stopnotes))
+  (current_top_target ()->set_trace_notes) ((user), (notes), (stopnotes))
 
 #define target_get_tib_address(ptid, addr) \
-  (target_stack->get_tib_address) ((ptid), (addr))
+  (current_top_target ()->get_tib_address) ((ptid), (addr))
 
 #define target_set_permissions() \
-  (target_stack->set_permissions) ()
+  (current_top_target ()->set_permissions) ()
 
 #define target_static_tracepoint_marker_at(addr, marker) \
-  (target_stack->static_tracepoint_marker_at) (addr, marker)
+  (current_top_target ()->static_tracepoint_marker_at) (addr, marker)
 
 #define target_static_tracepoint_markers_by_strid(marker_id) \
-  (target_stack->static_tracepoint_markers_by_strid) (marker_id)
+  (current_top_target ()->static_tracepoint_markers_by_strid) (marker_id)
 
 #define target_traceframe_info() \
-  (target_stack->traceframe_info) ()
+  (current_top_target ()->traceframe_info) ()
 
 #define target_use_agent(use) \
-  (target_stack->use_agent) (use)
+  (current_top_target ()->use_agent) (use)
 
 #define target_can_use_agent() \
-  (target_stack->can_use_agent) ()
+  (current_top_target ()->can_use_agent) ()
 
 #define target_augmented_libraries_svr4_read() \
-  (target_stack->augmented_libraries_svr4_read) ()
+  (current_top_target ()->augmented_libraries_svr4_read) ()
 
 /* Command logging facility.  */
 
 #define target_log_command(p)					\
-  (target_stack->log_command) (p)
+  (current_top_target ()->log_command) (p)
 
 
 extern int target_core_of_thread (ptid_t ptid);
diff --git a/gdb/tracefile-tfile.c b/gdb/tracefile-tfile.c
index f4fdd3674d..f6844a6ba0 100644
--- a/gdb/tracefile-tfile.c
+++ b/gdb/tracefile-tfile.c
@@ -307,7 +307,7 @@ tfile_write_tdesc (struct trace_file_writer *self)
     = (struct tfile_trace_file_writer *) self;
 
   gdb::optional<std::string> tdesc
-    = target_fetch_description_xml (target_stack);
+    = target_fetch_description_xml (current_top_target ());
 
   if (!tdesc)
     return;
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index d99d663895..5af3cfe202 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -3792,7 +3792,7 @@ sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
 {
   /* We need to read the whole object before we know its size.  */
   gdb::optional<gdb::byte_vector> buf
-    = target_read_alloc (target_stack, TARGET_OBJECT_STATIC_TRACE_DATA,
+    = target_read_alloc (current_top_target (), TARGET_OBJECT_STATIC_TRACE_DATA,
 			 NULL);
   if (buf)
     {
diff --git a/gdb/valops.c b/gdb/valops.c
index 62a86c06a3..85aa89efef 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -964,7 +964,7 @@ read_value_memory (struct value *val, LONGEST bit_offset,
       enum target_xfer_status status;
       ULONGEST xfered_partial;
 
-      status = target_xfer_partial (target_stack,
+      status = target_xfer_partial (current_top_target (),
 				    object, NULL,
 				    buffer + xfered_total * unit_size, NULL,
 				    memaddr + xfered_total,
@@ -1208,7 +1208,7 @@ value_assign (struct value *toval, struct value *fromval)
     case lval_register:
     case lval_computed:
 
-      gdb::observers::target_changed.notify (target_stack);
+      gdb::observers::target_changed.notify (current_top_target ());
 
       /* Having destroyed the frame cache, restore the selected
 	 frame.  */
diff --git a/gdb/valprint.c b/gdb/valprint.c
index bed2cecf2c..aa3156ec6a 100644
--- a/gdb/valprint.c
+++ b/gdb/valprint.c
@@ -1885,7 +1885,7 @@ print_function_pointer_address (const struct value_print_options *options,
 {
   CORE_ADDR func_addr
     = gdbarch_convert_from_func_ptr_addr (gdbarch, address,
-					  target_stack);
+					  current_top_target ());
 
   /* If the function pointer is represented by a description, print
      the address of the description.  */
diff --git a/gdb/value.c b/gdb/value.c
index 6bb6b8eb61..47588f2bef 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -3062,7 +3062,7 @@ value_fn_field (struct value **arg1p, struct fn_field *f,
 
       set_value_address (v,
 	gdbarch_convert_from_func_ptr_addr
-	   (gdbarch, BMSYMBOL_VALUE_ADDRESS (msym), target_stack));
+	   (gdbarch, BMSYMBOL_VALUE_ADDRESS (msym), current_top_target ()));
     }
 
   if (arg1p)
diff --git a/gdb/windows-tdep.c b/gdb/windows-tdep.c
index eb44d8d407..430d44b2ed 100644
--- a/gdb/windows-tdep.c
+++ b/gdb/windows-tdep.c
@@ -331,7 +331,7 @@ display_one_tib (ptid_t ptid)
       return -1;
     }
 
-  if (target_read (target_stack, TARGET_OBJECT_MEMORY,
+  if (target_read (current_top_target (), TARGET_OBJECT_MEMORY,
 		   NULL, tib, thread_local_base, tib_size) != tib_size)
     {
       printf_filtered (_("Unable to read thread information "
-- 
2.14.3

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

* [PATCH 0/4] Change target stack representation
@ 2018-05-28 16:10 Pedro Alves
  2018-05-28 16:10 ` [PATCH 1/4] target_stack -> current_top_target() throughout Pedro Alves
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Pedro Alves @ 2018-05-28 16:10 UTC (permalink / raw)
  To: gdb-patches

Another week, another piece off of the multi-target branch.

This is preparation for being able to have multiple target stacks in
GDB, so that we can have a target stack for inferior 1 debugging a
core, a target stack for inferior 2 debugging a native process, a
target stack for inferior 3 debugging a remote process, etc.

More details in the individual patches.

Pedro Alves (4):
  target_stack -> current_top_target() throughout
  target_ops::beneath -> target_ops::beneath()
  Eliminate find_target_beneath
  Introduce class target_stack

 gdb/aix-thread.c          |   29 +-
 gdb/auxv.c                |    4 +-
 gdb/avr-tdep.c            |    4 +-
 gdb/breakpoint.c          |    7 +-
 gdb/bsd-uthread.c         |   18 +-
 gdb/corefile.c            |    2 +-
 gdb/corelow.c             |    8 +-
 gdb/elfread.c             |    9 +-
 gdb/eval.c                |    2 +-
 gdb/exceptions.c          |    2 +-
 gdb/frame.c               |    2 +-
 gdb/gdbarch-selftests.c   |    2 +-
 gdb/gnu-v3-abi.c          |    2 +-
 gdb/ia64-tdep.c           |    2 +-
 gdb/ia64-vms-tdep.c       |    2 +-
 gdb/infcall.c             |    7 +-
 gdb/infcmd.c              |   18 +-
 gdb/infrun.c              |   12 +-
 gdb/linespec.c            |    2 +-
 gdb/linux-tdep.c          |   19 +-
 gdb/linux-thread-db.c     |   24 +-
 gdb/make-target-delegates |    8 +-
 gdb/mi/mi-main.c          |    8 +-
 gdb/minsyms.c             |    5 +-
 gdb/ppc-linux-nat.c       |    2 +-
 gdb/ppc-linux-tdep.c      |    4 +-
 gdb/procfs.c              |    2 +-
 gdb/ravenscar-thread.c    |   39 +-
 gdb/record-btrace.c       |   38 +-
 gdb/record-full.c         |   44 +-
 gdb/regcache.c            |    4 +-
 gdb/remote.c              |   16 +-
 gdb/rs6000-tdep.c         |    2 +-
 gdb/s390-linux-nat.c      |    2 +-
 gdb/s390-tdep.c           |    2 +-
 gdb/sol-thread.c          |   32 +-
 gdb/solib-aix.c           |    2 +-
 gdb/solib-darwin.c        |    4 +-
 gdb/solib-dsbt.c          |    4 +-
 gdb/solib-spu.c           |    6 +-
 gdb/solib-svr4.c          |   23 +-
 gdb/solib-target.c        |    3 +-
 gdb/sparc-tdep.c          |    2 +-
 gdb/sparc64-tdep.c        |    4 +-
 gdb/spu-multiarch.c       |   33 +-
 gdb/spu-tdep.c            |   32 +-
 gdb/symfile.c             |    2 +-
 gdb/symtab.c              |    7 +-
 gdb/target-delegates.c    | 1280 ++++++++++++++++++++++-----------------------
 gdb/target-descriptions.c |    4 +-
 gdb/target-memory.c       |    4 +-
 gdb/target.c              |  361 ++++++-------
 gdb/target.h              |  211 +++++---
 gdb/tracefile-tfile.c     |    2 +-
 gdb/tracepoint.c          |    2 +-
 gdb/valops.c              |    4 +-
 gdb/valprint.c            |    2 +-
 gdb/value.c               |    2 +-
 gdb/windows-tdep.c        |    2 +-
 59 files changed, 1177 insertions(+), 1204 deletions(-)

-- 
2.14.3

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

* [PATCH 2/4] target_ops::beneath -> target_ops::beneath()
  2018-05-28 16:10 [PATCH 0/4] Change target stack representation Pedro Alves
  2018-05-28 16:10 ` [PATCH 1/4] target_stack -> current_top_target() throughout Pedro Alves
@ 2018-05-28 16:19 ` Pedro Alves
  2018-05-28 17:39 ` [PATCH 3/4] Eliminate find_target_beneath Pedro Alves
  2018-05-28 17:47 ` [PATCH 4/4] Introduce class target_stack Pedro Alves
  3 siblings, 0 replies; 9+ messages in thread
From: Pedro Alves @ 2018-05-28 16:19 UTC (permalink / raw)
  To: gdb-patches

This changes target_ops::beneath from a pointer to a method, and
adjusts all references throughout.  The idea here is to make it easier
to change the target stack representation from an intrusive singly
linked list to something else without leaking implementation details
throughout.

The commit does not change the representation yet, that will be done
in a following patch.  That is why a new target_ops::m_beneath field
appears here.  That new field isn't really documented properly or made
private, simply because it will be removed shortly.

Note that target_ops::beneath() is essentially the same as the current
find_target_beneath routine.  The following patch will eliminate the
latter.

gdb/ChangeLog:
yyyy-mm-dd  Pedro Alves  <palves@redhat.com>

	* target.h (target_ops) <beneath>: Now a method.  All references
	updated.
	(target_ops) <m_beneath>: New.
	* target.c (target_ops::beneath): New.
	* corelow.c: Adjust all references to target_ops::beneath.
	* linux-thread-db.c: Likewise.
	* make-target-delegates: Likewise.
	* record-btrace.c: Likewise.
	* record-full.c: Likewise.
	* remote.c: Likewise.
	* target.c: Likewise.

	* target-delegates.c: Regenerate.
---
 gdb/corelow.c             |    8 +-
 gdb/linux-thread-db.c     |    2 +-
 gdb/make-target-delegates |    8 +-
 gdb/record-btrace.c       |   38 +-
 gdb/record-full.c         |   44 +-
 gdb/remote.c              |    4 +-
 gdb/target-delegates.c    | 1280 ++++++++++++++++++++++-----------------------
 gdb/target.c              |   91 ++--
 gdb/target.h              |    4 +-
 9 files changed, 732 insertions(+), 747 deletions(-)

diff --git a/gdb/corelow.c b/gdb/corelow.c
index c6175279da..379b20e753 100644
--- a/gdb/corelow.c
+++ b/gdb/corelow.c
@@ -950,9 +950,9 @@ core_target::xfer_partial (enum target_object object, const char *annex,
       return TARGET_XFER_E_IO;
 
     default:
-      return this->beneath->xfer_partial (object, annex, readbuf,
-					  writebuf, offset, len,
-					  xfered_len);
+      return this->beneath ()->xfer_partial (object, annex, readbuf,
+					     writebuf, offset, len,
+					     xfered_len);
     }
 }
 
@@ -987,7 +987,7 @@ core_target::read_description ()
 	return result;
     }
 
-  return this->beneath->read_description ();
+  return this->beneath ()->read_description ();
 }
 
 const char *
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
index 8feab6f0ca..920e15edf4 100644
--- a/gdb/linux-thread-db.c
+++ b/gdb/linux-thread-db.c
@@ -1369,7 +1369,7 @@ thread_db_target::update_thread_list ()
     }
 
   /* Give the beneath target a chance to do extra processing.  */
-  this->beneath->update_thread_list ();
+  this->beneath ()->update_thread_list ();
 }
 
 const char *
diff --git a/gdb/make-target-delegates b/gdb/make-target-delegates
index b8cf63cd0b..28b49a4e8f 100755
--- a/gdb/make-target-delegates
+++ b/gdb/make-target-delegates
@@ -225,7 +225,7 @@ sub write_delegator($$@) {
     if ($return_type ne 'void') {
 	print "return ";
     }
-    print "this->beneath->" . $name . " (";
+    print "this->beneath ()->" . $name . " (";
     print join (', ', @names);
     print ");\n";
     print "}\n\n";
@@ -309,19 +309,19 @@ sub write_debugmethod($$$@) {
 	print "  $return_type result;\n";
     }
 
-    print "  fprintf_unfiltered (gdb_stdlog, \"-> %s->$name (...)\\n\", this->beneath->shortname ());\n";
+    print "  fprintf_unfiltered (gdb_stdlog, \"-> %s->$name (...)\\n\", this->beneath ()->shortname ());\n";
 
     # Delegate to the beneath target.
     print "  ";
     if ($return_type ne 'void') {
 	print "result = ";
     }
-    print "this->beneath->" . $name . " (";
+    print "this->beneath ()->" . $name . " (";
     print join (', ', @names);
     print ");\n";
 
     # Now print the arguments.
-    print "  fprintf_unfiltered (gdb_stdlog, \"<- %s->$name (\", this->beneath->shortname ());\n";
+    print "  fprintf_unfiltered (gdb_stdlog, \"<- %s->$name (\", this->beneath ()->shortname ());\n";
     for my $i (0 .. $#argtypes) {
 	if ($i > 0) {
 	    print "  fputs_unfiltered (\", \", gdb_stdlog);\n"
diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
index 4249b1da1f..218f750f67 100644
--- a/gdb/record-btrace.c
+++ b/gdb/record-btrace.c
@@ -423,7 +423,7 @@ void
 record_btrace_target::disconnect (const char *args,
 				  int from_tty)
 {
-  struct target_ops *beneath = this->beneath;
+  struct target_ops *beneath = this->beneath ();
 
   /* Do not stop recording, just clean up GDB side.  */
   unpush_target (this);
@@ -462,7 +462,7 @@ record_btrace_target::async (int enable)
   else
     clear_async_event_handler (record_btrace_async_inferior_event_handler);
 
-  this->beneath->async (enable);
+  this->beneath ()->async (enable);
 }
 
 /* Adjusts the size and returns a human readable size suffix.  */
@@ -1463,8 +1463,8 @@ record_btrace_target::xfer_partial (enum target_object object,
     }
 
   /* Forward the request.  */
-  return this->beneath->xfer_partial (object, annex, readbuf, writebuf,
-				      offset, len, xfered_len);
+  return this->beneath ()->xfer_partial (object, annex, readbuf, writebuf,
+					 offset, len, xfered_len);
 }
 
 /* The insert_breakpoint method of target record-btrace.  */
@@ -1484,7 +1484,7 @@ record_btrace_target::insert_breakpoint (struct gdbarch *gdbarch,
   ret = 0;
   TRY
     {
-      ret = this->beneath->insert_breakpoint (gdbarch, bp_tgt);
+      ret = this->beneath ()->insert_breakpoint (gdbarch, bp_tgt);
     }
   CATCH (except, RETURN_MASK_ALL)
     {
@@ -1515,7 +1515,7 @@ record_btrace_target::remove_breakpoint (struct gdbarch *gdbarch,
   ret = 0;
   TRY
     {
-      ret = this->beneath->remove_breakpoint (gdbarch, bp_tgt, reason);
+      ret = this->beneath ()->remove_breakpoint (gdbarch, bp_tgt, reason);
     }
   CATCH (except, RETURN_MASK_ALL)
     {
@@ -1561,7 +1561,7 @@ record_btrace_target::fetch_registers (struct regcache *regcache, int regno)
       regcache_raw_supply (regcache, regno, &insn->pc);
     }
   else
-    this->beneath->fetch_registers (regcache, regno);
+    this->beneath ()->fetch_registers (regcache, regno);
 }
 
 /* The store_registers method of target record-btrace.  */
@@ -1577,7 +1577,7 @@ record_btrace_target::store_registers (struct regcache *regcache, int regno)
 
   gdb_assert (may_write_registers != 0);
 
-  this->beneath->store_registers (regcache, regno);
+  this->beneath ()->store_registers (regcache, regno);
 }
 
 /* The prepare_to_store method of target record-btrace.  */
@@ -1589,7 +1589,7 @@ record_btrace_target::prepare_to_store (struct regcache *regcache)
       && record_is_replaying (regcache_get_ptid (regcache)))
     return;
 
-  this->beneath->prepare_to_store (regcache);
+  this->beneath ()->prepare_to_store (regcache);
 }
 
 /* The branch trace frame cache.  */
@@ -2161,7 +2161,7 @@ record_btrace_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
   if ((::execution_direction != EXEC_REVERSE)
       && !record_is_replaying (minus_one_ptid))
     {
-      this->beneath->resume (ptid, step, signal);
+      this->beneath ()->resume (ptid, step, signal);
       return;
     }
 
@@ -2216,7 +2216,7 @@ record_btrace_target::commit_resume ()
 {
   if ((::execution_direction != EXEC_REVERSE)
       && !record_is_replaying (minus_one_ptid))
-    beneath->commit_resume ();
+    beneath ()->commit_resume ();
 }
 
 /* Cancel resuming TP.  */
@@ -2561,7 +2561,7 @@ record_btrace_target::wait (ptid_t ptid, struct target_waitstatus *status,
   if ((::execution_direction != EXEC_REVERSE)
       && !record_is_replaying (minus_one_ptid))
     {
-      return this->beneath->wait (ptid, status, options);
+      return this->beneath ()->wait (ptid, status, options);
     }
 
   /* Keep a work list of moving threads.  */
@@ -2690,7 +2690,7 @@ record_btrace_target::stop (ptid_t ptid)
   if ((::execution_direction != EXEC_REVERSE)
       && !record_is_replaying (minus_one_ptid))
     {
-      this->beneath->stop (ptid);
+      this->beneath ()->stop (ptid);
     }
   else
     {
@@ -2725,7 +2725,7 @@ record_btrace_target::stopped_by_sw_breakpoint ()
       return tp->btrace.stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT;
     }
 
-  return this->beneath->stopped_by_sw_breakpoint ();
+  return this->beneath ()->stopped_by_sw_breakpoint ();
 }
 
 /* The supports_stopped_by_sw_breakpoint method of target
@@ -2737,7 +2737,7 @@ record_btrace_target::supports_stopped_by_sw_breakpoint ()
   if (record_is_replaying (minus_one_ptid))
     return true;
 
-  return this->beneath->supports_stopped_by_sw_breakpoint ();
+  return this->beneath ()->supports_stopped_by_sw_breakpoint ();
 }
 
 /* The stopped_by_sw_breakpoint method of target record-btrace.  */
@@ -2752,7 +2752,7 @@ record_btrace_target::stopped_by_hw_breakpoint ()
       return tp->btrace.stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT;
     }
 
-  return this->beneath->stopped_by_hw_breakpoint ();
+  return this->beneath ()->stopped_by_hw_breakpoint ();
 }
 
 /* The supports_stopped_by_hw_breakpoint method of target
@@ -2764,7 +2764,7 @@ record_btrace_target::supports_stopped_by_hw_breakpoint ()
   if (record_is_replaying (minus_one_ptid))
     return true;
 
-  return this->beneath->supports_stopped_by_hw_breakpoint ();
+  return this->beneath ()->supports_stopped_by_hw_breakpoint ();
 }
 
 /* The update_thread_list method of target record-btrace.  */
@@ -2777,7 +2777,7 @@ record_btrace_target::update_thread_list ()
     return;
 
   /* Forward the request.  */
-  this->beneath->update_thread_list ();
+  this->beneath ()->update_thread_list ();
 }
 
 /* The thread_alive method of target record-btrace.  */
@@ -2790,7 +2790,7 @@ record_btrace_target::thread_alive (ptid_t ptid)
     return find_thread_ptid (ptid) != NULL;
 
   /* Forward the request.  */
-  return this->beneath->thread_alive (ptid);
+  return this->beneath ()->thread_alive (ptid);
 }
 
 /* Set the replay branch trace instruction iterator.  If IT is NULL, replay
diff --git a/gdb/record-full.c b/gdb/record-full.c
index 79f5c0fa0a..243b9920ba 100644
--- a/gdb/record-full.c
+++ b/gdb/record-full.c
@@ -1040,7 +1040,7 @@ record_full_base_target::async (int enable)
   else
     clear_async_event_handler (record_full_async_inferior_event_token);
 
-  beneath->async (enable);
+  beneath ()->async (enable);
 }
 
 static int record_full_resume_step = 0;
@@ -1105,7 +1105,7 @@ record_full_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
       /* Make sure the target beneath reports all signals.  */
       target_pass_signals (0, NULL);
 
-      this->beneath->resume (ptid, step, signal);
+      this->beneath ()->resume (ptid, step, signal);
     }
 
   /* We are about to start executing the inferior (or simulate it),
@@ -1120,7 +1120,7 @@ void
 record_full_target::commit_resume ()
 {
   if (!RECORD_FULL_IS_REPLAY)
-    beneath->commit_resume ();
+    beneath ()->commit_resume ();
 }
 
 static int record_full_get_sig = 0;
@@ -1202,7 +1202,7 @@ record_full_wait_1 (struct target_ops *ops,
       if (record_full_resume_step)
 	{
 	  /* This is a single step.  */
-	  return ops->beneath->wait (ptid, status, options);
+	  return ops->beneath ()->wait (ptid, status, options);
 	}
       else
 	{
@@ -1215,7 +1215,7 @@ record_full_wait_1 (struct target_ops *ops,
 	    {
 	      struct thread_info *tp;
 
-	      ret = ops->beneath->wait (ptid, status, options);
+	      ret = ops->beneath ()->wait (ptid, status, options);
 	      if (status->kind == TARGET_WAITKIND_IGNORE)
 		{
 		  if (record_debug)
@@ -1291,8 +1291,8 @@ record_full_wait_1 (struct target_ops *ops,
 					    "Process record: record_full_wait "
 					    "issuing one more step in the "
 					    "target beneath\n");
-		      ops->beneath->resume (ptid, step, GDB_SIGNAL_0);
-		      ops->beneath->commit_resume ();
+		      ops->beneath ()->resume (ptid, step, GDB_SIGNAL_0);
+		      ops->beneath ()->commit_resume ();
 		      continue;
 		    }
 		}
@@ -1479,7 +1479,7 @@ record_full_base_target::stopped_by_watchpoint ()
   if (RECORD_FULL_IS_REPLAY)
     return record_full_stop_reason == TARGET_STOPPED_BY_WATCHPOINT;
   else
-    return beneath->stopped_by_watchpoint ();
+    return beneath ()->stopped_by_watchpoint ();
 }
 
 bool
@@ -1488,7 +1488,7 @@ record_full_base_target::stopped_data_address (CORE_ADDR *addr_p)
   if (RECORD_FULL_IS_REPLAY)
     return false;
   else
-    return this->beneath->stopped_data_address (addr_p);
+    return this->beneath ()->stopped_data_address (addr_p);
 }
 
 /* The stopped_by_sw_breakpoint method of target record-full.  */
@@ -1623,7 +1623,7 @@ record_full_target::store_registers (struct regcache *regcache, int regno)
 
       record_full_registers_change (regcache, regno);
     }
-  this->beneath->store_registers (regcache, regno);
+  this->beneath ()->store_registers (regcache, regno);
 }
 
 /* "xfer_partial" method.  Behavior is conditional on
@@ -1688,8 +1688,8 @@ record_full_target::xfer_partial (enum target_object object,
 	record_full_insn_num++;
     }
 
-  return this->beneath->xfer_partial (object, annex, readbuf, writebuf, offset,
-				      len, xfered_len);
+  return this->beneath ()->xfer_partial (object, annex, readbuf, writebuf,
+					 offset, len, xfered_len);
 }
 
 /* This structure represents a breakpoint inserted while the record
@@ -1770,7 +1770,7 @@ record_full_target::insert_breakpoint (struct gdbarch *gdbarch,
       scoped_restore restore_operation_disable
 	= record_full_gdb_operation_disable_set ();
 
-      int ret = this->beneath->insert_breakpoint (gdbarch, bp_tgt);
+      int ret = this->beneath ()->insert_breakpoint (gdbarch, bp_tgt);
       if (ret != 0)
 	return ret;
 
@@ -1824,8 +1824,8 @@ record_full_target::remove_breakpoint (struct gdbarch *gdbarch,
 	      scoped_restore restore_operation_disable
 		= record_full_gdb_operation_disable_set ();
 
-	      int ret = this->beneath->remove_breakpoint (gdbarch, bp_tgt,
-							  reason);
+	      int ret = this->beneath ()->remove_breakpoint (gdbarch, bp_tgt,
+							     reason);
 	      if (ret != 0)
 		return ret;
 	    }
@@ -2204,10 +2204,10 @@ record_full_core_target::xfer_partial (enum target_object object,
 		  else
 		    {
 		      if (!entry)
-			return this->beneath->xfer_partial (object, annex,
-							    readbuf, writebuf,
-							    offset, len,
-							    xfered_len);
+			return this->beneath ()->xfer_partial (object, annex,
+							       readbuf, writebuf,
+							       offset, len,
+							       xfered_len);
 
 		      memcpy (readbuf, entry->buf + sec_offset,
 			      (size_t) len);
@@ -2224,9 +2224,9 @@ record_full_core_target::xfer_partial (enum target_object object,
 	error (_("You can't do that without a process to debug."));
     }
 
-  return this->beneath->xfer_partial (object, annex,
-				      readbuf, writebuf, offset, len,
-				      xfered_len);
+  return this->beneath ()->xfer_partial (object, annex,
+					 readbuf, writebuf, offset, len,
+					 xfered_len);
 }
 
 /* "insert_breakpoint" method for prec over corefile.  */
diff --git a/gdb/remote.c b/gdb/remote.c
index bc0c8e1292..86f0966612 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -11795,7 +11795,7 @@ remote_target::read_description ()
   /* Do not try this during initial connection, when we do not know
      whether there is a running but stopped thread.  */
   if (!target_has_execution || ptid_equal (inferior_ptid, null_ptid))
-    return beneath->read_description ();
+    return beneath ()->read_description ();
 
   if (!VEC_empty (remote_g_packet_guess_s, data->guesses))
     {
@@ -11814,7 +11814,7 @@ remote_target::read_description ()
 	 an architecture, but it's too tricky to do safely.  */
     }
 
-  return beneath->read_description ();
+  return beneath ()->read_description ();
 }
 
 /* Remote file transfer support.  This is host-initiated I/O, not
diff --git a/gdb/target-delegates.c b/gdb/target-delegates.c
index da74347122..319a9bb46b 100644
--- a/gdb/target-delegates.c
+++ b/gdb/target-delegates.c
@@ -343,7 +343,7 @@ struct debug_target : public target_ops
 void
 target_ops::post_attach (int arg0)
 {
-  this->beneath->post_attach (arg0);
+  this->beneath ()->post_attach (arg0);
 }
 
 void
@@ -354,9 +354,9 @@ dummy_target::post_attach (int arg0)
 void
 debug_target::post_attach (int arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->post_attach (...)\n", this->beneath->shortname ());
-  this->beneath->post_attach (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->post_attach (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->post_attach (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->post_attach (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->post_attach (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -364,7 +364,7 @@ debug_target::post_attach (int arg0)
 void
 target_ops::detach (inferior *arg0, int arg1)
 {
-  this->beneath->detach (arg0, arg1);
+  this->beneath ()->detach (arg0, arg1);
 }
 
 void
@@ -375,9 +375,9 @@ dummy_target::detach (inferior *arg0, int arg1)
 void
 debug_target::detach (inferior *arg0, int arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->detach (...)\n", this->beneath->shortname ());
-  this->beneath->detach (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->detach (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->detach (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->detach (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->detach (", this->beneath ()->shortname ());
   target_debug_print_inferior_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -387,7 +387,7 @@ debug_target::detach (inferior *arg0, int arg1)
 void
 target_ops::disconnect (const char *arg0, int arg1)
 {
-  this->beneath->disconnect (arg0, arg1);
+  this->beneath ()->disconnect (arg0, arg1);
 }
 
 void
@@ -399,9 +399,9 @@ dummy_target::disconnect (const char *arg0, int arg1)
 void
 debug_target::disconnect (const char *arg0, int arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->disconnect (...)\n", this->beneath->shortname ());
-  this->beneath->disconnect (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->disconnect (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->disconnect (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->disconnect (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->disconnect (", this->beneath ()->shortname ());
   target_debug_print_const_char_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -411,7 +411,7 @@ debug_target::disconnect (const char *arg0, int arg1)
 void
 target_ops::resume (ptid_t arg0, int arg1, enum gdb_signal arg2)
 {
-  this->beneath->resume (arg0, arg1, arg2);
+  this->beneath ()->resume (arg0, arg1, arg2);
 }
 
 void
@@ -423,9 +423,9 @@ dummy_target::resume (ptid_t arg0, int arg1, enum gdb_signal arg2)
 void
 debug_target::resume (ptid_t arg0, int arg1, enum gdb_signal arg2)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->resume (...)\n", this->beneath->shortname ());
-  this->beneath->resume (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->resume (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->resume (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->resume (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->resume (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_step (arg1);
@@ -437,7 +437,7 @@ debug_target::resume (ptid_t arg0, int arg1, enum gdb_signal arg2)
 void
 target_ops::commit_resume ()
 {
-  this->beneath->commit_resume ();
+  this->beneath ()->commit_resume ();
 }
 
 void
@@ -448,16 +448,16 @@ dummy_target::commit_resume ()
 void
 debug_target::commit_resume ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->commit_resume (...)\n", this->beneath->shortname ());
-  this->beneath->commit_resume ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->commit_resume (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->commit_resume (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->commit_resume ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->commit_resume (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 ptid_t
 target_ops::wait (ptid_t arg0, struct target_waitstatus *arg1, int arg2)
 {
-  return this->beneath->wait (arg0, arg1, arg2);
+  return this->beneath ()->wait (arg0, arg1, arg2);
 }
 
 ptid_t
@@ -470,9 +470,9 @@ ptid_t
 debug_target::wait (ptid_t arg0, struct target_waitstatus *arg1, int arg2)
 {
   ptid_t result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->wait (...)\n", this->beneath->shortname ());
-  result = this->beneath->wait (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->wait (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->wait (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->wait (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->wait (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_struct_target_waitstatus_p (arg1);
@@ -487,7 +487,7 @@ debug_target::wait (ptid_t arg0, struct target_waitstatus *arg1, int arg2)
 void
 target_ops::fetch_registers (struct regcache *arg0, int arg1)
 {
-  this->beneath->fetch_registers (arg0, arg1);
+  this->beneath ()->fetch_registers (arg0, arg1);
 }
 
 void
@@ -498,9 +498,9 @@ dummy_target::fetch_registers (struct regcache *arg0, int arg1)
 void
 debug_target::fetch_registers (struct regcache *arg0, int arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->fetch_registers (...)\n", this->beneath->shortname ());
-  this->beneath->fetch_registers (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->fetch_registers (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->fetch_registers (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->fetch_registers (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->fetch_registers (", this->beneath ()->shortname ());
   target_debug_print_struct_regcache_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -510,7 +510,7 @@ debug_target::fetch_registers (struct regcache *arg0, int arg1)
 void
 target_ops::store_registers (struct regcache *arg0, int arg1)
 {
-  this->beneath->store_registers (arg0, arg1);
+  this->beneath ()->store_registers (arg0, arg1);
 }
 
 void
@@ -522,9 +522,9 @@ dummy_target::store_registers (struct regcache *arg0, int arg1)
 void
 debug_target::store_registers (struct regcache *arg0, int arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->store_registers (...)\n", this->beneath->shortname ());
-  this->beneath->store_registers (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->store_registers (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->store_registers (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->store_registers (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->store_registers (", this->beneath ()->shortname ());
   target_debug_print_struct_regcache_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -534,7 +534,7 @@ debug_target::store_registers (struct regcache *arg0, int arg1)
 void
 target_ops::prepare_to_store (struct regcache *arg0)
 {
-  this->beneath->prepare_to_store (arg0);
+  this->beneath ()->prepare_to_store (arg0);
 }
 
 void
@@ -546,9 +546,9 @@ dummy_target::prepare_to_store (struct regcache *arg0)
 void
 debug_target::prepare_to_store (struct regcache *arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->prepare_to_store (...)\n", this->beneath->shortname ());
-  this->beneath->prepare_to_store (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->prepare_to_store (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->prepare_to_store (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->prepare_to_store (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->prepare_to_store (", this->beneath ()->shortname ());
   target_debug_print_struct_regcache_p (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -556,7 +556,7 @@ debug_target::prepare_to_store (struct regcache *arg0)
 void
 target_ops::files_info ()
 {
-  this->beneath->files_info ();
+  this->beneath ()->files_info ();
 }
 
 void
@@ -567,16 +567,16 @@ dummy_target::files_info ()
 void
 debug_target::files_info ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->files_info (...)\n", this->beneath->shortname ());
-  this->beneath->files_info ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->files_info (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->files_info (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->files_info ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->files_info (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 int
 target_ops::insert_breakpoint (struct gdbarch *arg0, struct bp_target_info *arg1)
 {
-  return this->beneath->insert_breakpoint (arg0, arg1);
+  return this->beneath ()->insert_breakpoint (arg0, arg1);
 }
 
 int
@@ -589,9 +589,9 @@ int
 debug_target::insert_breakpoint (struct gdbarch *arg0, struct bp_target_info *arg1)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_breakpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->insert_breakpoint (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_breakpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_breakpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->insert_breakpoint (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_breakpoint (", this->beneath ()->shortname ());
   target_debug_print_struct_gdbarch_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_struct_bp_target_info_p (arg1);
@@ -604,7 +604,7 @@ debug_target::insert_breakpoint (struct gdbarch *arg0, struct bp_target_info *ar
 int
 target_ops::remove_breakpoint (struct gdbarch *arg0, struct bp_target_info *arg1, enum remove_bp_reason arg2)
 {
-  return this->beneath->remove_breakpoint (arg0, arg1, arg2);
+  return this->beneath ()->remove_breakpoint (arg0, arg1, arg2);
 }
 
 int
@@ -617,9 +617,9 @@ int
 debug_target::remove_breakpoint (struct gdbarch *arg0, struct bp_target_info *arg1, enum remove_bp_reason arg2)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_breakpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->remove_breakpoint (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_breakpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_breakpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->remove_breakpoint (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_breakpoint (", this->beneath ()->shortname ());
   target_debug_print_struct_gdbarch_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_struct_bp_target_info_p (arg1);
@@ -634,7 +634,7 @@ debug_target::remove_breakpoint (struct gdbarch *arg0, struct bp_target_info *ar
 bool
 target_ops::stopped_by_sw_breakpoint ()
 {
-  return this->beneath->stopped_by_sw_breakpoint ();
+  return this->beneath ()->stopped_by_sw_breakpoint ();
 }
 
 bool
@@ -647,9 +647,9 @@ bool
 debug_target::stopped_by_sw_breakpoint ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->stopped_by_sw_breakpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->stopped_by_sw_breakpoint ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->stopped_by_sw_breakpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->stopped_by_sw_breakpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->stopped_by_sw_breakpoint ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->stopped_by_sw_breakpoint (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -659,7 +659,7 @@ debug_target::stopped_by_sw_breakpoint ()
 bool
 target_ops::supports_stopped_by_sw_breakpoint ()
 {
-  return this->beneath->supports_stopped_by_sw_breakpoint ();
+  return this->beneath ()->supports_stopped_by_sw_breakpoint ();
 }
 
 bool
@@ -672,9 +672,9 @@ bool
 debug_target::supports_stopped_by_sw_breakpoint ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_stopped_by_sw_breakpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->supports_stopped_by_sw_breakpoint ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_stopped_by_sw_breakpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_stopped_by_sw_breakpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->supports_stopped_by_sw_breakpoint ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_stopped_by_sw_breakpoint (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -684,7 +684,7 @@ debug_target::supports_stopped_by_sw_breakpoint ()
 bool
 target_ops::stopped_by_hw_breakpoint ()
 {
-  return this->beneath->stopped_by_hw_breakpoint ();
+  return this->beneath ()->stopped_by_hw_breakpoint ();
 }
 
 bool
@@ -697,9 +697,9 @@ bool
 debug_target::stopped_by_hw_breakpoint ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->stopped_by_hw_breakpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->stopped_by_hw_breakpoint ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->stopped_by_hw_breakpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->stopped_by_hw_breakpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->stopped_by_hw_breakpoint ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->stopped_by_hw_breakpoint (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -709,7 +709,7 @@ debug_target::stopped_by_hw_breakpoint ()
 bool
 target_ops::supports_stopped_by_hw_breakpoint ()
 {
-  return this->beneath->supports_stopped_by_hw_breakpoint ();
+  return this->beneath ()->supports_stopped_by_hw_breakpoint ();
 }
 
 bool
@@ -722,9 +722,9 @@ bool
 debug_target::supports_stopped_by_hw_breakpoint ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_stopped_by_hw_breakpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->supports_stopped_by_hw_breakpoint ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_stopped_by_hw_breakpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_stopped_by_hw_breakpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->supports_stopped_by_hw_breakpoint ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_stopped_by_hw_breakpoint (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -734,7 +734,7 @@ debug_target::supports_stopped_by_hw_breakpoint ()
 int
 target_ops::can_use_hw_breakpoint (enum bptype arg0, int arg1, int arg2)
 {
-  return this->beneath->can_use_hw_breakpoint (arg0, arg1, arg2);
+  return this->beneath ()->can_use_hw_breakpoint (arg0, arg1, arg2);
 }
 
 int
@@ -747,9 +747,9 @@ int
 debug_target::can_use_hw_breakpoint (enum bptype arg0, int arg1, int arg2)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->can_use_hw_breakpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->can_use_hw_breakpoint (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->can_use_hw_breakpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->can_use_hw_breakpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->can_use_hw_breakpoint (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->can_use_hw_breakpoint (", this->beneath ()->shortname ());
   target_debug_print_enum_bptype (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -764,7 +764,7 @@ debug_target::can_use_hw_breakpoint (enum bptype arg0, int arg1, int arg2)
 int
 target_ops::ranged_break_num_registers ()
 {
-  return this->beneath->ranged_break_num_registers ();
+  return this->beneath ()->ranged_break_num_registers ();
 }
 
 int
@@ -777,9 +777,9 @@ int
 debug_target::ranged_break_num_registers ()
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->ranged_break_num_registers (...)\n", this->beneath->shortname ());
-  result = this->beneath->ranged_break_num_registers ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->ranged_break_num_registers (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->ranged_break_num_registers (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->ranged_break_num_registers ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->ranged_break_num_registers (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -789,7 +789,7 @@ debug_target::ranged_break_num_registers ()
 int
 target_ops::insert_hw_breakpoint (struct gdbarch *arg0, struct bp_target_info *arg1)
 {
-  return this->beneath->insert_hw_breakpoint (arg0, arg1);
+  return this->beneath ()->insert_hw_breakpoint (arg0, arg1);
 }
 
 int
@@ -802,9 +802,9 @@ int
 debug_target::insert_hw_breakpoint (struct gdbarch *arg0, struct bp_target_info *arg1)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_hw_breakpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->insert_hw_breakpoint (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_hw_breakpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_hw_breakpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->insert_hw_breakpoint (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_hw_breakpoint (", this->beneath ()->shortname ());
   target_debug_print_struct_gdbarch_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_struct_bp_target_info_p (arg1);
@@ -817,7 +817,7 @@ debug_target::insert_hw_breakpoint (struct gdbarch *arg0, struct bp_target_info
 int
 target_ops::remove_hw_breakpoint (struct gdbarch *arg0, struct bp_target_info *arg1)
 {
-  return this->beneath->remove_hw_breakpoint (arg0, arg1);
+  return this->beneath ()->remove_hw_breakpoint (arg0, arg1);
 }
 
 int
@@ -830,9 +830,9 @@ int
 debug_target::remove_hw_breakpoint (struct gdbarch *arg0, struct bp_target_info *arg1)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_hw_breakpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->remove_hw_breakpoint (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_hw_breakpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_hw_breakpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->remove_hw_breakpoint (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_hw_breakpoint (", this->beneath ()->shortname ());
   target_debug_print_struct_gdbarch_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_struct_bp_target_info_p (arg1);
@@ -845,7 +845,7 @@ debug_target::remove_hw_breakpoint (struct gdbarch *arg0, struct bp_target_info
 int
 target_ops::remove_watchpoint (CORE_ADDR arg0, int arg1, enum target_hw_bp_type arg2, struct expression *arg3)
 {
-  return this->beneath->remove_watchpoint (arg0, arg1, arg2, arg3);
+  return this->beneath ()->remove_watchpoint (arg0, arg1, arg2, arg3);
 }
 
 int
@@ -858,9 +858,9 @@ int
 debug_target::remove_watchpoint (CORE_ADDR arg0, int arg1, enum target_hw_bp_type arg2, struct expression *arg3)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_watchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->remove_watchpoint (arg0, arg1, arg2, arg3);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_watchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_watchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->remove_watchpoint (arg0, arg1, arg2, arg3);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_watchpoint (", this->beneath ()->shortname ());
   target_debug_print_CORE_ADDR (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -877,7 +877,7 @@ debug_target::remove_watchpoint (CORE_ADDR arg0, int arg1, enum target_hw_bp_typ
 int
 target_ops::insert_watchpoint (CORE_ADDR arg0, int arg1, enum target_hw_bp_type arg2, struct expression *arg3)
 {
-  return this->beneath->insert_watchpoint (arg0, arg1, arg2, arg3);
+  return this->beneath ()->insert_watchpoint (arg0, arg1, arg2, arg3);
 }
 
 int
@@ -890,9 +890,9 @@ int
 debug_target::insert_watchpoint (CORE_ADDR arg0, int arg1, enum target_hw_bp_type arg2, struct expression *arg3)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_watchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->insert_watchpoint (arg0, arg1, arg2, arg3);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_watchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_watchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->insert_watchpoint (arg0, arg1, arg2, arg3);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_watchpoint (", this->beneath ()->shortname ());
   target_debug_print_CORE_ADDR (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -909,7 +909,7 @@ debug_target::insert_watchpoint (CORE_ADDR arg0, int arg1, enum target_hw_bp_typ
 int
 target_ops::insert_mask_watchpoint (CORE_ADDR arg0, CORE_ADDR arg1, enum target_hw_bp_type arg2)
 {
-  return this->beneath->insert_mask_watchpoint (arg0, arg1, arg2);
+  return this->beneath ()->insert_mask_watchpoint (arg0, arg1, arg2);
 }
 
 int
@@ -922,9 +922,9 @@ int
 debug_target::insert_mask_watchpoint (CORE_ADDR arg0, CORE_ADDR arg1, enum target_hw_bp_type arg2)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_mask_watchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->insert_mask_watchpoint (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_mask_watchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_mask_watchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->insert_mask_watchpoint (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_mask_watchpoint (", this->beneath ()->shortname ());
   target_debug_print_CORE_ADDR (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_CORE_ADDR (arg1);
@@ -939,7 +939,7 @@ debug_target::insert_mask_watchpoint (CORE_ADDR arg0, CORE_ADDR arg1, enum targe
 int
 target_ops::remove_mask_watchpoint (CORE_ADDR arg0, CORE_ADDR arg1, enum target_hw_bp_type arg2)
 {
-  return this->beneath->remove_mask_watchpoint (arg0, arg1, arg2);
+  return this->beneath ()->remove_mask_watchpoint (arg0, arg1, arg2);
 }
 
 int
@@ -952,9 +952,9 @@ int
 debug_target::remove_mask_watchpoint (CORE_ADDR arg0, CORE_ADDR arg1, enum target_hw_bp_type arg2)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_mask_watchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->remove_mask_watchpoint (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_mask_watchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_mask_watchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->remove_mask_watchpoint (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_mask_watchpoint (", this->beneath ()->shortname ());
   target_debug_print_CORE_ADDR (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_CORE_ADDR (arg1);
@@ -969,7 +969,7 @@ debug_target::remove_mask_watchpoint (CORE_ADDR arg0, CORE_ADDR arg1, enum targe
 bool
 target_ops::stopped_by_watchpoint ()
 {
-  return this->beneath->stopped_by_watchpoint ();
+  return this->beneath ()->stopped_by_watchpoint ();
 }
 
 bool
@@ -982,9 +982,9 @@ bool
 debug_target::stopped_by_watchpoint ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->stopped_by_watchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->stopped_by_watchpoint ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->stopped_by_watchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->stopped_by_watchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->stopped_by_watchpoint ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->stopped_by_watchpoint (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -994,7 +994,7 @@ debug_target::stopped_by_watchpoint ()
 int
 target_ops::have_steppable_watchpoint ()
 {
-  return this->beneath->have_steppable_watchpoint ();
+  return this->beneath ()->have_steppable_watchpoint ();
 }
 
 int
@@ -1007,9 +1007,9 @@ int
 debug_target::have_steppable_watchpoint ()
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->have_steppable_watchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->have_steppable_watchpoint ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->have_steppable_watchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->have_steppable_watchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->have_steppable_watchpoint ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->have_steppable_watchpoint (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -1019,7 +1019,7 @@ debug_target::have_steppable_watchpoint ()
 bool
 target_ops::have_continuable_watchpoint ()
 {
-  return this->beneath->have_continuable_watchpoint ();
+  return this->beneath ()->have_continuable_watchpoint ();
 }
 
 bool
@@ -1032,9 +1032,9 @@ bool
 debug_target::have_continuable_watchpoint ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->have_continuable_watchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->have_continuable_watchpoint ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->have_continuable_watchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->have_continuable_watchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->have_continuable_watchpoint ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->have_continuable_watchpoint (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -1044,7 +1044,7 @@ debug_target::have_continuable_watchpoint ()
 bool
 target_ops::stopped_data_address (CORE_ADDR *arg0)
 {
-  return this->beneath->stopped_data_address (arg0);
+  return this->beneath ()->stopped_data_address (arg0);
 }
 
 bool
@@ -1057,9 +1057,9 @@ bool
 debug_target::stopped_data_address (CORE_ADDR *arg0)
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->stopped_data_address (...)\n", this->beneath->shortname ());
-  result = this->beneath->stopped_data_address (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->stopped_data_address (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->stopped_data_address (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->stopped_data_address (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->stopped_data_address (", this->beneath ()->shortname ());
   target_debug_print_CORE_ADDR_p (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
@@ -1070,7 +1070,7 @@ debug_target::stopped_data_address (CORE_ADDR *arg0)
 bool
 target_ops::watchpoint_addr_within_range (CORE_ADDR arg0, CORE_ADDR arg1, int arg2)
 {
-  return this->beneath->watchpoint_addr_within_range (arg0, arg1, arg2);
+  return this->beneath ()->watchpoint_addr_within_range (arg0, arg1, arg2);
 }
 
 bool
@@ -1083,9 +1083,9 @@ bool
 debug_target::watchpoint_addr_within_range (CORE_ADDR arg0, CORE_ADDR arg1, int arg2)
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->watchpoint_addr_within_range (...)\n", this->beneath->shortname ());
-  result = this->beneath->watchpoint_addr_within_range (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->watchpoint_addr_within_range (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->watchpoint_addr_within_range (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->watchpoint_addr_within_range (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->watchpoint_addr_within_range (", this->beneath ()->shortname ());
   target_debug_print_CORE_ADDR (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_CORE_ADDR (arg1);
@@ -1100,7 +1100,7 @@ debug_target::watchpoint_addr_within_range (CORE_ADDR arg0, CORE_ADDR arg1, int
 int
 target_ops::region_ok_for_hw_watchpoint (CORE_ADDR arg0, int arg1)
 {
-  return this->beneath->region_ok_for_hw_watchpoint (arg0, arg1);
+  return this->beneath ()->region_ok_for_hw_watchpoint (arg0, arg1);
 }
 
 int
@@ -1113,9 +1113,9 @@ int
 debug_target::region_ok_for_hw_watchpoint (CORE_ADDR arg0, int arg1)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->region_ok_for_hw_watchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->region_ok_for_hw_watchpoint (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->region_ok_for_hw_watchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->region_ok_for_hw_watchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->region_ok_for_hw_watchpoint (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->region_ok_for_hw_watchpoint (", this->beneath ()->shortname ());
   target_debug_print_CORE_ADDR (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -1128,7 +1128,7 @@ debug_target::region_ok_for_hw_watchpoint (CORE_ADDR arg0, int arg1)
 bool
 target_ops::can_accel_watchpoint_condition (CORE_ADDR arg0, int arg1, int arg2, struct expression *arg3)
 {
-  return this->beneath->can_accel_watchpoint_condition (arg0, arg1, arg2, arg3);
+  return this->beneath ()->can_accel_watchpoint_condition (arg0, arg1, arg2, arg3);
 }
 
 bool
@@ -1141,9 +1141,9 @@ bool
 debug_target::can_accel_watchpoint_condition (CORE_ADDR arg0, int arg1, int arg2, struct expression *arg3)
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->can_accel_watchpoint_condition (...)\n", this->beneath->shortname ());
-  result = this->beneath->can_accel_watchpoint_condition (arg0, arg1, arg2, arg3);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->can_accel_watchpoint_condition (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->can_accel_watchpoint_condition (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->can_accel_watchpoint_condition (arg0, arg1, arg2, arg3);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->can_accel_watchpoint_condition (", this->beneath ()->shortname ());
   target_debug_print_CORE_ADDR (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -1160,7 +1160,7 @@ debug_target::can_accel_watchpoint_condition (CORE_ADDR arg0, int arg1, int arg2
 int
 target_ops::masked_watch_num_registers (CORE_ADDR arg0, CORE_ADDR arg1)
 {
-  return this->beneath->masked_watch_num_registers (arg0, arg1);
+  return this->beneath ()->masked_watch_num_registers (arg0, arg1);
 }
 
 int
@@ -1173,9 +1173,9 @@ int
 debug_target::masked_watch_num_registers (CORE_ADDR arg0, CORE_ADDR arg1)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->masked_watch_num_registers (...)\n", this->beneath->shortname ());
-  result = this->beneath->masked_watch_num_registers (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->masked_watch_num_registers (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->masked_watch_num_registers (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->masked_watch_num_registers (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->masked_watch_num_registers (", this->beneath ()->shortname ());
   target_debug_print_CORE_ADDR (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_CORE_ADDR (arg1);
@@ -1188,7 +1188,7 @@ debug_target::masked_watch_num_registers (CORE_ADDR arg0, CORE_ADDR arg1)
 int
 target_ops::can_do_single_step ()
 {
-  return this->beneath->can_do_single_step ();
+  return this->beneath ()->can_do_single_step ();
 }
 
 int
@@ -1201,9 +1201,9 @@ int
 debug_target::can_do_single_step ()
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->can_do_single_step (...)\n", this->beneath->shortname ());
-  result = this->beneath->can_do_single_step ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->can_do_single_step (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->can_do_single_step (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->can_do_single_step ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->can_do_single_step (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -1213,7 +1213,7 @@ debug_target::can_do_single_step ()
 bool
 target_ops::supports_terminal_ours ()
 {
-  return this->beneath->supports_terminal_ours ();
+  return this->beneath ()->supports_terminal_ours ();
 }
 
 bool
@@ -1226,9 +1226,9 @@ bool
 debug_target::supports_terminal_ours ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_terminal_ours (...)\n", this->beneath->shortname ());
-  result = this->beneath->supports_terminal_ours ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_terminal_ours (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_terminal_ours (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->supports_terminal_ours ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_terminal_ours (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -1238,7 +1238,7 @@ debug_target::supports_terminal_ours ()
 void
 target_ops::terminal_init ()
 {
-  this->beneath->terminal_init ();
+  this->beneath ()->terminal_init ();
 }
 
 void
@@ -1249,16 +1249,16 @@ dummy_target::terminal_init ()
 void
 debug_target::terminal_init ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->terminal_init (...)\n", this->beneath->shortname ());
-  this->beneath->terminal_init ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->terminal_init (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->terminal_init (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->terminal_init ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->terminal_init (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::terminal_inferior ()
 {
-  this->beneath->terminal_inferior ();
+  this->beneath ()->terminal_inferior ();
 }
 
 void
@@ -1269,16 +1269,16 @@ dummy_target::terminal_inferior ()
 void
 debug_target::terminal_inferior ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->terminal_inferior (...)\n", this->beneath->shortname ());
-  this->beneath->terminal_inferior ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->terminal_inferior (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->terminal_inferior (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->terminal_inferior ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->terminal_inferior (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::terminal_save_inferior ()
 {
-  this->beneath->terminal_save_inferior ();
+  this->beneath ()->terminal_save_inferior ();
 }
 
 void
@@ -1289,16 +1289,16 @@ dummy_target::terminal_save_inferior ()
 void
 debug_target::terminal_save_inferior ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->terminal_save_inferior (...)\n", this->beneath->shortname ());
-  this->beneath->terminal_save_inferior ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->terminal_save_inferior (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->terminal_save_inferior (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->terminal_save_inferior ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->terminal_save_inferior (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::terminal_ours_for_output ()
 {
-  this->beneath->terminal_ours_for_output ();
+  this->beneath ()->terminal_ours_for_output ();
 }
 
 void
@@ -1309,16 +1309,16 @@ dummy_target::terminal_ours_for_output ()
 void
 debug_target::terminal_ours_for_output ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->terminal_ours_for_output (...)\n", this->beneath->shortname ());
-  this->beneath->terminal_ours_for_output ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->terminal_ours_for_output (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->terminal_ours_for_output (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->terminal_ours_for_output ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->terminal_ours_for_output (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::terminal_ours ()
 {
-  this->beneath->terminal_ours ();
+  this->beneath ()->terminal_ours ();
 }
 
 void
@@ -1329,16 +1329,16 @@ dummy_target::terminal_ours ()
 void
 debug_target::terminal_ours ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->terminal_ours (...)\n", this->beneath->shortname ());
-  this->beneath->terminal_ours ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->terminal_ours (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->terminal_ours (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->terminal_ours ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->terminal_ours (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::terminal_info (const char *arg0, int arg1)
 {
-  this->beneath->terminal_info (arg0, arg1);
+  this->beneath ()->terminal_info (arg0, arg1);
 }
 
 void
@@ -1350,9 +1350,9 @@ dummy_target::terminal_info (const char *arg0, int arg1)
 void
 debug_target::terminal_info (const char *arg0, int arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->terminal_info (...)\n", this->beneath->shortname ());
-  this->beneath->terminal_info (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->terminal_info (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->terminal_info (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->terminal_info (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->terminal_info (", this->beneath ()->shortname ());
   target_debug_print_const_char_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -1362,7 +1362,7 @@ debug_target::terminal_info (const char *arg0, int arg1)
 void
 target_ops::kill ()
 {
-  this->beneath->kill ();
+  this->beneath ()->kill ();
 }
 
 void
@@ -1374,16 +1374,16 @@ dummy_target::kill ()
 void
 debug_target::kill ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->kill (...)\n", this->beneath->shortname ());
-  this->beneath->kill ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->kill (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->kill (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->kill ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->kill (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::load (const char *arg0, int arg1)
 {
-  this->beneath->load (arg0, arg1);
+  this->beneath ()->load (arg0, arg1);
 }
 
 void
@@ -1395,9 +1395,9 @@ dummy_target::load (const char *arg0, int arg1)
 void
 debug_target::load (const char *arg0, int arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->load (...)\n", this->beneath->shortname ());
-  this->beneath->load (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->load (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->load (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->load (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->load (", this->beneath ()->shortname ());
   target_debug_print_const_char_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -1407,7 +1407,7 @@ debug_target::load (const char *arg0, int arg1)
 void
 target_ops::post_startup_inferior (ptid_t arg0)
 {
-  this->beneath->post_startup_inferior (arg0);
+  this->beneath ()->post_startup_inferior (arg0);
 }
 
 void
@@ -1418,9 +1418,9 @@ dummy_target::post_startup_inferior (ptid_t arg0)
 void
 debug_target::post_startup_inferior (ptid_t arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->post_startup_inferior (...)\n", this->beneath->shortname ());
-  this->beneath->post_startup_inferior (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->post_startup_inferior (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->post_startup_inferior (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->post_startup_inferior (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->post_startup_inferior (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -1428,7 +1428,7 @@ debug_target::post_startup_inferior (ptid_t arg0)
 int
 target_ops::insert_fork_catchpoint (int arg0)
 {
-  return this->beneath->insert_fork_catchpoint (arg0);
+  return this->beneath ()->insert_fork_catchpoint (arg0);
 }
 
 int
@@ -1441,9 +1441,9 @@ int
 debug_target::insert_fork_catchpoint (int arg0)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_fork_catchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->insert_fork_catchpoint (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_fork_catchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_fork_catchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->insert_fork_catchpoint (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_fork_catchpoint (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
@@ -1454,7 +1454,7 @@ debug_target::insert_fork_catchpoint (int arg0)
 int
 target_ops::remove_fork_catchpoint (int arg0)
 {
-  return this->beneath->remove_fork_catchpoint (arg0);
+  return this->beneath ()->remove_fork_catchpoint (arg0);
 }
 
 int
@@ -1467,9 +1467,9 @@ int
 debug_target::remove_fork_catchpoint (int arg0)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_fork_catchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->remove_fork_catchpoint (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_fork_catchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_fork_catchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->remove_fork_catchpoint (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_fork_catchpoint (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
@@ -1480,7 +1480,7 @@ debug_target::remove_fork_catchpoint (int arg0)
 int
 target_ops::insert_vfork_catchpoint (int arg0)
 {
-  return this->beneath->insert_vfork_catchpoint (arg0);
+  return this->beneath ()->insert_vfork_catchpoint (arg0);
 }
 
 int
@@ -1493,9 +1493,9 @@ int
 debug_target::insert_vfork_catchpoint (int arg0)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_vfork_catchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->insert_vfork_catchpoint (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_vfork_catchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_vfork_catchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->insert_vfork_catchpoint (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_vfork_catchpoint (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
@@ -1506,7 +1506,7 @@ debug_target::insert_vfork_catchpoint (int arg0)
 int
 target_ops::remove_vfork_catchpoint (int arg0)
 {
-  return this->beneath->remove_vfork_catchpoint (arg0);
+  return this->beneath ()->remove_vfork_catchpoint (arg0);
 }
 
 int
@@ -1519,9 +1519,9 @@ int
 debug_target::remove_vfork_catchpoint (int arg0)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_vfork_catchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->remove_vfork_catchpoint (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_vfork_catchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_vfork_catchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->remove_vfork_catchpoint (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_vfork_catchpoint (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
@@ -1532,7 +1532,7 @@ debug_target::remove_vfork_catchpoint (int arg0)
 int
 target_ops::follow_fork (int arg0, int arg1)
 {
-  return this->beneath->follow_fork (arg0, arg1);
+  return this->beneath ()->follow_fork (arg0, arg1);
 }
 
 int
@@ -1545,9 +1545,9 @@ int
 debug_target::follow_fork (int arg0, int arg1)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->follow_fork (...)\n", this->beneath->shortname ());
-  result = this->beneath->follow_fork (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->follow_fork (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->follow_fork (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->follow_fork (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->follow_fork (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -1560,7 +1560,7 @@ debug_target::follow_fork (int arg0, int arg1)
 int
 target_ops::insert_exec_catchpoint (int arg0)
 {
-  return this->beneath->insert_exec_catchpoint (arg0);
+  return this->beneath ()->insert_exec_catchpoint (arg0);
 }
 
 int
@@ -1573,9 +1573,9 @@ int
 debug_target::insert_exec_catchpoint (int arg0)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_exec_catchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->insert_exec_catchpoint (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_exec_catchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->insert_exec_catchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->insert_exec_catchpoint (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->insert_exec_catchpoint (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
@@ -1586,7 +1586,7 @@ debug_target::insert_exec_catchpoint (int arg0)
 int
 target_ops::remove_exec_catchpoint (int arg0)
 {
-  return this->beneath->remove_exec_catchpoint (arg0);
+  return this->beneath ()->remove_exec_catchpoint (arg0);
 }
 
 int
@@ -1599,9 +1599,9 @@ int
 debug_target::remove_exec_catchpoint (int arg0)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_exec_catchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->remove_exec_catchpoint (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_exec_catchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->remove_exec_catchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->remove_exec_catchpoint (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->remove_exec_catchpoint (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
@@ -1612,7 +1612,7 @@ debug_target::remove_exec_catchpoint (int arg0)
 void
 target_ops::follow_exec (struct inferior *arg0, char *arg1)
 {
-  this->beneath->follow_exec (arg0, arg1);
+  this->beneath ()->follow_exec (arg0, arg1);
 }
 
 void
@@ -1623,9 +1623,9 @@ dummy_target::follow_exec (struct inferior *arg0, char *arg1)
 void
 debug_target::follow_exec (struct inferior *arg0, char *arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->follow_exec (...)\n", this->beneath->shortname ());
-  this->beneath->follow_exec (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->follow_exec (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->follow_exec (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->follow_exec (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->follow_exec (", this->beneath ()->shortname ());
   target_debug_print_struct_inferior_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_char_p (arg1);
@@ -1635,7 +1635,7 @@ debug_target::follow_exec (struct inferior *arg0, char *arg1)
 int
 target_ops::set_syscall_catchpoint (int arg0, bool arg1, int arg2, gdb::array_view<const int> arg3)
 {
-  return this->beneath->set_syscall_catchpoint (arg0, arg1, arg2, arg3);
+  return this->beneath ()->set_syscall_catchpoint (arg0, arg1, arg2, arg3);
 }
 
 int
@@ -1648,9 +1648,9 @@ int
 debug_target::set_syscall_catchpoint (int arg0, bool arg1, int arg2, gdb::array_view<const int> arg3)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->set_syscall_catchpoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->set_syscall_catchpoint (arg0, arg1, arg2, arg3);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->set_syscall_catchpoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->set_syscall_catchpoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->set_syscall_catchpoint (arg0, arg1, arg2, arg3);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->set_syscall_catchpoint (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_bool (arg1);
@@ -1667,7 +1667,7 @@ debug_target::set_syscall_catchpoint (int arg0, bool arg1, int arg2, gdb::array_
 void
 target_ops::mourn_inferior ()
 {
-  this->beneath->mourn_inferior ();
+  this->beneath ()->mourn_inferior ();
 }
 
 void
@@ -1679,16 +1679,16 @@ dummy_target::mourn_inferior ()
 void
 debug_target::mourn_inferior ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->mourn_inferior (...)\n", this->beneath->shortname ());
-  this->beneath->mourn_inferior ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->mourn_inferior (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->mourn_inferior (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->mourn_inferior ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->mourn_inferior (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::pass_signals (int arg0, unsigned char * arg1)
 {
-  this->beneath->pass_signals (arg0, arg1);
+  this->beneath ()->pass_signals (arg0, arg1);
 }
 
 void
@@ -1699,9 +1699,9 @@ dummy_target::pass_signals (int arg0, unsigned char * arg1)
 void
 debug_target::pass_signals (int arg0, unsigned char * arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->pass_signals (...)\n", this->beneath->shortname ());
-  this->beneath->pass_signals (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->pass_signals (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->pass_signals (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->pass_signals (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->pass_signals (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_signals (arg1);
@@ -1711,7 +1711,7 @@ debug_target::pass_signals (int arg0, unsigned char * arg1)
 void
 target_ops::program_signals (int arg0, unsigned char * arg1)
 {
-  this->beneath->program_signals (arg0, arg1);
+  this->beneath ()->program_signals (arg0, arg1);
 }
 
 void
@@ -1722,9 +1722,9 @@ dummy_target::program_signals (int arg0, unsigned char * arg1)
 void
 debug_target::program_signals (int arg0, unsigned char * arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->program_signals (...)\n", this->beneath->shortname ());
-  this->beneath->program_signals (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->program_signals (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->program_signals (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->program_signals (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->program_signals (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_signals (arg1);
@@ -1734,7 +1734,7 @@ debug_target::program_signals (int arg0, unsigned char * arg1)
 bool
 target_ops::thread_alive (ptid_t arg0)
 {
-  return this->beneath->thread_alive (arg0);
+  return this->beneath ()->thread_alive (arg0);
 }
 
 bool
@@ -1747,9 +1747,9 @@ bool
 debug_target::thread_alive (ptid_t arg0)
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->thread_alive (...)\n", this->beneath->shortname ());
-  result = this->beneath->thread_alive (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->thread_alive (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->thread_alive (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->thread_alive (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->thread_alive (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
@@ -1760,7 +1760,7 @@ debug_target::thread_alive (ptid_t arg0)
 void
 target_ops::update_thread_list ()
 {
-  this->beneath->update_thread_list ();
+  this->beneath ()->update_thread_list ();
 }
 
 void
@@ -1771,16 +1771,16 @@ dummy_target::update_thread_list ()
 void
 debug_target::update_thread_list ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->update_thread_list (...)\n", this->beneath->shortname ());
-  this->beneath->update_thread_list ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->update_thread_list (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->update_thread_list (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->update_thread_list ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->update_thread_list (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 const char *
 target_ops::pid_to_str (ptid_t arg0)
 {
-  return this->beneath->pid_to_str (arg0);
+  return this->beneath ()->pid_to_str (arg0);
 }
 
 const char *
@@ -1793,9 +1793,9 @@ const char *
 debug_target::pid_to_str (ptid_t arg0)
 {
   const char * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->pid_to_str (...)\n", this->beneath->shortname ());
-  result = this->beneath->pid_to_str (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->pid_to_str (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->pid_to_str (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->pid_to_str (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->pid_to_str (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_const_char_p (result);
@@ -1806,7 +1806,7 @@ debug_target::pid_to_str (ptid_t arg0)
 const char *
 target_ops::extra_thread_info (thread_info *arg0)
 {
-  return this->beneath->extra_thread_info (arg0);
+  return this->beneath ()->extra_thread_info (arg0);
 }
 
 const char *
@@ -1819,9 +1819,9 @@ const char *
 debug_target::extra_thread_info (thread_info *arg0)
 {
   const char * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->extra_thread_info (...)\n", this->beneath->shortname ());
-  result = this->beneath->extra_thread_info (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->extra_thread_info (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->extra_thread_info (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->extra_thread_info (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->extra_thread_info (", this->beneath ()->shortname ());
   target_debug_print_thread_info_p (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_const_char_p (result);
@@ -1832,7 +1832,7 @@ debug_target::extra_thread_info (thread_info *arg0)
 const char *
 target_ops::thread_name (thread_info *arg0)
 {
-  return this->beneath->thread_name (arg0);
+  return this->beneath ()->thread_name (arg0);
 }
 
 const char *
@@ -1845,9 +1845,9 @@ const char *
 debug_target::thread_name (thread_info *arg0)
 {
   const char * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->thread_name (...)\n", this->beneath->shortname ());
-  result = this->beneath->thread_name (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->thread_name (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->thread_name (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->thread_name (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->thread_name (", this->beneath ()->shortname ());
   target_debug_print_thread_info_p (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_const_char_p (result);
@@ -1858,7 +1858,7 @@ debug_target::thread_name (thread_info *arg0)
 thread_info *
 target_ops::thread_handle_to_thread_info (const gdb_byte *arg0, int arg1, inferior *arg2)
 {
-  return this->beneath->thread_handle_to_thread_info (arg0, arg1, arg2);
+  return this->beneath ()->thread_handle_to_thread_info (arg0, arg1, arg2);
 }
 
 thread_info *
@@ -1871,9 +1871,9 @@ thread_info *
 debug_target::thread_handle_to_thread_info (const gdb_byte *arg0, int arg1, inferior *arg2)
 {
   thread_info * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->thread_handle_to_thread_info (...)\n", this->beneath->shortname ());
-  result = this->beneath->thread_handle_to_thread_info (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->thread_handle_to_thread_info (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->thread_handle_to_thread_info (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->thread_handle_to_thread_info (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->thread_handle_to_thread_info (", this->beneath ()->shortname ());
   target_debug_print_const_gdb_byte_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -1888,7 +1888,7 @@ debug_target::thread_handle_to_thread_info (const gdb_byte *arg0, int arg1, infe
 void
 target_ops::stop (ptid_t arg0)
 {
-  this->beneath->stop (arg0);
+  this->beneath ()->stop (arg0);
 }
 
 void
@@ -1899,9 +1899,9 @@ dummy_target::stop (ptid_t arg0)
 void
 debug_target::stop (ptid_t arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->stop (...)\n", this->beneath->shortname ());
-  this->beneath->stop (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->stop (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->stop (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->stop (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->stop (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -1909,7 +1909,7 @@ debug_target::stop (ptid_t arg0)
 void
 target_ops::interrupt ()
 {
-  this->beneath->interrupt ();
+  this->beneath ()->interrupt ();
 }
 
 void
@@ -1920,16 +1920,16 @@ dummy_target::interrupt ()
 void
 debug_target::interrupt ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->interrupt (...)\n", this->beneath->shortname ());
-  this->beneath->interrupt ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->interrupt (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->interrupt (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->interrupt ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->interrupt (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::pass_ctrlc ()
 {
-  this->beneath->pass_ctrlc ();
+  this->beneath ()->pass_ctrlc ();
 }
 
 void
@@ -1941,16 +1941,16 @@ dummy_target::pass_ctrlc ()
 void
 debug_target::pass_ctrlc ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->pass_ctrlc (...)\n", this->beneath->shortname ());
-  this->beneath->pass_ctrlc ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->pass_ctrlc (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->pass_ctrlc (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->pass_ctrlc ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->pass_ctrlc (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::rcmd (const char *arg0, struct ui_file *arg1)
 {
-  this->beneath->rcmd (arg0, arg1);
+  this->beneath ()->rcmd (arg0, arg1);
 }
 
 void
@@ -1962,9 +1962,9 @@ dummy_target::rcmd (const char *arg0, struct ui_file *arg1)
 void
 debug_target::rcmd (const char *arg0, struct ui_file *arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->rcmd (...)\n", this->beneath->shortname ());
-  this->beneath->rcmd (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->rcmd (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->rcmd (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->rcmd (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->rcmd (", this->beneath ()->shortname ());
   target_debug_print_const_char_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_struct_ui_file_p (arg1);
@@ -1974,7 +1974,7 @@ debug_target::rcmd (const char *arg0, struct ui_file *arg1)
 char *
 target_ops::pid_to_exec_file (int arg0)
 {
-  return this->beneath->pid_to_exec_file (arg0);
+  return this->beneath ()->pid_to_exec_file (arg0);
 }
 
 char *
@@ -1987,9 +1987,9 @@ char *
 debug_target::pid_to_exec_file (int arg0)
 {
   char * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->pid_to_exec_file (...)\n", this->beneath->shortname ());
-  result = this->beneath->pid_to_exec_file (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->pid_to_exec_file (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->pid_to_exec_file (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->pid_to_exec_file (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->pid_to_exec_file (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_char_p (result);
@@ -2000,7 +2000,7 @@ debug_target::pid_to_exec_file (int arg0)
 void
 target_ops::log_command (const char *arg0)
 {
-  this->beneath->log_command (arg0);
+  this->beneath ()->log_command (arg0);
 }
 
 void
@@ -2011,9 +2011,9 @@ dummy_target::log_command (const char *arg0)
 void
 debug_target::log_command (const char *arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->log_command (...)\n", this->beneath->shortname ());
-  this->beneath->log_command (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->log_command (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->log_command (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->log_command (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->log_command (", this->beneath ()->shortname ());
   target_debug_print_const_char_p (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -2021,7 +2021,7 @@ debug_target::log_command (const char *arg0)
 struct target_section_table *
 target_ops::get_section_table ()
 {
-  return this->beneath->get_section_table ();
+  return this->beneath ()->get_section_table ();
 }
 
 struct target_section_table *
@@ -2034,9 +2034,9 @@ struct target_section_table *
 debug_target::get_section_table ()
 {
   struct target_section_table * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_section_table (...)\n", this->beneath->shortname ());
-  result = this->beneath->get_section_table ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_section_table (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_section_table (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->get_section_table ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_section_table (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_struct_target_section_table_p (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2046,7 +2046,7 @@ debug_target::get_section_table ()
 thread_control_capabilities
 target_ops::get_thread_control_capabilities ()
 {
-  return this->beneath->get_thread_control_capabilities ();
+  return this->beneath ()->get_thread_control_capabilities ();
 }
 
 thread_control_capabilities
@@ -2059,9 +2059,9 @@ thread_control_capabilities
 debug_target::get_thread_control_capabilities ()
 {
   thread_control_capabilities result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_thread_control_capabilities (...)\n", this->beneath->shortname ());
-  result = this->beneath->get_thread_control_capabilities ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_thread_control_capabilities (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_thread_control_capabilities (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->get_thread_control_capabilities ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_thread_control_capabilities (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_thread_control_capabilities (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2071,7 +2071,7 @@ debug_target::get_thread_control_capabilities ()
 bool
 target_ops::attach_no_wait ()
 {
-  return this->beneath->attach_no_wait ();
+  return this->beneath ()->attach_no_wait ();
 }
 
 bool
@@ -2084,9 +2084,9 @@ bool
 debug_target::attach_no_wait ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->attach_no_wait (...)\n", this->beneath->shortname ());
-  result = this->beneath->attach_no_wait ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->attach_no_wait (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->attach_no_wait (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->attach_no_wait ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->attach_no_wait (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2096,7 +2096,7 @@ debug_target::attach_no_wait ()
 bool
 target_ops::can_async_p ()
 {
-  return this->beneath->can_async_p ();
+  return this->beneath ()->can_async_p ();
 }
 
 bool
@@ -2109,9 +2109,9 @@ bool
 debug_target::can_async_p ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->can_async_p (...)\n", this->beneath->shortname ());
-  result = this->beneath->can_async_p ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->can_async_p (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->can_async_p (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->can_async_p ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->can_async_p (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2121,7 +2121,7 @@ debug_target::can_async_p ()
 bool
 target_ops::is_async_p ()
 {
-  return this->beneath->is_async_p ();
+  return this->beneath ()->is_async_p ();
 }
 
 bool
@@ -2134,9 +2134,9 @@ bool
 debug_target::is_async_p ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->is_async_p (...)\n", this->beneath->shortname ());
-  result = this->beneath->is_async_p ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->is_async_p (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->is_async_p (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->is_async_p ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->is_async_p (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2146,7 +2146,7 @@ debug_target::is_async_p ()
 void
 target_ops::async (int arg0)
 {
-  this->beneath->async (arg0);
+  this->beneath ()->async (arg0);
 }
 
 void
@@ -2158,9 +2158,9 @@ dummy_target::async (int arg0)
 void
 debug_target::async (int arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->async (...)\n", this->beneath->shortname ());
-  this->beneath->async (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->async (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->async (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->async (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->async (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -2168,7 +2168,7 @@ debug_target::async (int arg0)
 void
 target_ops::thread_events (int arg0)
 {
-  this->beneath->thread_events (arg0);
+  this->beneath ()->thread_events (arg0);
 }
 
 void
@@ -2179,9 +2179,9 @@ dummy_target::thread_events (int arg0)
 void
 debug_target::thread_events (int arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->thread_events (...)\n", this->beneath->shortname ());
-  this->beneath->thread_events (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->thread_events (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->thread_events (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->thread_events (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->thread_events (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -2189,7 +2189,7 @@ debug_target::thread_events (int arg0)
 bool
 target_ops::supports_non_stop ()
 {
-  return this->beneath->supports_non_stop ();
+  return this->beneath ()->supports_non_stop ();
 }
 
 bool
@@ -2202,9 +2202,9 @@ bool
 debug_target::supports_non_stop ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_non_stop (...)\n", this->beneath->shortname ());
-  result = this->beneath->supports_non_stop ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_non_stop (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_non_stop (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->supports_non_stop ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_non_stop (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2214,7 +2214,7 @@ debug_target::supports_non_stop ()
 bool
 target_ops::always_non_stop_p ()
 {
-  return this->beneath->always_non_stop_p ();
+  return this->beneath ()->always_non_stop_p ();
 }
 
 bool
@@ -2227,9 +2227,9 @@ bool
 debug_target::always_non_stop_p ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->always_non_stop_p (...)\n", this->beneath->shortname ());
-  result = this->beneath->always_non_stop_p ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->always_non_stop_p (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->always_non_stop_p (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->always_non_stop_p ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->always_non_stop_p (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2239,7 +2239,7 @@ debug_target::always_non_stop_p ()
 int
 target_ops::find_memory_regions (find_memory_region_ftype arg0, void *arg1)
 {
-  return this->beneath->find_memory_regions (arg0, arg1);
+  return this->beneath ()->find_memory_regions (arg0, arg1);
 }
 
 int
@@ -2252,9 +2252,9 @@ int
 debug_target::find_memory_regions (find_memory_region_ftype arg0, void *arg1)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->find_memory_regions (...)\n", this->beneath->shortname ());
-  result = this->beneath->find_memory_regions (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->find_memory_regions (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->find_memory_regions (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->find_memory_regions (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->find_memory_regions (", this->beneath ()->shortname ());
   target_debug_print_find_memory_region_ftype (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_void_p (arg1);
@@ -2267,7 +2267,7 @@ debug_target::find_memory_regions (find_memory_region_ftype arg0, void *arg1)
 char *
 target_ops::make_corefile_notes (bfd *arg0, int *arg1)
 {
-  return this->beneath->make_corefile_notes (arg0, arg1);
+  return this->beneath ()->make_corefile_notes (arg0, arg1);
 }
 
 char *
@@ -2280,9 +2280,9 @@ char *
 debug_target::make_corefile_notes (bfd *arg0, int *arg1)
 {
   char * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->make_corefile_notes (...)\n", this->beneath->shortname ());
-  result = this->beneath->make_corefile_notes (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->make_corefile_notes (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->make_corefile_notes (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->make_corefile_notes (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->make_corefile_notes (", this->beneath ()->shortname ());
   target_debug_print_bfd_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int_p (arg1);
@@ -2295,7 +2295,7 @@ debug_target::make_corefile_notes (bfd *arg0, int *arg1)
 gdb_byte *
 target_ops::get_bookmark (const char *arg0, int arg1)
 {
-  return this->beneath->get_bookmark (arg0, arg1);
+  return this->beneath ()->get_bookmark (arg0, arg1);
 }
 
 gdb_byte *
@@ -2308,9 +2308,9 @@ gdb_byte *
 debug_target::get_bookmark (const char *arg0, int arg1)
 {
   gdb_byte * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_bookmark (...)\n", this->beneath->shortname ());
-  result = this->beneath->get_bookmark (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_bookmark (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_bookmark (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->get_bookmark (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_bookmark (", this->beneath ()->shortname ());
   target_debug_print_const_char_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -2323,7 +2323,7 @@ debug_target::get_bookmark (const char *arg0, int arg1)
 void
 target_ops::goto_bookmark (const gdb_byte *arg0, int arg1)
 {
-  this->beneath->goto_bookmark (arg0, arg1);
+  this->beneath ()->goto_bookmark (arg0, arg1);
 }
 
 void
@@ -2335,9 +2335,9 @@ dummy_target::goto_bookmark (const gdb_byte *arg0, int arg1)
 void
 debug_target::goto_bookmark (const gdb_byte *arg0, int arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->goto_bookmark (...)\n", this->beneath->shortname ());
-  this->beneath->goto_bookmark (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->goto_bookmark (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->goto_bookmark (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->goto_bookmark (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->goto_bookmark (", this->beneath ()->shortname ());
   target_debug_print_const_gdb_byte_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -2347,7 +2347,7 @@ debug_target::goto_bookmark (const gdb_byte *arg0, int arg1)
 CORE_ADDR
 target_ops::get_thread_local_address (ptid_t arg0, CORE_ADDR arg1, CORE_ADDR arg2)
 {
-  return this->beneath->get_thread_local_address (arg0, arg1, arg2);
+  return this->beneath ()->get_thread_local_address (arg0, arg1, arg2);
 }
 
 CORE_ADDR
@@ -2360,9 +2360,9 @@ CORE_ADDR
 debug_target::get_thread_local_address (ptid_t arg0, CORE_ADDR arg1, CORE_ADDR arg2)
 {
   CORE_ADDR result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_thread_local_address (...)\n", this->beneath->shortname ());
-  result = this->beneath->get_thread_local_address (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_thread_local_address (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_thread_local_address (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->get_thread_local_address (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_thread_local_address (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_CORE_ADDR (arg1);
@@ -2377,7 +2377,7 @@ debug_target::get_thread_local_address (ptid_t arg0, CORE_ADDR arg1, CORE_ADDR a
 enum target_xfer_status
 target_ops::xfer_partial (enum target_object arg0, const char *arg1, gdb_byte *arg2, const gdb_byte *arg3, ULONGEST arg4, ULONGEST arg5, ULONGEST *arg6)
 {
-  return this->beneath->xfer_partial (arg0, arg1, arg2, arg3, arg4, arg5, arg6);
+  return this->beneath ()->xfer_partial (arg0, arg1, arg2, arg3, arg4, arg5, arg6);
 }
 
 enum target_xfer_status
@@ -2390,9 +2390,9 @@ enum target_xfer_status
 debug_target::xfer_partial (enum target_object arg0, const char *arg1, gdb_byte *arg2, const gdb_byte *arg3, ULONGEST arg4, ULONGEST arg5, ULONGEST *arg6)
 {
   enum target_xfer_status result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->xfer_partial (...)\n", this->beneath->shortname ());
-  result = this->beneath->xfer_partial (arg0, arg1, arg2, arg3, arg4, arg5, arg6);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->xfer_partial (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->xfer_partial (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->xfer_partial (arg0, arg1, arg2, arg3, arg4, arg5, arg6);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->xfer_partial (", this->beneath ()->shortname ());
   target_debug_print_enum_target_object (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_const_char_p (arg1);
@@ -2415,7 +2415,7 @@ debug_target::xfer_partial (enum target_object arg0, const char *arg1, gdb_byte
 ULONGEST
 target_ops::get_memory_xfer_limit ()
 {
-  return this->beneath->get_memory_xfer_limit ();
+  return this->beneath ()->get_memory_xfer_limit ();
 }
 
 ULONGEST
@@ -2428,9 +2428,9 @@ ULONGEST
 debug_target::get_memory_xfer_limit ()
 {
   ULONGEST result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_memory_xfer_limit (...)\n", this->beneath->shortname ());
-  result = this->beneath->get_memory_xfer_limit ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_memory_xfer_limit (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_memory_xfer_limit (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->get_memory_xfer_limit ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_memory_xfer_limit (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_ULONGEST (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2440,7 +2440,7 @@ debug_target::get_memory_xfer_limit ()
 std::vector<mem_region>
 target_ops::memory_map ()
 {
-  return this->beneath->memory_map ();
+  return this->beneath ()->memory_map ();
 }
 
 std::vector<mem_region>
@@ -2453,9 +2453,9 @@ std::vector<mem_region>
 debug_target::memory_map ()
 {
   std::vector<mem_region> result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->memory_map (...)\n", this->beneath->shortname ());
-  result = this->beneath->memory_map ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->memory_map (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->memory_map (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->memory_map ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->memory_map (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_std_vector_mem_region (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2465,7 +2465,7 @@ debug_target::memory_map ()
 void
 target_ops::flash_erase (ULONGEST arg0, LONGEST arg1)
 {
-  this->beneath->flash_erase (arg0, arg1);
+  this->beneath ()->flash_erase (arg0, arg1);
 }
 
 void
@@ -2477,9 +2477,9 @@ dummy_target::flash_erase (ULONGEST arg0, LONGEST arg1)
 void
 debug_target::flash_erase (ULONGEST arg0, LONGEST arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->flash_erase (...)\n", this->beneath->shortname ());
-  this->beneath->flash_erase (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->flash_erase (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->flash_erase (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->flash_erase (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->flash_erase (", this->beneath ()->shortname ());
   target_debug_print_ULONGEST (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_LONGEST (arg1);
@@ -2489,7 +2489,7 @@ debug_target::flash_erase (ULONGEST arg0, LONGEST arg1)
 void
 target_ops::flash_done ()
 {
-  this->beneath->flash_done ();
+  this->beneath ()->flash_done ();
 }
 
 void
@@ -2501,16 +2501,16 @@ dummy_target::flash_done ()
 void
 debug_target::flash_done ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->flash_done (...)\n", this->beneath->shortname ());
-  this->beneath->flash_done ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->flash_done (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->flash_done (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->flash_done ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->flash_done (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 const struct target_desc *
 target_ops::read_description ()
 {
-  return this->beneath->read_description ();
+  return this->beneath ()->read_description ();
 }
 
 const struct target_desc *
@@ -2523,9 +2523,9 @@ const struct target_desc *
 debug_target::read_description ()
 {
   const struct target_desc * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->read_description (...)\n", this->beneath->shortname ());
-  result = this->beneath->read_description ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->read_description (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->read_description (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->read_description ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->read_description (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_const_struct_target_desc_p (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2535,7 +2535,7 @@ debug_target::read_description ()
 ptid_t
 target_ops::get_ada_task_ptid (long arg0, long arg1)
 {
-  return this->beneath->get_ada_task_ptid (arg0, arg1);
+  return this->beneath ()->get_ada_task_ptid (arg0, arg1);
 }
 
 ptid_t
@@ -2548,9 +2548,9 @@ ptid_t
 debug_target::get_ada_task_ptid (long arg0, long arg1)
 {
   ptid_t result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_ada_task_ptid (...)\n", this->beneath->shortname ());
-  result = this->beneath->get_ada_task_ptid (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_ada_task_ptid (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_ada_task_ptid (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->get_ada_task_ptid (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_ada_task_ptid (", this->beneath ()->shortname ());
   target_debug_print_long (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_long (arg1);
@@ -2563,7 +2563,7 @@ debug_target::get_ada_task_ptid (long arg0, long arg1)
 int
 target_ops::auxv_parse (gdb_byte **arg0, gdb_byte *arg1, CORE_ADDR *arg2, CORE_ADDR *arg3)
 {
-  return this->beneath->auxv_parse (arg0, arg1, arg2, arg3);
+  return this->beneath ()->auxv_parse (arg0, arg1, arg2, arg3);
 }
 
 int
@@ -2576,9 +2576,9 @@ int
 debug_target::auxv_parse (gdb_byte **arg0, gdb_byte *arg1, CORE_ADDR *arg2, CORE_ADDR *arg3)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->auxv_parse (...)\n", this->beneath->shortname ());
-  result = this->beneath->auxv_parse (arg0, arg1, arg2, arg3);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->auxv_parse (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->auxv_parse (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->auxv_parse (arg0, arg1, arg2, arg3);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->auxv_parse (", this->beneath ()->shortname ());
   target_debug_print_gdb_byte_pp (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_gdb_byte_p (arg1);
@@ -2595,7 +2595,7 @@ debug_target::auxv_parse (gdb_byte **arg0, gdb_byte *arg1, CORE_ADDR *arg2, CORE
 int
 target_ops::search_memory (CORE_ADDR arg0, ULONGEST arg1, const gdb_byte *arg2, ULONGEST arg3, CORE_ADDR *arg4)
 {
-  return this->beneath->search_memory (arg0, arg1, arg2, arg3, arg4);
+  return this->beneath ()->search_memory (arg0, arg1, arg2, arg3, arg4);
 }
 
 int
@@ -2608,9 +2608,9 @@ int
 debug_target::search_memory (CORE_ADDR arg0, ULONGEST arg1, const gdb_byte *arg2, ULONGEST arg3, CORE_ADDR *arg4)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->search_memory (...)\n", this->beneath->shortname ());
-  result = this->beneath->search_memory (arg0, arg1, arg2, arg3, arg4);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->search_memory (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->search_memory (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->search_memory (arg0, arg1, arg2, arg3, arg4);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->search_memory (", this->beneath ()->shortname ());
   target_debug_print_CORE_ADDR (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_ULONGEST (arg1);
@@ -2629,7 +2629,7 @@ debug_target::search_memory (CORE_ADDR arg0, ULONGEST arg1, const gdb_byte *arg2
 bool
 target_ops::can_execute_reverse ()
 {
-  return this->beneath->can_execute_reverse ();
+  return this->beneath ()->can_execute_reverse ();
 }
 
 bool
@@ -2642,9 +2642,9 @@ bool
 debug_target::can_execute_reverse ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->can_execute_reverse (...)\n", this->beneath->shortname ());
-  result = this->beneath->can_execute_reverse ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->can_execute_reverse (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->can_execute_reverse (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->can_execute_reverse ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->can_execute_reverse (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2654,7 +2654,7 @@ debug_target::can_execute_reverse ()
 enum exec_direction_kind
 target_ops::execution_direction ()
 {
-  return this->beneath->execution_direction ();
+  return this->beneath ()->execution_direction ();
 }
 
 enum exec_direction_kind
@@ -2667,9 +2667,9 @@ enum exec_direction_kind
 debug_target::execution_direction ()
 {
   enum exec_direction_kind result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->execution_direction (...)\n", this->beneath->shortname ());
-  result = this->beneath->execution_direction ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->execution_direction (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->execution_direction (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->execution_direction ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->execution_direction (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_enum_exec_direction_kind (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2679,7 +2679,7 @@ debug_target::execution_direction ()
 bool
 target_ops::supports_multi_process ()
 {
-  return this->beneath->supports_multi_process ();
+  return this->beneath ()->supports_multi_process ();
 }
 
 bool
@@ -2692,9 +2692,9 @@ bool
 debug_target::supports_multi_process ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_multi_process (...)\n", this->beneath->shortname ());
-  result = this->beneath->supports_multi_process ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_multi_process (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_multi_process (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->supports_multi_process ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_multi_process (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2704,7 +2704,7 @@ debug_target::supports_multi_process ()
 bool
 target_ops::supports_enable_disable_tracepoint ()
 {
-  return this->beneath->supports_enable_disable_tracepoint ();
+  return this->beneath ()->supports_enable_disable_tracepoint ();
 }
 
 bool
@@ -2717,9 +2717,9 @@ bool
 debug_target::supports_enable_disable_tracepoint ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_enable_disable_tracepoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->supports_enable_disable_tracepoint ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_enable_disable_tracepoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_enable_disable_tracepoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->supports_enable_disable_tracepoint ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_enable_disable_tracepoint (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2729,7 +2729,7 @@ debug_target::supports_enable_disable_tracepoint ()
 bool
 target_ops::supports_disable_randomization ()
 {
-  return this->beneath->supports_disable_randomization ();
+  return this->beneath ()->supports_disable_randomization ();
 }
 
 bool
@@ -2742,9 +2742,9 @@ bool
 debug_target::supports_disable_randomization ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_disable_randomization (...)\n", this->beneath->shortname ());
-  result = this->beneath->supports_disable_randomization ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_disable_randomization (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_disable_randomization (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->supports_disable_randomization ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_disable_randomization (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2754,7 +2754,7 @@ debug_target::supports_disable_randomization ()
 bool
 target_ops::supports_string_tracing ()
 {
-  return this->beneath->supports_string_tracing ();
+  return this->beneath ()->supports_string_tracing ();
 }
 
 bool
@@ -2767,9 +2767,9 @@ bool
 debug_target::supports_string_tracing ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_string_tracing (...)\n", this->beneath->shortname ());
-  result = this->beneath->supports_string_tracing ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_string_tracing (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_string_tracing (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->supports_string_tracing ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_string_tracing (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2779,7 +2779,7 @@ debug_target::supports_string_tracing ()
 bool
 target_ops::supports_evaluation_of_breakpoint_conditions ()
 {
-  return this->beneath->supports_evaluation_of_breakpoint_conditions ();
+  return this->beneath ()->supports_evaluation_of_breakpoint_conditions ();
 }
 
 bool
@@ -2792,9 +2792,9 @@ bool
 debug_target::supports_evaluation_of_breakpoint_conditions ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_evaluation_of_breakpoint_conditions (...)\n", this->beneath->shortname ());
-  result = this->beneath->supports_evaluation_of_breakpoint_conditions ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_evaluation_of_breakpoint_conditions (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_evaluation_of_breakpoint_conditions (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->supports_evaluation_of_breakpoint_conditions ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_evaluation_of_breakpoint_conditions (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2804,7 +2804,7 @@ debug_target::supports_evaluation_of_breakpoint_conditions ()
 bool
 target_ops::can_run_breakpoint_commands ()
 {
-  return this->beneath->can_run_breakpoint_commands ();
+  return this->beneath ()->can_run_breakpoint_commands ();
 }
 
 bool
@@ -2817,9 +2817,9 @@ bool
 debug_target::can_run_breakpoint_commands ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->can_run_breakpoint_commands (...)\n", this->beneath->shortname ());
-  result = this->beneath->can_run_breakpoint_commands ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->can_run_breakpoint_commands (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->can_run_breakpoint_commands (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->can_run_breakpoint_commands ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->can_run_breakpoint_commands (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2829,7 +2829,7 @@ debug_target::can_run_breakpoint_commands ()
 struct gdbarch *
 target_ops::thread_architecture (ptid_t arg0)
 {
-  return this->beneath->thread_architecture (arg0);
+  return this->beneath ()->thread_architecture (arg0);
 }
 
 struct gdbarch *
@@ -2842,9 +2842,9 @@ struct gdbarch *
 debug_target::thread_architecture (ptid_t arg0)
 {
   struct gdbarch * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->thread_architecture (...)\n", this->beneath->shortname ());
-  result = this->beneath->thread_architecture (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->thread_architecture (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->thread_architecture (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->thread_architecture (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->thread_architecture (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_struct_gdbarch_p (result);
@@ -2855,7 +2855,7 @@ debug_target::thread_architecture (ptid_t arg0)
 struct address_space *
 target_ops::thread_address_space (ptid_t arg0)
 {
-  return this->beneath->thread_address_space (arg0);
+  return this->beneath ()->thread_address_space (arg0);
 }
 
 struct address_space *
@@ -2868,9 +2868,9 @@ struct address_space *
 debug_target::thread_address_space (ptid_t arg0)
 {
   struct address_space * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->thread_address_space (...)\n", this->beneath->shortname ());
-  result = this->beneath->thread_address_space (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->thread_address_space (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->thread_address_space (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->thread_address_space (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->thread_address_space (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_struct_address_space_p (result);
@@ -2881,7 +2881,7 @@ debug_target::thread_address_space (ptid_t arg0)
 bool
 target_ops::filesystem_is_local ()
 {
-  return this->beneath->filesystem_is_local ();
+  return this->beneath ()->filesystem_is_local ();
 }
 
 bool
@@ -2894,9 +2894,9 @@ bool
 debug_target::filesystem_is_local ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->filesystem_is_local (...)\n", this->beneath->shortname ());
-  result = this->beneath->filesystem_is_local ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->filesystem_is_local (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->filesystem_is_local (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->filesystem_is_local ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->filesystem_is_local (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2906,7 +2906,7 @@ debug_target::filesystem_is_local ()
 void
 target_ops::trace_init ()
 {
-  this->beneath->trace_init ();
+  this->beneath ()->trace_init ();
 }
 
 void
@@ -2918,16 +2918,16 @@ dummy_target::trace_init ()
 void
 debug_target::trace_init ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->trace_init (...)\n", this->beneath->shortname ());
-  this->beneath->trace_init ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->trace_init (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->trace_init (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->trace_init ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->trace_init (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::download_tracepoint (struct bp_location *arg0)
 {
-  this->beneath->download_tracepoint (arg0);
+  this->beneath ()->download_tracepoint (arg0);
 }
 
 void
@@ -2939,9 +2939,9 @@ dummy_target::download_tracepoint (struct bp_location *arg0)
 void
 debug_target::download_tracepoint (struct bp_location *arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->download_tracepoint (...)\n", this->beneath->shortname ());
-  this->beneath->download_tracepoint (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->download_tracepoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->download_tracepoint (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->download_tracepoint (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->download_tracepoint (", this->beneath ()->shortname ());
   target_debug_print_struct_bp_location_p (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -2949,7 +2949,7 @@ debug_target::download_tracepoint (struct bp_location *arg0)
 bool
 target_ops::can_download_tracepoint ()
 {
-  return this->beneath->can_download_tracepoint ();
+  return this->beneath ()->can_download_tracepoint ();
 }
 
 bool
@@ -2962,9 +2962,9 @@ bool
 debug_target::can_download_tracepoint ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->can_download_tracepoint (...)\n", this->beneath->shortname ());
-  result = this->beneath->can_download_tracepoint ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->can_download_tracepoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->can_download_tracepoint (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->can_download_tracepoint ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->can_download_tracepoint (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -2974,7 +2974,7 @@ debug_target::can_download_tracepoint ()
 void
 target_ops::download_trace_state_variable (const trace_state_variable &arg0)
 {
-  this->beneath->download_trace_state_variable (arg0);
+  this->beneath ()->download_trace_state_variable (arg0);
 }
 
 void
@@ -2986,9 +2986,9 @@ dummy_target::download_trace_state_variable (const trace_state_variable &arg0)
 void
 debug_target::download_trace_state_variable (const trace_state_variable &arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->download_trace_state_variable (...)\n", this->beneath->shortname ());
-  this->beneath->download_trace_state_variable (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->download_trace_state_variable (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->download_trace_state_variable (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->download_trace_state_variable (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->download_trace_state_variable (", this->beneath ()->shortname ());
   target_debug_print_const_trace_state_variable_r (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -2996,7 +2996,7 @@ debug_target::download_trace_state_variable (const trace_state_variable &arg0)
 void
 target_ops::enable_tracepoint (struct bp_location *arg0)
 {
-  this->beneath->enable_tracepoint (arg0);
+  this->beneath ()->enable_tracepoint (arg0);
 }
 
 void
@@ -3008,9 +3008,9 @@ dummy_target::enable_tracepoint (struct bp_location *arg0)
 void
 debug_target::enable_tracepoint (struct bp_location *arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->enable_tracepoint (...)\n", this->beneath->shortname ());
-  this->beneath->enable_tracepoint (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->enable_tracepoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->enable_tracepoint (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->enable_tracepoint (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->enable_tracepoint (", this->beneath ()->shortname ());
   target_debug_print_struct_bp_location_p (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -3018,7 +3018,7 @@ debug_target::enable_tracepoint (struct bp_location *arg0)
 void
 target_ops::disable_tracepoint (struct bp_location *arg0)
 {
-  this->beneath->disable_tracepoint (arg0);
+  this->beneath ()->disable_tracepoint (arg0);
 }
 
 void
@@ -3030,9 +3030,9 @@ dummy_target::disable_tracepoint (struct bp_location *arg0)
 void
 debug_target::disable_tracepoint (struct bp_location *arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->disable_tracepoint (...)\n", this->beneath->shortname ());
-  this->beneath->disable_tracepoint (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->disable_tracepoint (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->disable_tracepoint (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->disable_tracepoint (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->disable_tracepoint (", this->beneath ()->shortname ());
   target_debug_print_struct_bp_location_p (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -3040,7 +3040,7 @@ debug_target::disable_tracepoint (struct bp_location *arg0)
 void
 target_ops::trace_set_readonly_regions ()
 {
-  this->beneath->trace_set_readonly_regions ();
+  this->beneath ()->trace_set_readonly_regions ();
 }
 
 void
@@ -3052,16 +3052,16 @@ dummy_target::trace_set_readonly_regions ()
 void
 debug_target::trace_set_readonly_regions ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->trace_set_readonly_regions (...)\n", this->beneath->shortname ());
-  this->beneath->trace_set_readonly_regions ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->trace_set_readonly_regions (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->trace_set_readonly_regions (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->trace_set_readonly_regions ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->trace_set_readonly_regions (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::trace_start ()
 {
-  this->beneath->trace_start ();
+  this->beneath ()->trace_start ();
 }
 
 void
@@ -3073,16 +3073,16 @@ dummy_target::trace_start ()
 void
 debug_target::trace_start ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->trace_start (...)\n", this->beneath->shortname ());
-  this->beneath->trace_start ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->trace_start (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->trace_start (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->trace_start ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->trace_start (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 int
 target_ops::get_trace_status (struct trace_status *arg0)
 {
-  return this->beneath->get_trace_status (arg0);
+  return this->beneath ()->get_trace_status (arg0);
 }
 
 int
@@ -3095,9 +3095,9 @@ int
 debug_target::get_trace_status (struct trace_status *arg0)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_trace_status (...)\n", this->beneath->shortname ());
-  result = this->beneath->get_trace_status (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_trace_status (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_trace_status (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->get_trace_status (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_trace_status (", this->beneath ()->shortname ());
   target_debug_print_struct_trace_status_p (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
@@ -3108,7 +3108,7 @@ debug_target::get_trace_status (struct trace_status *arg0)
 void
 target_ops::get_tracepoint_status (struct breakpoint *arg0, struct uploaded_tp *arg1)
 {
-  this->beneath->get_tracepoint_status (arg0, arg1);
+  this->beneath ()->get_tracepoint_status (arg0, arg1);
 }
 
 void
@@ -3120,9 +3120,9 @@ dummy_target::get_tracepoint_status (struct breakpoint *arg0, struct uploaded_tp
 void
 debug_target::get_tracepoint_status (struct breakpoint *arg0, struct uploaded_tp *arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_tracepoint_status (...)\n", this->beneath->shortname ());
-  this->beneath->get_tracepoint_status (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_tracepoint_status (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_tracepoint_status (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->get_tracepoint_status (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_tracepoint_status (", this->beneath ()->shortname ());
   target_debug_print_struct_breakpoint_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_struct_uploaded_tp_p (arg1);
@@ -3132,7 +3132,7 @@ debug_target::get_tracepoint_status (struct breakpoint *arg0, struct uploaded_tp
 void
 target_ops::trace_stop ()
 {
-  this->beneath->trace_stop ();
+  this->beneath ()->trace_stop ();
 }
 
 void
@@ -3144,16 +3144,16 @@ dummy_target::trace_stop ()
 void
 debug_target::trace_stop ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->trace_stop (...)\n", this->beneath->shortname ());
-  this->beneath->trace_stop ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->trace_stop (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->trace_stop (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->trace_stop ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->trace_stop (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 int
 target_ops::trace_find (enum trace_find_type arg0, int arg1, CORE_ADDR arg2, CORE_ADDR arg3, int *arg4)
 {
-  return this->beneath->trace_find (arg0, arg1, arg2, arg3, arg4);
+  return this->beneath ()->trace_find (arg0, arg1, arg2, arg3, arg4);
 }
 
 int
@@ -3166,9 +3166,9 @@ int
 debug_target::trace_find (enum trace_find_type arg0, int arg1, CORE_ADDR arg2, CORE_ADDR arg3, int *arg4)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->trace_find (...)\n", this->beneath->shortname ());
-  result = this->beneath->trace_find (arg0, arg1, arg2, arg3, arg4);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->trace_find (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->trace_find (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->trace_find (arg0, arg1, arg2, arg3, arg4);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->trace_find (", this->beneath ()->shortname ());
   target_debug_print_enum_trace_find_type (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -3187,7 +3187,7 @@ debug_target::trace_find (enum trace_find_type arg0, int arg1, CORE_ADDR arg2, C
 bool
 target_ops::get_trace_state_variable_value (int arg0, LONGEST *arg1)
 {
-  return this->beneath->get_trace_state_variable_value (arg0, arg1);
+  return this->beneath ()->get_trace_state_variable_value (arg0, arg1);
 }
 
 bool
@@ -3200,9 +3200,9 @@ bool
 debug_target::get_trace_state_variable_value (int arg0, LONGEST *arg1)
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_trace_state_variable_value (...)\n", this->beneath->shortname ());
-  result = this->beneath->get_trace_state_variable_value (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_trace_state_variable_value (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_trace_state_variable_value (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->get_trace_state_variable_value (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_trace_state_variable_value (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_LONGEST_p (arg1);
@@ -3215,7 +3215,7 @@ debug_target::get_trace_state_variable_value (int arg0, LONGEST *arg1)
 int
 target_ops::save_trace_data (const char *arg0)
 {
-  return this->beneath->save_trace_data (arg0);
+  return this->beneath ()->save_trace_data (arg0);
 }
 
 int
@@ -3228,9 +3228,9 @@ int
 debug_target::save_trace_data (const char *arg0)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->save_trace_data (...)\n", this->beneath->shortname ());
-  result = this->beneath->save_trace_data (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->save_trace_data (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->save_trace_data (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->save_trace_data (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->save_trace_data (", this->beneath ()->shortname ());
   target_debug_print_const_char_p (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
@@ -3241,7 +3241,7 @@ debug_target::save_trace_data (const char *arg0)
 int
 target_ops::upload_tracepoints (struct uploaded_tp **arg0)
 {
-  return this->beneath->upload_tracepoints (arg0);
+  return this->beneath ()->upload_tracepoints (arg0);
 }
 
 int
@@ -3254,9 +3254,9 @@ int
 debug_target::upload_tracepoints (struct uploaded_tp **arg0)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->upload_tracepoints (...)\n", this->beneath->shortname ());
-  result = this->beneath->upload_tracepoints (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->upload_tracepoints (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->upload_tracepoints (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->upload_tracepoints (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->upload_tracepoints (", this->beneath ()->shortname ());
   target_debug_print_struct_uploaded_tp_pp (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
@@ -3267,7 +3267,7 @@ debug_target::upload_tracepoints (struct uploaded_tp **arg0)
 int
 target_ops::upload_trace_state_variables (struct uploaded_tsv **arg0)
 {
-  return this->beneath->upload_trace_state_variables (arg0);
+  return this->beneath ()->upload_trace_state_variables (arg0);
 }
 
 int
@@ -3280,9 +3280,9 @@ int
 debug_target::upload_trace_state_variables (struct uploaded_tsv **arg0)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->upload_trace_state_variables (...)\n", this->beneath->shortname ());
-  result = this->beneath->upload_trace_state_variables (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->upload_trace_state_variables (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->upload_trace_state_variables (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->upload_trace_state_variables (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->upload_trace_state_variables (", this->beneath ()->shortname ());
   target_debug_print_struct_uploaded_tsv_pp (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
@@ -3293,7 +3293,7 @@ debug_target::upload_trace_state_variables (struct uploaded_tsv **arg0)
 LONGEST
 target_ops::get_raw_trace_data (gdb_byte *arg0, ULONGEST arg1, LONGEST arg2)
 {
-  return this->beneath->get_raw_trace_data (arg0, arg1, arg2);
+  return this->beneath ()->get_raw_trace_data (arg0, arg1, arg2);
 }
 
 LONGEST
@@ -3306,9 +3306,9 @@ LONGEST
 debug_target::get_raw_trace_data (gdb_byte *arg0, ULONGEST arg1, LONGEST arg2)
 {
   LONGEST result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_raw_trace_data (...)\n", this->beneath->shortname ());
-  result = this->beneath->get_raw_trace_data (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_raw_trace_data (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_raw_trace_data (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->get_raw_trace_data (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_raw_trace_data (", this->beneath ()->shortname ());
   target_debug_print_gdb_byte_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_ULONGEST (arg1);
@@ -3323,7 +3323,7 @@ debug_target::get_raw_trace_data (gdb_byte *arg0, ULONGEST arg1, LONGEST arg2)
 int
 target_ops::get_min_fast_tracepoint_insn_len ()
 {
-  return this->beneath->get_min_fast_tracepoint_insn_len ();
+  return this->beneath ()->get_min_fast_tracepoint_insn_len ();
 }
 
 int
@@ -3336,9 +3336,9 @@ int
 debug_target::get_min_fast_tracepoint_insn_len ()
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_min_fast_tracepoint_insn_len (...)\n", this->beneath->shortname ());
-  result = this->beneath->get_min_fast_tracepoint_insn_len ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_min_fast_tracepoint_insn_len (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_min_fast_tracepoint_insn_len (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->get_min_fast_tracepoint_insn_len ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_min_fast_tracepoint_insn_len (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -3348,7 +3348,7 @@ debug_target::get_min_fast_tracepoint_insn_len ()
 void
 target_ops::set_disconnected_tracing (int arg0)
 {
-  this->beneath->set_disconnected_tracing (arg0);
+  this->beneath ()->set_disconnected_tracing (arg0);
 }
 
 void
@@ -3359,9 +3359,9 @@ dummy_target::set_disconnected_tracing (int arg0)
 void
 debug_target::set_disconnected_tracing (int arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->set_disconnected_tracing (...)\n", this->beneath->shortname ());
-  this->beneath->set_disconnected_tracing (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->set_disconnected_tracing (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->set_disconnected_tracing (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->set_disconnected_tracing (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->set_disconnected_tracing (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -3369,7 +3369,7 @@ debug_target::set_disconnected_tracing (int arg0)
 void
 target_ops::set_circular_trace_buffer (int arg0)
 {
-  this->beneath->set_circular_trace_buffer (arg0);
+  this->beneath ()->set_circular_trace_buffer (arg0);
 }
 
 void
@@ -3380,9 +3380,9 @@ dummy_target::set_circular_trace_buffer (int arg0)
 void
 debug_target::set_circular_trace_buffer (int arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->set_circular_trace_buffer (...)\n", this->beneath->shortname ());
-  this->beneath->set_circular_trace_buffer (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->set_circular_trace_buffer (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->set_circular_trace_buffer (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->set_circular_trace_buffer (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->set_circular_trace_buffer (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -3390,7 +3390,7 @@ debug_target::set_circular_trace_buffer (int arg0)
 void
 target_ops::set_trace_buffer_size (LONGEST arg0)
 {
-  this->beneath->set_trace_buffer_size (arg0);
+  this->beneath ()->set_trace_buffer_size (arg0);
 }
 
 void
@@ -3401,9 +3401,9 @@ dummy_target::set_trace_buffer_size (LONGEST arg0)
 void
 debug_target::set_trace_buffer_size (LONGEST arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->set_trace_buffer_size (...)\n", this->beneath->shortname ());
-  this->beneath->set_trace_buffer_size (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->set_trace_buffer_size (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->set_trace_buffer_size (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->set_trace_buffer_size (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->set_trace_buffer_size (", this->beneath ()->shortname ());
   target_debug_print_LONGEST (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -3411,7 +3411,7 @@ debug_target::set_trace_buffer_size (LONGEST arg0)
 bool
 target_ops::set_trace_notes (const char *arg0, const char *arg1, const char *arg2)
 {
-  return this->beneath->set_trace_notes (arg0, arg1, arg2);
+  return this->beneath ()->set_trace_notes (arg0, arg1, arg2);
 }
 
 bool
@@ -3424,9 +3424,9 @@ bool
 debug_target::set_trace_notes (const char *arg0, const char *arg1, const char *arg2)
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->set_trace_notes (...)\n", this->beneath->shortname ());
-  result = this->beneath->set_trace_notes (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->set_trace_notes (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->set_trace_notes (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->set_trace_notes (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->set_trace_notes (", this->beneath ()->shortname ());
   target_debug_print_const_char_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_const_char_p (arg1);
@@ -3441,7 +3441,7 @@ debug_target::set_trace_notes (const char *arg0, const char *arg1, const char *a
 int
 target_ops::core_of_thread (ptid_t arg0)
 {
-  return this->beneath->core_of_thread (arg0);
+  return this->beneath ()->core_of_thread (arg0);
 }
 
 int
@@ -3454,9 +3454,9 @@ int
 debug_target::core_of_thread (ptid_t arg0)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->core_of_thread (...)\n", this->beneath->shortname ());
-  result = this->beneath->core_of_thread (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->core_of_thread (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->core_of_thread (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->core_of_thread (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->core_of_thread (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_int (result);
@@ -3467,7 +3467,7 @@ debug_target::core_of_thread (ptid_t arg0)
 int
 target_ops::verify_memory (const gdb_byte *arg0, CORE_ADDR arg1, ULONGEST arg2)
 {
-  return this->beneath->verify_memory (arg0, arg1, arg2);
+  return this->beneath ()->verify_memory (arg0, arg1, arg2);
 }
 
 int
@@ -3480,9 +3480,9 @@ int
 debug_target::verify_memory (const gdb_byte *arg0, CORE_ADDR arg1, ULONGEST arg2)
 {
   int result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->verify_memory (...)\n", this->beneath->shortname ());
-  result = this->beneath->verify_memory (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->verify_memory (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->verify_memory (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->verify_memory (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->verify_memory (", this->beneath ()->shortname ());
   target_debug_print_const_gdb_byte_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_CORE_ADDR (arg1);
@@ -3497,7 +3497,7 @@ debug_target::verify_memory (const gdb_byte *arg0, CORE_ADDR arg1, ULONGEST arg2
 bool
 target_ops::get_tib_address (ptid_t arg0, CORE_ADDR *arg1)
 {
-  return this->beneath->get_tib_address (arg0, arg1);
+  return this->beneath ()->get_tib_address (arg0, arg1);
 }
 
 bool
@@ -3510,9 +3510,9 @@ bool
 debug_target::get_tib_address (ptid_t arg0, CORE_ADDR *arg1)
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_tib_address (...)\n", this->beneath->shortname ());
-  result = this->beneath->get_tib_address (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_tib_address (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_tib_address (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->get_tib_address (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_tib_address (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_CORE_ADDR_p (arg1);
@@ -3525,7 +3525,7 @@ debug_target::get_tib_address (ptid_t arg0, CORE_ADDR *arg1)
 void
 target_ops::set_permissions ()
 {
-  this->beneath->set_permissions ();
+  this->beneath ()->set_permissions ();
 }
 
 void
@@ -3536,16 +3536,16 @@ dummy_target::set_permissions ()
 void
 debug_target::set_permissions ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->set_permissions (...)\n", this->beneath->shortname ());
-  this->beneath->set_permissions ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->set_permissions (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->set_permissions (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->set_permissions ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->set_permissions (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 bool
 target_ops::static_tracepoint_marker_at (CORE_ADDR arg0, static_tracepoint_marker *arg1)
 {
-  return this->beneath->static_tracepoint_marker_at (arg0, arg1);
+  return this->beneath ()->static_tracepoint_marker_at (arg0, arg1);
 }
 
 bool
@@ -3558,9 +3558,9 @@ bool
 debug_target::static_tracepoint_marker_at (CORE_ADDR arg0, static_tracepoint_marker *arg1)
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->static_tracepoint_marker_at (...)\n", this->beneath->shortname ());
-  result = this->beneath->static_tracepoint_marker_at (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->static_tracepoint_marker_at (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->static_tracepoint_marker_at (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->static_tracepoint_marker_at (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->static_tracepoint_marker_at (", this->beneath ()->shortname ());
   target_debug_print_CORE_ADDR (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_static_tracepoint_marker_p (arg1);
@@ -3573,7 +3573,7 @@ debug_target::static_tracepoint_marker_at (CORE_ADDR arg0, static_tracepoint_mar
 std::vector<static_tracepoint_marker>
 target_ops::static_tracepoint_markers_by_strid (const char *arg0)
 {
-  return this->beneath->static_tracepoint_markers_by_strid (arg0);
+  return this->beneath ()->static_tracepoint_markers_by_strid (arg0);
 }
 
 std::vector<static_tracepoint_marker>
@@ -3586,9 +3586,9 @@ std::vector<static_tracepoint_marker>
 debug_target::static_tracepoint_markers_by_strid (const char *arg0)
 {
   std::vector<static_tracepoint_marker> result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->static_tracepoint_markers_by_strid (...)\n", this->beneath->shortname ());
-  result = this->beneath->static_tracepoint_markers_by_strid (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->static_tracepoint_markers_by_strid (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->static_tracepoint_markers_by_strid (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->static_tracepoint_markers_by_strid (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->static_tracepoint_markers_by_strid (", this->beneath ()->shortname ());
   target_debug_print_const_char_p (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_std_vector_static_tracepoint_marker (result);
@@ -3599,7 +3599,7 @@ debug_target::static_tracepoint_markers_by_strid (const char *arg0)
 traceframe_info_up
 target_ops::traceframe_info ()
 {
-  return this->beneath->traceframe_info ();
+  return this->beneath ()->traceframe_info ();
 }
 
 traceframe_info_up
@@ -3612,9 +3612,9 @@ traceframe_info_up
 debug_target::traceframe_info ()
 {
   traceframe_info_up result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->traceframe_info (...)\n", this->beneath->shortname ());
-  result = this->beneath->traceframe_info ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->traceframe_info (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->traceframe_info (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->traceframe_info ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->traceframe_info (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_traceframe_info_up (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -3624,7 +3624,7 @@ debug_target::traceframe_info ()
 bool
 target_ops::use_agent (bool arg0)
 {
-  return this->beneath->use_agent (arg0);
+  return this->beneath ()->use_agent (arg0);
 }
 
 bool
@@ -3637,9 +3637,9 @@ bool
 debug_target::use_agent (bool arg0)
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->use_agent (...)\n", this->beneath->shortname ());
-  result = this->beneath->use_agent (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->use_agent (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->use_agent (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->use_agent (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->use_agent (", this->beneath ()->shortname ());
   target_debug_print_bool (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
@@ -3650,7 +3650,7 @@ debug_target::use_agent (bool arg0)
 bool
 target_ops::can_use_agent ()
 {
-  return this->beneath->can_use_agent ();
+  return this->beneath ()->can_use_agent ();
 }
 
 bool
@@ -3663,9 +3663,9 @@ bool
 debug_target::can_use_agent ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->can_use_agent (...)\n", this->beneath->shortname ());
-  result = this->beneath->can_use_agent ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->can_use_agent (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->can_use_agent (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->can_use_agent ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->can_use_agent (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -3675,7 +3675,7 @@ debug_target::can_use_agent ()
 struct btrace_target_info *
 target_ops::enable_btrace (ptid_t arg0, const struct btrace_config *arg1)
 {
-  return this->beneath->enable_btrace (arg0, arg1);
+  return this->beneath ()->enable_btrace (arg0, arg1);
 }
 
 struct btrace_target_info *
@@ -3688,9 +3688,9 @@ struct btrace_target_info *
 debug_target::enable_btrace (ptid_t arg0, const struct btrace_config *arg1)
 {
   struct btrace_target_info * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->enable_btrace (...)\n", this->beneath->shortname ());
-  result = this->beneath->enable_btrace (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->enable_btrace (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->enable_btrace (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->enable_btrace (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->enable_btrace (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_const_struct_btrace_config_p (arg1);
@@ -3703,7 +3703,7 @@ debug_target::enable_btrace (ptid_t arg0, const struct btrace_config *arg1)
 void
 target_ops::disable_btrace (struct btrace_target_info *arg0)
 {
-  this->beneath->disable_btrace (arg0);
+  this->beneath ()->disable_btrace (arg0);
 }
 
 void
@@ -3715,9 +3715,9 @@ dummy_target::disable_btrace (struct btrace_target_info *arg0)
 void
 debug_target::disable_btrace (struct btrace_target_info *arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->disable_btrace (...)\n", this->beneath->shortname ());
-  this->beneath->disable_btrace (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->disable_btrace (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->disable_btrace (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->disable_btrace (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->disable_btrace (", this->beneath ()->shortname ());
   target_debug_print_struct_btrace_target_info_p (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -3725,7 +3725,7 @@ debug_target::disable_btrace (struct btrace_target_info *arg0)
 void
 target_ops::teardown_btrace (struct btrace_target_info *arg0)
 {
-  this->beneath->teardown_btrace (arg0);
+  this->beneath ()->teardown_btrace (arg0);
 }
 
 void
@@ -3737,9 +3737,9 @@ dummy_target::teardown_btrace (struct btrace_target_info *arg0)
 void
 debug_target::teardown_btrace (struct btrace_target_info *arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->teardown_btrace (...)\n", this->beneath->shortname ());
-  this->beneath->teardown_btrace (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->teardown_btrace (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->teardown_btrace (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->teardown_btrace (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->teardown_btrace (", this->beneath ()->shortname ());
   target_debug_print_struct_btrace_target_info_p (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -3747,7 +3747,7 @@ debug_target::teardown_btrace (struct btrace_target_info *arg0)
 enum btrace_error
 target_ops::read_btrace (struct btrace_data *arg0, struct btrace_target_info *arg1, enum btrace_read_type arg2)
 {
-  return this->beneath->read_btrace (arg0, arg1, arg2);
+  return this->beneath ()->read_btrace (arg0, arg1, arg2);
 }
 
 enum btrace_error
@@ -3760,9 +3760,9 @@ enum btrace_error
 debug_target::read_btrace (struct btrace_data *arg0, struct btrace_target_info *arg1, enum btrace_read_type arg2)
 {
   enum btrace_error result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->read_btrace (...)\n", this->beneath->shortname ());
-  result = this->beneath->read_btrace (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->read_btrace (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->read_btrace (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->read_btrace (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->read_btrace (", this->beneath ()->shortname ());
   target_debug_print_struct_btrace_data_p (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_struct_btrace_target_info_p (arg1);
@@ -3777,7 +3777,7 @@ debug_target::read_btrace (struct btrace_data *arg0, struct btrace_target_info *
 const struct btrace_config *
 target_ops::btrace_conf (const struct btrace_target_info *arg0)
 {
-  return this->beneath->btrace_conf (arg0);
+  return this->beneath ()->btrace_conf (arg0);
 }
 
 const struct btrace_config *
@@ -3790,9 +3790,9 @@ const struct btrace_config *
 debug_target::btrace_conf (const struct btrace_target_info *arg0)
 {
   const struct btrace_config * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->btrace_conf (...)\n", this->beneath->shortname ());
-  result = this->beneath->btrace_conf (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->btrace_conf (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->btrace_conf (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->btrace_conf (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->btrace_conf (", this->beneath ()->shortname ());
   target_debug_print_const_struct_btrace_target_info_p (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_const_struct_btrace_config_p (result);
@@ -3803,7 +3803,7 @@ debug_target::btrace_conf (const struct btrace_target_info *arg0)
 enum record_method
 target_ops::record_method (ptid_t arg0)
 {
-  return this->beneath->record_method (arg0);
+  return this->beneath ()->record_method (arg0);
 }
 
 enum record_method
@@ -3816,9 +3816,9 @@ enum record_method
 debug_target::record_method (ptid_t arg0)
 {
   enum record_method result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->record_method (...)\n", this->beneath->shortname ());
-  result = this->beneath->record_method (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->record_method (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->record_method (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->record_method (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->record_method (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_enum_record_method (result);
@@ -3829,7 +3829,7 @@ debug_target::record_method (ptid_t arg0)
 void
 target_ops::stop_recording ()
 {
-  this->beneath->stop_recording ();
+  this->beneath ()->stop_recording ();
 }
 
 void
@@ -3840,16 +3840,16 @@ dummy_target::stop_recording ()
 void
 debug_target::stop_recording ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->stop_recording (...)\n", this->beneath->shortname ());
-  this->beneath->stop_recording ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->stop_recording (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->stop_recording (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->stop_recording ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->stop_recording (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::info_record ()
 {
-  this->beneath->info_record ();
+  this->beneath ()->info_record ();
 }
 
 void
@@ -3860,16 +3860,16 @@ dummy_target::info_record ()
 void
 debug_target::info_record ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->info_record (...)\n", this->beneath->shortname ());
-  this->beneath->info_record ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->info_record (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->info_record (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->info_record ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->info_record (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::save_record (const char *arg0)
 {
-  this->beneath->save_record (arg0);
+  this->beneath ()->save_record (arg0);
 }
 
 void
@@ -3881,9 +3881,9 @@ dummy_target::save_record (const char *arg0)
 void
 debug_target::save_record (const char *arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->save_record (...)\n", this->beneath->shortname ());
-  this->beneath->save_record (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->save_record (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->save_record (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->save_record (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->save_record (", this->beneath ()->shortname ());
   target_debug_print_const_char_p (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -3891,7 +3891,7 @@ debug_target::save_record (const char *arg0)
 bool
 target_ops::supports_delete_record ()
 {
-  return this->beneath->supports_delete_record ();
+  return this->beneath ()->supports_delete_record ();
 }
 
 bool
@@ -3904,9 +3904,9 @@ bool
 debug_target::supports_delete_record ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_delete_record (...)\n", this->beneath->shortname ());
-  result = this->beneath->supports_delete_record ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_delete_record (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->supports_delete_record (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->supports_delete_record ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->supports_delete_record (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -3916,7 +3916,7 @@ debug_target::supports_delete_record ()
 void
 target_ops::delete_record ()
 {
-  this->beneath->delete_record ();
+  this->beneath ()->delete_record ();
 }
 
 void
@@ -3928,16 +3928,16 @@ dummy_target::delete_record ()
 void
 debug_target::delete_record ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->delete_record (...)\n", this->beneath->shortname ());
-  this->beneath->delete_record ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->delete_record (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->delete_record (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->delete_record ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->delete_record (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 bool
 target_ops::record_is_replaying (ptid_t arg0)
 {
-  return this->beneath->record_is_replaying (arg0);
+  return this->beneath ()->record_is_replaying (arg0);
 }
 
 bool
@@ -3950,9 +3950,9 @@ bool
 debug_target::record_is_replaying (ptid_t arg0)
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->record_is_replaying (...)\n", this->beneath->shortname ());
-  result = this->beneath->record_is_replaying (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->record_is_replaying (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->record_is_replaying (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->record_is_replaying (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->record_is_replaying (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
@@ -3963,7 +3963,7 @@ debug_target::record_is_replaying (ptid_t arg0)
 bool
 target_ops::record_will_replay (ptid_t arg0, int arg1)
 {
-  return this->beneath->record_will_replay (arg0, arg1);
+  return this->beneath ()->record_will_replay (arg0, arg1);
 }
 
 bool
@@ -3976,9 +3976,9 @@ bool
 debug_target::record_will_replay (ptid_t arg0, int arg1)
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->record_will_replay (...)\n", this->beneath->shortname ());
-  result = this->beneath->record_will_replay (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->record_will_replay (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->record_will_replay (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->record_will_replay (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->record_will_replay (", this->beneath ()->shortname ());
   target_debug_print_ptid_t (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -3991,7 +3991,7 @@ debug_target::record_will_replay (ptid_t arg0, int arg1)
 void
 target_ops::record_stop_replaying ()
 {
-  this->beneath->record_stop_replaying ();
+  this->beneath ()->record_stop_replaying ();
 }
 
 void
@@ -4002,16 +4002,16 @@ dummy_target::record_stop_replaying ()
 void
 debug_target::record_stop_replaying ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->record_stop_replaying (...)\n", this->beneath->shortname ());
-  this->beneath->record_stop_replaying ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->record_stop_replaying (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->record_stop_replaying (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->record_stop_replaying ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->record_stop_replaying (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::goto_record_begin ()
 {
-  this->beneath->goto_record_begin ();
+  this->beneath ()->goto_record_begin ();
 }
 
 void
@@ -4023,16 +4023,16 @@ dummy_target::goto_record_begin ()
 void
 debug_target::goto_record_begin ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->goto_record_begin (...)\n", this->beneath->shortname ());
-  this->beneath->goto_record_begin ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->goto_record_begin (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->goto_record_begin (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->goto_record_begin ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->goto_record_begin (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::goto_record_end ()
 {
-  this->beneath->goto_record_end ();
+  this->beneath ()->goto_record_end ();
 }
 
 void
@@ -4044,16 +4044,16 @@ dummy_target::goto_record_end ()
 void
 debug_target::goto_record_end ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->goto_record_end (...)\n", this->beneath->shortname ());
-  this->beneath->goto_record_end ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->goto_record_end (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->goto_record_end (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->goto_record_end ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->goto_record_end (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::goto_record (ULONGEST arg0)
 {
-  this->beneath->goto_record (arg0);
+  this->beneath ()->goto_record (arg0);
 }
 
 void
@@ -4065,9 +4065,9 @@ dummy_target::goto_record (ULONGEST arg0)
 void
 debug_target::goto_record (ULONGEST arg0)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->goto_record (...)\n", this->beneath->shortname ());
-  this->beneath->goto_record (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->goto_record (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->goto_record (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->goto_record (arg0);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->goto_record (", this->beneath ()->shortname ());
   target_debug_print_ULONGEST (arg0);
   fputs_unfiltered (")\n", gdb_stdlog);
 }
@@ -4075,7 +4075,7 @@ debug_target::goto_record (ULONGEST arg0)
 void
 target_ops::insn_history (int arg0, gdb_disassembly_flags arg1)
 {
-  this->beneath->insn_history (arg0, arg1);
+  this->beneath ()->insn_history (arg0, arg1);
 }
 
 void
@@ -4087,9 +4087,9 @@ dummy_target::insn_history (int arg0, gdb_disassembly_flags arg1)
 void
 debug_target::insn_history (int arg0, gdb_disassembly_flags arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->insn_history (...)\n", this->beneath->shortname ());
-  this->beneath->insn_history (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->insn_history (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->insn_history (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->insn_history (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->insn_history (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_gdb_disassembly_flags (arg1);
@@ -4099,7 +4099,7 @@ debug_target::insn_history (int arg0, gdb_disassembly_flags arg1)
 void
 target_ops::insn_history_from (ULONGEST arg0, int arg1, gdb_disassembly_flags arg2)
 {
-  this->beneath->insn_history_from (arg0, arg1, arg2);
+  this->beneath ()->insn_history_from (arg0, arg1, arg2);
 }
 
 void
@@ -4111,9 +4111,9 @@ dummy_target::insn_history_from (ULONGEST arg0, int arg1, gdb_disassembly_flags
 void
 debug_target::insn_history_from (ULONGEST arg0, int arg1, gdb_disassembly_flags arg2)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->insn_history_from (...)\n", this->beneath->shortname ());
-  this->beneath->insn_history_from (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->insn_history_from (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->insn_history_from (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->insn_history_from (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->insn_history_from (", this->beneath ()->shortname ());
   target_debug_print_ULONGEST (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -4125,7 +4125,7 @@ debug_target::insn_history_from (ULONGEST arg0, int arg1, gdb_disassembly_flags
 void
 target_ops::insn_history_range (ULONGEST arg0, ULONGEST arg1, gdb_disassembly_flags arg2)
 {
-  this->beneath->insn_history_range (arg0, arg1, arg2);
+  this->beneath ()->insn_history_range (arg0, arg1, arg2);
 }
 
 void
@@ -4137,9 +4137,9 @@ dummy_target::insn_history_range (ULONGEST arg0, ULONGEST arg1, gdb_disassembly_
 void
 debug_target::insn_history_range (ULONGEST arg0, ULONGEST arg1, gdb_disassembly_flags arg2)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->insn_history_range (...)\n", this->beneath->shortname ());
-  this->beneath->insn_history_range (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->insn_history_range (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->insn_history_range (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->insn_history_range (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->insn_history_range (", this->beneath ()->shortname ());
   target_debug_print_ULONGEST (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_ULONGEST (arg1);
@@ -4151,7 +4151,7 @@ debug_target::insn_history_range (ULONGEST arg0, ULONGEST arg1, gdb_disassembly_
 void
 target_ops::call_history (int arg0, record_print_flags arg1)
 {
-  this->beneath->call_history (arg0, arg1);
+  this->beneath ()->call_history (arg0, arg1);
 }
 
 void
@@ -4163,9 +4163,9 @@ dummy_target::call_history (int arg0, record_print_flags arg1)
 void
 debug_target::call_history (int arg0, record_print_flags arg1)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->call_history (...)\n", this->beneath->shortname ());
-  this->beneath->call_history (arg0, arg1);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->call_history (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->call_history (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->call_history (arg0, arg1);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->call_history (", this->beneath ()->shortname ());
   target_debug_print_int (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_record_print_flags (arg1);
@@ -4175,7 +4175,7 @@ debug_target::call_history (int arg0, record_print_flags arg1)
 void
 target_ops::call_history_from (ULONGEST arg0, int arg1, record_print_flags arg2)
 {
-  this->beneath->call_history_from (arg0, arg1, arg2);
+  this->beneath ()->call_history_from (arg0, arg1, arg2);
 }
 
 void
@@ -4187,9 +4187,9 @@ dummy_target::call_history_from (ULONGEST arg0, int arg1, record_print_flags arg
 void
 debug_target::call_history_from (ULONGEST arg0, int arg1, record_print_flags arg2)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->call_history_from (...)\n", this->beneath->shortname ());
-  this->beneath->call_history_from (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->call_history_from (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->call_history_from (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->call_history_from (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->call_history_from (", this->beneath ()->shortname ());
   target_debug_print_ULONGEST (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_int (arg1);
@@ -4201,7 +4201,7 @@ debug_target::call_history_from (ULONGEST arg0, int arg1, record_print_flags arg
 void
 target_ops::call_history_range (ULONGEST arg0, ULONGEST arg1, record_print_flags arg2)
 {
-  this->beneath->call_history_range (arg0, arg1, arg2);
+  this->beneath ()->call_history_range (arg0, arg1, arg2);
 }
 
 void
@@ -4213,9 +4213,9 @@ dummy_target::call_history_range (ULONGEST arg0, ULONGEST arg1, record_print_fla
 void
 debug_target::call_history_range (ULONGEST arg0, ULONGEST arg1, record_print_flags arg2)
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->call_history_range (...)\n", this->beneath->shortname ());
-  this->beneath->call_history_range (arg0, arg1, arg2);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->call_history_range (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->call_history_range (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->call_history_range (arg0, arg1, arg2);
+  fprintf_unfiltered (gdb_stdlog, "<- %s->call_history_range (", this->beneath ()->shortname ());
   target_debug_print_ULONGEST (arg0);
   fputs_unfiltered (", ", gdb_stdlog);
   target_debug_print_ULONGEST (arg1);
@@ -4227,7 +4227,7 @@ debug_target::call_history_range (ULONGEST arg0, ULONGEST arg1, record_print_fla
 bool
 target_ops::augmented_libraries_svr4_read ()
 {
-  return this->beneath->augmented_libraries_svr4_read ();
+  return this->beneath ()->augmented_libraries_svr4_read ();
 }
 
 bool
@@ -4240,9 +4240,9 @@ bool
 debug_target::augmented_libraries_svr4_read ()
 {
   bool result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->augmented_libraries_svr4_read (...)\n", this->beneath->shortname ());
-  result = this->beneath->augmented_libraries_svr4_read ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->augmented_libraries_svr4_read (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->augmented_libraries_svr4_read (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->augmented_libraries_svr4_read ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->augmented_libraries_svr4_read (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_bool (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -4252,7 +4252,7 @@ debug_target::augmented_libraries_svr4_read ()
 const struct frame_unwind *
 target_ops::get_unwinder ()
 {
-  return this->beneath->get_unwinder ();
+  return this->beneath ()->get_unwinder ();
 }
 
 const struct frame_unwind *
@@ -4265,9 +4265,9 @@ const struct frame_unwind *
 debug_target::get_unwinder ()
 {
   const struct frame_unwind * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_unwinder (...)\n", this->beneath->shortname ());
-  result = this->beneath->get_unwinder ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_unwinder (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_unwinder (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->get_unwinder ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_unwinder (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_const_struct_frame_unwind_p (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -4277,7 +4277,7 @@ debug_target::get_unwinder ()
 const struct frame_unwind *
 target_ops::get_tailcall_unwinder ()
 {
-  return this->beneath->get_tailcall_unwinder ();
+  return this->beneath ()->get_tailcall_unwinder ();
 }
 
 const struct frame_unwind *
@@ -4290,9 +4290,9 @@ const struct frame_unwind *
 debug_target::get_tailcall_unwinder ()
 {
   const struct frame_unwind * result;
-  fprintf_unfiltered (gdb_stdlog, "-> %s->get_tailcall_unwinder (...)\n", this->beneath->shortname ());
-  result = this->beneath->get_tailcall_unwinder ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->get_tailcall_unwinder (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->get_tailcall_unwinder (...)\n", this->beneath ()->shortname ());
+  result = this->beneath ()->get_tailcall_unwinder ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->get_tailcall_unwinder (", this->beneath ()->shortname ());
   fputs_unfiltered (") = ", gdb_stdlog);
   target_debug_print_const_struct_frame_unwind_p (result);
   fputs_unfiltered ("\n", gdb_stdlog);
@@ -4302,7 +4302,7 @@ debug_target::get_tailcall_unwinder ()
 void
 target_ops::prepare_to_generate_core ()
 {
-  this->beneath->prepare_to_generate_core ();
+  this->beneath ()->prepare_to_generate_core ();
 }
 
 void
@@ -4313,16 +4313,16 @@ dummy_target::prepare_to_generate_core ()
 void
 debug_target::prepare_to_generate_core ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->prepare_to_generate_core (...)\n", this->beneath->shortname ());
-  this->beneath->prepare_to_generate_core ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->prepare_to_generate_core (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->prepare_to_generate_core (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->prepare_to_generate_core ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->prepare_to_generate_core (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
 void
 target_ops::done_generating_core ()
 {
-  this->beneath->done_generating_core ();
+  this->beneath ()->done_generating_core ();
 }
 
 void
@@ -4333,9 +4333,9 @@ dummy_target::done_generating_core ()
 void
 debug_target::done_generating_core ()
 {
-  fprintf_unfiltered (gdb_stdlog, "-> %s->done_generating_core (...)\n", this->beneath->shortname ());
-  this->beneath->done_generating_core ();
-  fprintf_unfiltered (gdb_stdlog, "<- %s->done_generating_core (", this->beneath->shortname ());
+  fprintf_unfiltered (gdb_stdlog, "-> %s->done_generating_core (...)\n", this->beneath ()->shortname ());
+  this->beneath ()->done_generating_core ();
+  fprintf_unfiltered (gdb_stdlog, "<- %s->done_generating_core (", this->beneath ()->shortname ());
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
diff --git a/gdb/target.c b/gdb/target.c
index 13f7e68fdf..c8fa8e1217 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -268,9 +268,7 @@ default_child_has_execution (ptid_t the_ptid)
 int
 target_has_all_memory_1 (void)
 {
-  struct target_ops *t;
-
-  for (t = current_top_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath ())
     if (t->has_all_memory ())
       return 1;
 
@@ -280,9 +278,7 @@ target_has_all_memory_1 (void)
 int
 target_has_memory_1 (void)
 {
-  struct target_ops *t;
-
-  for (t = current_top_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath ())
     if (t->has_memory ())
       return 1;
 
@@ -292,9 +288,7 @@ target_has_memory_1 (void)
 int
 target_has_stack_1 (void)
 {
-  struct target_ops *t;
-
-  for (t = current_top_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath ())
     if (t->has_stack ())
       return 1;
 
@@ -304,9 +298,7 @@ target_has_stack_1 (void)
 int
 target_has_registers_1 (void)
 {
-  struct target_ops *t;
-
-  for (t = current_top_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath ())
     if (t->has_registers ())
       return 1;
 
@@ -316,9 +308,7 @@ target_has_registers_1 (void)
 int
 target_has_execution_1 (ptid_t the_ptid)
 {
-  struct target_ops *t;
-
-  for (t = current_top_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath ())
     if (t->has_execution (the_ptid))
       return 1;
 
@@ -654,7 +644,7 @@ push_target (struct target_ops *t)
   struct target_ops **cur;
 
   /* Find the proper stratum to install this target in.  */
-  for (cur = &g_current_top_target; (*cur) != NULL; cur = &(*cur)->beneath)
+  for (cur = &g_current_top_target; (*cur) != NULL; cur = &(*cur)->m_beneath)
     {
       if ((int) (t->to_stratum) >= (int) (*cur)->to_stratum)
 	break;
@@ -669,13 +659,13 @@ push_target (struct target_ops *t)
          and un-hook it from the stack.  */
       struct target_ops *tmp = (*cur);
 
-      (*cur) = (*cur)->beneath;
-      tmp->beneath = NULL;
+      (*cur) = (*cur)->m_beneath;
+      tmp->m_beneath = NULL;
       target_close (tmp);
     }
 
   /* We have removed all targets in our stratum, now add the new one.  */
-  t->beneath = (*cur);
+  t->m_beneath = (*cur);
   (*cur) = t;
 }
 
@@ -695,7 +685,7 @@ unpush_target (struct target_ops *t)
   /* Look for the specified target.  Note that we assume that a target
      can only occur once in the target stack.  */
 
-  for (cur = &g_current_top_target; (*cur) != NULL; cur = &(*cur)->beneath)
+  for (cur = &g_current_top_target; (*cur) != NULL; cur = &(*cur)->m_beneath)
     {
       if ((*cur) == t)
 	break;
@@ -708,8 +698,8 @@ unpush_target (struct target_ops *t)
 
   /* Unchain the target.  */
   tmp = (*cur);
-  (*cur) = (*cur)->beneath;
-  tmp->beneath = NULL;
+  (*cur) = (*cur)->m_beneath;
+  tmp->m_beneath = NULL;
 
   /* Finally close the target.  Note we do this after unchaining, so
      any target method calls from within the target_close
@@ -761,9 +751,9 @@ pop_all_targets (void)
 int
 target_is_pushed (struct target_ops *t)
 {
-  struct target_ops *cur;
-
-  for (cur = current_top_target (); cur != NULL; cur = cur->beneath)
+  for (target_ops *cur = current_top_target ();
+       cur != NULL;
+       cur = cur->beneath ())
     if (cur == t)
       return 1;
 
@@ -1060,7 +1050,7 @@ raw_memory_xfer_partial (struct target_ops *ops, gdb_byte *readbuf,
       if (ops->has_all_memory ())
 	break;
 
-      ops = ops->beneath;
+      ops = ops->beneath ();
     }
   while (ops != NULL);
 
@@ -1968,14 +1958,13 @@ target_remove_breakpoint (struct gdbarch *gdbarch,
 static void
 info_target_command (const char *args, int from_tty)
 {
-  struct target_ops *t;
   int has_all_mem = 0;
 
   if (symfile_objfile != NULL)
     printf_unfiltered (_("Symbols from \"%s\".\n"),
 		       objfile_name (symfile_objfile));
 
-  for (t = current_top_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath ())
     {
       if (!t->has_memory ())
 	continue;
@@ -2405,9 +2394,7 @@ target_search_memory (CORE_ADDR start_addr, ULONGEST search_space_len,
 void
 target_require_runnable (void)
 {
-  struct target_ops *t;
-
-  for (t = current_top_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath ())
     {
       /* If this target knows how to create a new program, then
 	 assume we will still be able to after killing the current
@@ -2497,7 +2484,7 @@ struct target_ops *
 find_attach_target (void)
 {
   /* If a target on the current stack can attach, use it.  */
-  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath ())
     {
       if (t->can_attach ())
 	return t;
@@ -2513,7 +2500,7 @@ struct target_ops *
 find_run_target (void)
 {
   /* If a target on the current stack can run, use it.  */
-  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath ())
     {
       if (t->can_create_inferior ())
 	return t;
@@ -2543,7 +2530,7 @@ target_info_proc (const char *args, enum info_proc_what what)
   if (t == NULL)
     t = find_default_run_target (NULL);
 
-  for (; t != NULL; t = t->beneath)
+  for (; t != NULL; t = t->beneath ())
     {
       if (t->info_proc (args, what))
 	{
@@ -2633,6 +2620,14 @@ target_thread_address_space (ptid_t ptid)
   return aspace;
 }
 
+/* See target.h.  */
+
+target_ops *
+target_ops::beneath () const
+{
+  return m_beneath;
+}
+
 void
 target_ops::close ()
 {
@@ -2672,9 +2667,7 @@ target_ops::can_run ()
 int
 target_can_run ()
 {
-  struct target_ops *t;
-
-  for (t = current_top_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath ())
     {
       if (t->can_run ())
 	return 1;
@@ -2856,9 +2849,7 @@ target_fileio_open_1 (struct inferior *inf, const char *filename,
 		      int flags, int mode, int warn_if_slow,
 		      int *target_errno)
 {
-  struct target_ops *t;
-
-  for (t = default_fileio_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = default_fileio_target (); t != NULL; t = t->beneath ())
     {
       int fd = t->fileio_open (inf, filename, flags, mode,
 			       warn_if_slow, target_errno);
@@ -3014,9 +3005,7 @@ int
 target_fileio_unlink (struct inferior *inf, const char *filename,
 		      int *target_errno)
 {
-  struct target_ops *t;
-
-  for (t = default_fileio_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = default_fileio_target (); t != NULL; t = t->beneath ())
     {
       int ret = t->fileio_unlink (inf, filename, target_errno);
 
@@ -3042,9 +3031,7 @@ gdb::optional<std::string>
 target_fileio_readlink (struct inferior *inf, const char *filename,
 			int *target_errno)
 {
-  struct target_ops *t;
-
-  for (t = default_fileio_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = default_fileio_target (); t != NULL; t = t->beneath ())
     {
       gdb::optional<std::string> ret
 	= t->fileio_readlink (inf, filename, target_errno);
@@ -3231,7 +3218,7 @@ default_thread_architecture (struct target_ops *ops, ptid_t ptid)
 struct target_ops *
 find_target_beneath (struct target_ops *t)
 {
-  return t->beneath;
+  return t->beneath ();
 }
 
 /* See target.h.  */
@@ -3239,9 +3226,7 @@ find_target_beneath (struct target_ops *t)
 struct target_ops *
 find_target_at (enum strata stratum)
 {
-  struct target_ops *t;
-
-  for (t = current_top_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath ())
     if (t->to_stratum == stratum)
       return t;
 
@@ -3370,7 +3355,7 @@ dummy_target::info () const
 const target_info &
 debug_target::info () const
 {
-  return beneath->info ();
+  return beneath ()->info ();
 }
 
 \f
@@ -3906,11 +3891,9 @@ flash_erase_command (const char *cmd, int from_tty)
 static void
 maintenance_print_target_stack (const char *cmd, int from_tty)
 {
-  struct target_ops *t;
-
   printf_filtered (_("The current target stack is:\n"));
 
-  for (t = current_top_target (); t != NULL; t = t->beneath)
+  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath ())
     {
       if (t->to_stratum == debug_stratum)
 	continue;
diff --git a/gdb/target.h b/gdb/target.h
index fbd5c53f36..04047cea48 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -424,7 +424,9 @@ struct target_info
 
 struct target_ops
   {
-    struct target_ops *beneath;	/* To the target under this one.  */
+    /* To the target under this one.  */
+    target_ops *m_beneath;
+    target_ops *beneath () const;
 
     /* Free resources associated with the target.  Note that singleton
        targets, like e.g., native targets, are global objects, not
-- 
2.14.3

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

* [PATCH 3/4] Eliminate find_target_beneath
  2018-05-28 16:10 [PATCH 0/4] Change target stack representation Pedro Alves
  2018-05-28 16:10 ` [PATCH 1/4] target_stack -> current_top_target() throughout Pedro Alves
  2018-05-28 16:19 ` [PATCH 2/4] target_ops::beneath -> target_ops::beneath() Pedro Alves
@ 2018-05-28 17:39 ` Pedro Alves
  2018-05-28 17:47 ` [PATCH 4/4] Introduce class target_stack Pedro Alves
  3 siblings, 0 replies; 9+ messages in thread
From: Pedro Alves @ 2018-05-28 17:39 UTC (permalink / raw)
  To: gdb-patches

Call target_ops::beneath() throughout instead.

gdb/ChangeLog:
yyyy-mm-dd  Pedro Alves  <palves@redhat.com>

	* target.h (find_target_beneath): Delete declaration.
	* target.c (find_target_beneath): Delete definition.
	* aix-thread.c: All callers of find_target_beneath adjusted to
	call target_ops::beneath instead.
	* bsd-uthread.c: Likewise.
	* linux-thread-db.c: Likewise.
	* ravenscar-thread.c: Likewise.
	* sol-thread.c: Likewise.
	* spu-multiarch.c: Likewise.
---
 gdb/aix-thread.c       | 29 ++++++++++-------------------
 gdb/bsd-uthread.c      | 18 ++++++------------
 gdb/linux-thread-db.c  | 22 ++++++----------------
 gdb/ravenscar-thread.c | 39 +++++++++++++--------------------------
 gdb/sol-thread.c       | 32 ++++++++++----------------------
 gdb/spu-multiarch.c    | 33 ++++++++++++---------------------
 gdb/target.c           | 10 ----------
 gdb/target.h           |  2 --
 8 files changed, 57 insertions(+), 128 deletions(-)

diff --git a/gdb/aix-thread.c b/gdb/aix-thread.c
index d328bdd872..fce59480ca 100644
--- a/gdb/aix-thread.c
+++ b/gdb/aix-thread.c
@@ -1023,7 +1023,7 @@ aix_thread_inferior_created (struct target_ops *ops, int from_tty)
 void
 aix_thread_target::detach (inferior *inf, int from_tty)
 {
-  struct target_ops *beneath = find_target_beneath (this);
+  target_ops *beneath = this->beneath ();
 
   pd_disable ();
   beneath->detach (inf, from_tty);
@@ -1041,10 +1041,9 @@ aix_thread_target::resume (ptid_t ptid, int step, enum gdb_signal sig)
   if (!PD_TID (ptid))
     {
       scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
-      struct target_ops *beneath = find_target_beneath (this);
       
       inferior_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
-      beneath->resume (ptid, step, sig);
+      beneath ()->resume (ptid, step, sig);
     }
   else
     {
@@ -1078,15 +1077,13 @@ ptid_t
 aix_thread_target::wait (ptid_t ptid, struct target_waitstatus *status,
 			 int options)
 {
-  struct target_ops *beneath = find_target_beneath (this);
-
   {
     scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
 
     pid_to_prc (&ptid);
 
     inferior_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
-    ptid = beneath->wait (ptid, status, options);
+    ptid = beneath ()->wait (ptid, status, options);
   }
 
   if (ptid_get_pid (ptid) == -1)
@@ -1363,10 +1360,9 @@ aix_thread_target::fetch_registers (struct regcache *regcache, int regno)
 {
   struct thread_info *thread;
   pthdb_tid_t tid;
-  struct target_ops *beneath = find_target_beneath (this);
 
   if (!PD_TID (regcache_get_ptid (regcache)))
-    beneath->fetch_registers (regcache, regno);
+    beneath ()->fetch_registers (regcache, regno);
   else
     {
       thread = find_thread_ptid (regcache_get_ptid (regcache));
@@ -1717,10 +1713,9 @@ aix_thread_target::store_registers (struct regcache *regcache, int regno)
 {
   struct thread_info *thread;
   pthdb_tid_t tid;
-  struct target_ops *beneath = find_target_beneath (this);
 
   if (!PD_TID (regcache_get_ptid (regcache)))
-    beneath->store_registers (regcache, regno);
+    beneath ()->store_registers (regcache, regno);
   else
     {
       thread = find_thread_ptid (regcache_get_ptid (regcache));
@@ -1744,11 +1739,10 @@ aix_thread_target::xfer_partial (enum target_object object,
 				 ULONGEST *xfered_len)
 {
   scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
-  struct target_ops *beneath = find_target_beneath (this);
 
   inferior_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
-  return beneath->xfer_partial (object, annex, readbuf,
-				writebuf, offset, len, xfered_len);
+  return beneath ()->xfer_partial (object, annex, readbuf,
+				   writebuf, offset, len, xfered_len);
 }
 
 /* Clean up after the inferior exits.  */
@@ -1756,7 +1750,7 @@ aix_thread_target::xfer_partial (enum target_object object,
 void
 aix_thread_target::mourn_inferior ()
 {
-  struct target_ops *beneath = find_target_beneath (this);
+  target_ops *beneath = beneath ();
 
   pd_deactivate ();
   beneath->mourn_inferior ();
@@ -1767,10 +1761,8 @@ aix_thread_target::mourn_inferior ()
 bool
 aix_thread_target::thread_alive (ptid_t ptid)
 {
-  struct target_ops *beneath = find_target_beneath (this);
-
   if (!PD_TID (ptid))
-    return beneath->thread_alive (ptid);
+    return beneath ()->thread_alive (ptid);
 
   /* We update the thread list every time the child stops, so all
      valid threads should be in the thread list.  */
@@ -1784,10 +1776,9 @@ const char *
 aix_thread_target::pid_to_str (ptid_t ptid)
 {
   static char *ret = NULL;
-  struct target_ops *beneath = find_target_beneath (this);
 
   if (!PD_TID (ptid))
-    return beneath->pid_to_str (ptid);
+    return beneath ()->pid_to_str (ptid);
 
   /* Free previous return value; a new one will be allocated by
      xstrprintf().  */
diff --git a/gdb/bsd-uthread.c b/gdb/bsd-uthread.c
index 1505cfede7..6aa052bab0 100644
--- a/gdb/bsd-uthread.c
+++ b/gdb/bsd-uthread.c
@@ -310,8 +310,7 @@ bsd_uthread_solib_unloaded (struct so_list *so)
 void
 bsd_uthread_target::mourn_inferior ()
 {
-  struct target_ops *beneath = find_target_beneath (this);
-  beneath->mourn_inferior ();
+  beneath ()->mourn_inferior ();
   bsd_uthread_deactivate ();
 }
 
@@ -323,7 +322,6 @@ bsd_uthread_target::fetch_registers (struct regcache *regcache, int regnum)
     = (struct bsd_uthread_ops *) gdbarch_data (gdbarch, bsd_uthread_data);
   ptid_t ptid = regcache_get_ptid (regcache);
   CORE_ADDR addr = ptid_get_tid (ptid);
-  struct target_ops *beneath = find_target_beneath (this);
   CORE_ADDR active_addr;
   scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
 
@@ -332,7 +330,7 @@ bsd_uthread_target::fetch_registers (struct regcache *regcache, int regnum)
   inferior_ptid = ptid;
 
   /* Always fetch the appropriate registers from the layer beneath.  */
-  beneath->fetch_registers (regcache, regnum);
+  beneath ()->fetch_registers (regcache, regnum);
 
   /* FIXME: That might have gotten us more than we asked for.  Make
      sure we overwrite all relevant registers with values from the
@@ -354,7 +352,6 @@ bsd_uthread_target::store_registers (struct regcache *regcache, int regnum)
   struct gdbarch *gdbarch = regcache->arch ();
   struct bsd_uthread_ops *uthread_ops
     = (struct bsd_uthread_ops *) gdbarch_data (gdbarch, bsd_uthread_data);
-  struct target_ops *beneath = find_target_beneath (this);
   ptid_t ptid = regcache_get_ptid (regcache);
   CORE_ADDR addr = ptid_get_tid (ptid);
   CORE_ADDR active_addr;
@@ -375,7 +372,7 @@ bsd_uthread_target::store_registers (struct regcache *regcache, int regnum)
     {
       /* Updating the thread that is currently running; pass the
          request to the layer beneath.  */
-      beneath->store_registers (regcache, regnum);
+      beneath ()->store_registers (regcache, regnum);
     }
 }
 
@@ -385,10 +382,9 @@ bsd_uthread_target::wait (ptid_t ptid, struct target_waitstatus *status,
 {
   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
   CORE_ADDR addr;
-  struct target_ops *beneath = find_target_beneath (this);
 
   /* Pass the request to the layer beneath.  */
-  ptid = beneath->wait (ptid, status, options);
+  ptid = beneath ()->wait (ptid, status, options);
 
   /* If the process is no longer alive, there's no point in figuring
      out the thread ID.  It will fail anyway.  */
@@ -433,15 +429,13 @@ void
 bsd_uthread_target::resume (ptid_t ptid, int step, enum gdb_signal sig)
 {
   /* Pass the request to the layer beneath.  */
-  struct target_ops *beneath = find_target_beneath (this);
-  beneath->resume (ptid, step, sig);
+  beneath ()->resume (ptid, step, sig);
 }
 
 bool
 bsd_uthread_target::thread_alive (ptid_t ptid)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
-  struct target_ops *beneath = find_target_beneath (this);
   CORE_ADDR addr = ptid_get_tid (ptid);
 
   if (addr != 0)
@@ -456,7 +450,7 @@ bsd_uthread_target::thread_alive (ptid_t ptid)
 	return false;
     }
 
-  return beneath->thread_alive (ptid);
+  return beneath ()->thread_alive (ptid);
 }
 
 void
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
index 920e15edf4..ccfd9e4e92 100644
--- a/gdb/linux-thread-db.c
+++ b/gdb/linux-thread-db.c
@@ -1094,11 +1094,9 @@ record_thread (struct thread_db_info *info,
 void
 thread_db_target::detach (inferior *inf, int from_tty)
 {
-  struct target_ops *target_beneath = find_target_beneath (this);
-
   delete_thread_db_info (inf->pid);
 
-  target_beneath->detach (inf, from_tty);
+  beneath ()->detach (inf, from_tty);
 
   /* NOTE: From this point on, inferior_ptid is null_ptid.  */
 
@@ -1113,9 +1111,8 @@ thread_db_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
 			int options)
 {
   struct thread_db_info *info;
-  struct target_ops *beneath = find_target_beneath (this);
 
-  ptid = beneath->wait (ptid, ourstatus, options);
+  ptid = beneath ()->wait (ptid, ourstatus, options);
 
   switch (ourstatus->kind)
     {
@@ -1152,11 +1149,9 @@ thread_db_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
 void
 thread_db_target::mourn_inferior ()
 {
-  struct target_ops *target_beneath = find_target_beneath (this);
-
   delete_thread_db_info (ptid_get_pid (inferior_ptid));
 
-  target_beneath->mourn_inferior ();
+  beneath ()->mourn_inferior ();
 
   /* Detach thread_db target ops.  */
   if (!thread_db_list)
@@ -1376,7 +1371,6 @@ const char *
 thread_db_target::pid_to_str (ptid_t ptid)
 {
   struct thread_info *thread_info = find_thread_ptid (ptid);
-  struct target_ops *beneath;
 
   if (thread_info != NULL && thread_info->priv != NULL)
     {
@@ -1389,8 +1383,7 @@ thread_db_target::pid_to_str (ptid_t ptid)
       return buf;
     }
 
-  beneath = find_target_beneath (this);
-  return beneath->pid_to_str (ptid);
+  return beneath ()->pid_to_str (ptid);
 }
 
 /* Return a string describing the state of the thread specified by
@@ -1451,7 +1444,6 @@ thread_db_target::get_thread_local_address (ptid_t ptid,
 					    CORE_ADDR offset)
 {
   struct thread_info *thread_info;
-  struct target_ops *beneath;
 
   /* Find the matching thread.  */
   thread_info = find_thread_ptid (ptid);
@@ -1523,8 +1515,7 @@ thread_db_target::get_thread_local_address (ptid_t ptid,
 	      : (CORE_ADDR) (uintptr_t) address);
     }
 
-  beneath = find_target_beneath (this);
-  return beneath->get_thread_local_address (ptid, lm, offset);
+  return beneath ()->get_thread_local_address (ptid, lm, offset);
 }
 
 /* Implement the to_get_ada_task_ptid target method for this target.  */
@@ -1539,7 +1530,6 @@ thread_db_target::get_ada_task_ptid (long lwp, long thread)
 void
 thread_db_target::resume (ptid_t ptid, int step, enum gdb_signal signo)
 {
-  struct target_ops *beneath = find_target_beneath (this);
   struct thread_db_info *info;
 
   if (ptid_equal (ptid, minus_one_ptid))
@@ -1553,7 +1543,7 @@ thread_db_target::resume (ptid_t ptid, int step, enum gdb_signal signo)
   if (info)
     info->need_stale_parent_threads_check = 0;
 
-  beneath->resume (ptid, step, signo);
+  beneath ()->resume (ptid, step, signo);
 }
 
 /* std::sort helper function for info_auto_load_libthread_db, sort the
diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c
index 5f3e179dec..a1fbbe1dff 100644
--- a/gdb/ravenscar-thread.c
+++ b/gdb/ravenscar-thread.c
@@ -323,10 +323,8 @@ get_running_thread_id (int cpu)
 void
 ravenscar_thread_target::resume (ptid_t ptid, int step, enum gdb_signal siggnal)
 {
-  struct target_ops *beneath = find_target_beneath (this);
-
   inferior_ptid = base_ptid;
-  beneath->resume (base_ptid, step, siggnal);
+  beneath ()->resume (base_ptid, step, siggnal);
 }
 
 ptid_t
@@ -334,11 +332,10 @@ ravenscar_thread_target::wait (ptid_t ptid,
 			       struct target_waitstatus *status,
 			       int options)
 {
-  struct target_ops *beneath = find_target_beneath (this);
   ptid_t event_ptid;
 
   inferior_ptid = base_ptid;
-  event_ptid = beneath->wait (base_ptid, status, 0);
+  event_ptid = beneath ()->wait (base_ptid, status, 0);
   /* Find any new threads that might have been created, and update
      inferior_ptid to the active thread.
 
@@ -415,7 +412,6 @@ ravenscar_thread_target::pid_to_str (ptid_t ptid)
 void
 ravenscar_thread_target::fetch_registers (struct regcache *regcache, int regnum)
 {
-  struct target_ops *beneath = find_target_beneath (this);
   ptid_t ptid = regcache_get_ptid (regcache);
 
   if (ravenscar_runtime_initialized ()
@@ -429,14 +425,13 @@ ravenscar_thread_target::fetch_registers (struct regcache *regcache, int regnum)
       arch_ops->to_fetch_registers (regcache, regnum);
     }
   else
-    beneath->fetch_registers (regcache, regnum);
+    beneath ()->fetch_registers (regcache, regnum);
 }
 
 void
 ravenscar_thread_target::store_registers (struct regcache *regcache,
 					  int regnum)
 {
-  target_ops *beneath = find_target_beneath (this);
   ptid_t ptid = regcache_get_ptid (regcache);
 
   if (ravenscar_runtime_initialized ()
@@ -447,16 +442,15 @@ ravenscar_thread_target::store_registers (struct regcache *regcache,
       struct ravenscar_arch_ops *arch_ops
 	= gdbarch_ravenscar_ops (gdbarch);
 
-      beneath->store_registers (regcache, regnum);
+      beneath ()->store_registers (regcache, regnum);
     }
   else
-    beneath->store_registers (regcache, regnum);
+    beneath ()->store_registers (regcache, regnum);
 }
 
 void
 ravenscar_thread_target::prepare_to_store (struct regcache *regcache)
 {
-  target_ops *beneath = find_target_beneath (this);
   ptid_t ptid = regcache_get_ptid (regcache);
 
   if (ravenscar_runtime_initialized ()
@@ -467,10 +461,10 @@ ravenscar_thread_target::prepare_to_store (struct regcache *regcache)
       struct ravenscar_arch_ops *arch_ops
 	= gdbarch_ravenscar_ops (gdbarch);
 
-      beneath->prepare_to_store (regcache);
+      beneath ()->prepare_to_store (regcache);
     }
   else
-    beneath->prepare_to_store (regcache);
+    beneath ()->prepare_to_store (regcache);
 }
 
 /* Implement the to_stopped_by_sw_breakpoint target_ops "method".  */
@@ -479,11 +473,10 @@ bool
 ravenscar_thread_target::stopped_by_sw_breakpoint ()
 {
   ptid_t saved_ptid = inferior_ptid;
-  struct target_ops *beneath = find_target_beneath (this);
   bool result;
 
   inferior_ptid = get_base_thread_from_ravenscar_task (saved_ptid);
-  result = beneath->stopped_by_sw_breakpoint ();
+  result = beneath ()->stopped_by_sw_breakpoint ();
   inferior_ptid = saved_ptid;
   return result;
 }
@@ -494,11 +487,10 @@ bool
 ravenscar_thread_target::stopped_by_hw_breakpoint ()
 {
   ptid_t saved_ptid = inferior_ptid;
-  struct target_ops *beneath = find_target_beneath (this);
   bool result;
 
   inferior_ptid = get_base_thread_from_ravenscar_task (saved_ptid);
-  result = beneath->stopped_by_hw_breakpoint ();
+  result = beneath ()->stopped_by_hw_breakpoint ();
   inferior_ptid = saved_ptid;
   return result;
 }
@@ -509,11 +501,10 @@ bool
 ravenscar_thread_target::stopped_by_watchpoint ()
 {
   ptid_t saved_ptid = inferior_ptid;
-  struct target_ops *beneath = find_target_beneath (this);
   bool result;
 
   inferior_ptid = get_base_thread_from_ravenscar_task (saved_ptid);
-  result = beneath->stopped_by_watchpoint ();
+  result = beneath ()->stopped_by_watchpoint ();
   inferior_ptid = saved_ptid;
   return result;
 }
@@ -524,11 +515,10 @@ bool
 ravenscar_thread_target::stopped_data_address (CORE_ADDR *addr_p)
 {
   ptid_t saved_ptid = inferior_ptid;
-  struct target_ops *beneath = find_target_beneath (this);
   bool result;
 
   inferior_ptid = get_base_thread_from_ravenscar_task (saved_ptid);
-  result = beneath->stopped_data_address (addr_p);
+  result = beneath ()->stopped_data_address (addr_p);
   inferior_ptid = saved_ptid;
   return result;
 }
@@ -536,10 +526,8 @@ ravenscar_thread_target::stopped_data_address (CORE_ADDR *addr_p)
 void
 ravenscar_thread_target::mourn_inferior ()
 {
-  struct target_ops *beneath = find_target_beneath (this);
-
   base_ptid = null_ptid;
-  beneath->mourn_inferior ();
+  beneath ()->mourn_inferior ();
   unpush_target (&ravenscar_ops);
 }
 
@@ -549,11 +537,10 @@ int
 ravenscar_thread_target::core_of_thread (ptid_t ptid)
 {
   ptid_t saved_ptid = inferior_ptid;
-  struct target_ops *beneath = find_target_beneath (this);
   int result;
 
   inferior_ptid = get_base_thread_from_ravenscar_task (saved_ptid);
-  result = beneath->core_of_thread (inferior_ptid);
+  result = beneath ()->core_of_thread (inferior_ptid);
   inferior_ptid = saved_ptid;
   return result;
 }
diff --git a/gdb/sol-thread.c b/gdb/sol-thread.c
index 22dd8d6eaa..a54c86211f 100644
--- a/gdb/sol-thread.c
+++ b/gdb/sol-thread.c
@@ -384,7 +384,7 @@ lwp_to_thread (ptid_t lwp)
 void
 sol_thread_target::detach (inferior *inf, int from_tty)
 {
-  struct target_ops *beneath = find_target_beneath (this);
+  target_ops *beneath = this->beneath ();
 
   sol_thread_active = 0;
   inferior_ptid = pid_to_ptid (ptid_get_pid (main_ph.ptid));
@@ -400,8 +400,6 @@ sol_thread_target::detach (inferior *inf, int from_tty)
 void
 sol_thread_target::resume (ptid_t ptid, int step, enum gdb_signal signo)
 {
-  struct target_ops *beneath = find_target_beneath (this);
-
   scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
 
   inferior_ptid = thread_to_lwp (inferior_ptid, ptid_get_pid (main_ph.ptid));
@@ -420,7 +418,7 @@ sol_thread_target::resume (ptid_t ptid, int step, enum gdb_signal signo)
 		 ptid_get_tid (save_ptid));
     }
 
-  beneath->resume (ptid, step, signo);
+  beneath ()->resume (ptid, step, signo);
 }
 
 /* Wait for any threads to stop.  We may have to convert PTID from a
@@ -432,7 +430,6 @@ sol_thread_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
 {
   ptid_t rtnval;
   ptid_t save_ptid;
-  struct target_ops *beneath = find_target_beneath (this);
 
   save_ptid = inferior_ptid;
   scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
@@ -453,7 +450,7 @@ sol_thread_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
 		 ptid_get_tid (save_ptid));
     }
 
-  rtnval = beneath->wait (ptid, ourstatus, options);
+  rtnval = beneath ()->wait (ptid, ourstatus, options);
 
   if (ourstatus->kind != TARGET_WAITKIND_EXITED)
     {
@@ -487,13 +484,12 @@ sol_thread_target::fetch_registers (struct regcache *regcache, int regnum)
   prfpregset_t fpregset;
   gdb_gregset_t *gregset_p = &gregset;
   gdb_fpregset_t *fpregset_p = &fpregset;
-  struct target_ops *beneath = find_target_beneath (this);
   ptid_t ptid = regcache_get_ptid (regcache);
 
   if (!ptid_tid_p (ptid))
     {
       /* It's an LWP; pass the request on to the layer beneath.  */
-      beneath->fetch_registers (regcache, regnum);
+      beneath ()->fetch_registers (regcache, regnum);
       return;
     }
 
@@ -544,10 +540,8 @@ sol_thread_target::store_registers (struct regcache *regcache, int regnum)
 
   if (!ptid_tid_p (ptid))
     {
-      struct target_ops *beneath = find_target_beneath (this);
-
       /* It's an LWP; pass the request on to the layer beneath.  */
-      beneath->store_registers (regcache, regnum);
+      beneath ()->store_registers (regcache, regnum);
       return;
     }
 
@@ -595,8 +589,6 @@ sol_thread_target::xfer_partial (enum target_object object,
 				 ULONGEST offset, ULONGEST len,
 				 ULONGEST *xfered_len)
 {
-  struct target_ops *beneath = find_target_beneath (this);
-
   scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
 
   if (ptid_tid_p (inferior_ptid) || !target_thread_alive (inferior_ptid))
@@ -609,8 +601,8 @@ sol_thread_target::xfer_partial (enum target_object object,
       inferior_ptid = procfs_first_available ();
     }
 
-  return beneath->xfer_partial (object, annex, readbuf,
-				writebuf, offset, len, xfered_len);
+  return beneath ()->xfer_partial (object, annex, readbuf,
+				   writebuf, offset, len, xfered_len);
 }
 
 static void
@@ -691,7 +683,7 @@ sol_thread_new_objfile (struct objfile *objfile)
 void
 sol_thread_target::mourn_inferior ()
 {
-  struct target_ops *beneath = find_target_beneath (this);
+  target_ops *beneath = this->beneath ();
 
   sol_thread_active = 0;
 
@@ -721,10 +713,8 @@ sol_thread_target::thread_alive (ptid_t ptid)
     }
   else
     {
-      struct target_ops *beneath = find_target_beneath (this);
-
       /* It's an LPW; pass the request on to the layer below.  */
-      return beneath->thread_alive (ptid);
+      return beneath ()->thread_alive (ptid);
     }
 }
 
@@ -1062,13 +1052,11 @@ sol_update_thread_list_callback (const td_thrhandle_t *th, void *ignored)
 void
 sol_thread_target::update_thread_list ()
 {
-  struct target_ops *beneath = find_target_beneath (this);
-
   /* Delete dead threads.  */
   prune_threads ();
 
   /* Find any new LWP's.  */
-  beneath->update_thread_list ();
+  beneath ()->update_thread_list ();
 
   /* Then find any new user-level threads.  */
   p_td_ta_thr_iter (main_ta, sol_update_thread_list_callback, (void *) 0,
diff --git a/gdb/spu-multiarch.c b/gdb/spu-multiarch.c
index 5da5e4e7fc..bb6c6386d9 100644
--- a/gdb/spu-multiarch.c
+++ b/gdb/spu-multiarch.c
@@ -157,8 +157,7 @@ spu_multiarch_target::thread_architecture (ptid_t ptid)
   if (parse_spufs_run (ptid, &spufs_fd, &spufs_addr))
     return spu_gdbarch (spufs_fd);
 
-  target_ops *beneath = find_target_beneath (this);
-  return beneath->thread_architecture (ptid);
+  return beneath ()->thread_architecture (ptid);
 }
 
 /* Override the to_region_ok_for_hw_watchpoint routine.  */
@@ -166,13 +165,11 @@ spu_multiarch_target::thread_architecture (ptid_t ptid)
 int
 spu_multiarch_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
 {
-  struct target_ops *ops_beneath = find_target_beneath (this);
-
   /* We cannot watch SPU local store.  */
   if (SPUADDR_SPU (addr) != -1)
     return 0;
 
-  return ops_beneath->region_ok_for_hw_watchpoint (addr, len);
+  return beneath ()->region_ok_for_hw_watchpoint (addr, len);
 }
 
 /* Override the to_fetch_registers routine.  */
@@ -182,7 +179,6 @@ spu_multiarch_target::fetch_registers (struct regcache *regcache, int regno)
 {
   struct gdbarch *gdbarch = regcache->arch ();
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  struct target_ops *ops_beneath = find_target_beneath (this);
   int spufs_fd;
   CORE_ADDR spufs_addr;
 
@@ -194,7 +190,7 @@ spu_multiarch_target::fetch_registers (struct regcache *regcache, int regno)
   /* This version applies only if we're currently in spu_run.  */
   if (gdbarch_bfd_arch_info (gdbarch)->arch != bfd_arch_spu)
     {
-      ops_beneath->fetch_registers (regcache, regno);
+      beneath ()->fetch_registers (regcache, regno);
       return;
     }
 
@@ -215,7 +211,7 @@ spu_multiarch_target::fetch_registers (struct regcache *regcache, int regno)
     {
       gdb_byte buf[4];
 
-      if (target_read (ops_beneath, TARGET_OBJECT_MEMORY, NULL,
+      if (target_read (beneath (), TARGET_OBJECT_MEMORY, NULL,
 		       buf, spufs_addr, sizeof buf) == sizeof buf)
 	regcache_raw_supply (regcache, SPU_PC_REGNUM, buf);
     }
@@ -228,7 +224,7 @@ spu_multiarch_target::fetch_registers (struct regcache *regcache, int regno)
       int i;
 
       xsnprintf (annex, sizeof annex, "%d/regs", spufs_fd);
-      if (target_read (ops_beneath, TARGET_OBJECT_SPU, annex,
+      if (target_read (beneath (), TARGET_OBJECT_SPU, annex,
 		       buf, 0, sizeof buf) == sizeof buf)
 	for (i = 0; i < SPU_NUM_GPRS; i++)
 	  regcache_raw_supply (regcache, i, buf + i*16);
@@ -241,7 +237,6 @@ void
 spu_multiarch_target::store_registers (struct regcache *regcache, int regno)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct target_ops *ops_beneath = find_target_beneath (this);
   int spufs_fd;
   CORE_ADDR spufs_addr;
 
@@ -253,7 +248,7 @@ spu_multiarch_target::store_registers (struct regcache *regcache, int regno)
   /* This version applies only if we're currently in spu_run.  */
   if (gdbarch_bfd_arch_info (gdbarch)->arch != bfd_arch_spu)
     {
-      ops_beneath->store_registers (regcache, regno);
+      beneath ()->store_registers (regcache, regno);
       return;
     }
 
@@ -267,7 +262,7 @@ spu_multiarch_target::store_registers (struct regcache *regcache, int regno)
       gdb_byte buf[4];
       regcache_raw_collect (regcache, SPU_PC_REGNUM, buf);
 
-      target_write (ops_beneath, TARGET_OBJECT_MEMORY, NULL,
+      target_write (beneath (), TARGET_OBJECT_MEMORY, NULL,
 		    buf, spufs_addr, sizeof buf);
     }
 
@@ -282,7 +277,7 @@ spu_multiarch_target::store_registers (struct regcache *regcache, int regno)
 	regcache_raw_collect (regcache, i, buf + i*16);
 
       xsnprintf (annex, sizeof annex, "%d/regs", spufs_fd);
-      target_write (ops_beneath, TARGET_OBJECT_SPU, annex,
+      target_write (beneath (), TARGET_OBJECT_SPU, annex,
 		    buf, 0, sizeof buf);
     }
 }
@@ -295,7 +290,7 @@ spu_multiarch_target::xfer_partial (enum target_object object,
 				    const gdb_byte *writebuf, ULONGEST offset, ULONGEST len,
 				    ULONGEST *xfered_len)
 {
-  struct target_ops *ops_beneath = find_target_beneath (this);
+  struct target_ops *ops_beneath = this->beneath ();
 
   /* Use the "mem" spufs file to access SPU local store.  */
   if (object == TARGET_OBJECT_MEMORY)
@@ -345,15 +340,13 @@ spu_multiarch_target::search_memory (CORE_ADDR start_addr, ULONGEST search_space
 				     const gdb_byte *pattern, ULONGEST pattern_len,
 				     CORE_ADDR *found_addrp)
 {
-  struct target_ops *ops_beneath = find_target_beneath (this);
-
   /* For SPU local store, always fall back to the simple method.  */
   if (SPUADDR_SPU (start_addr) >= 0)
     return simple_search_memory (this, start_addr, search_space_len,
 				 pattern, pattern_len, found_addrp);
 
-  return ops_beneath->search_memory (start_addr, search_space_len,
-				     pattern, pattern_len, found_addrp);
+  return beneath ()->search_memory (start_addr, search_space_len,
+				    pattern, pattern_len, found_addrp);
 }
 
 
@@ -410,9 +403,7 @@ spu_multiarch_solib_unloaded (struct so_list *so)
 void
 spu_multiarch_target::mourn_inferior ()
 {
-  struct target_ops *ops_beneath = find_target_beneath (this);
-
-  ops_beneath->mourn_inferior ();
+  beneath ()->mourn_inferior ();
   spu_multiarch_deactivate ();
 }
 
diff --git a/gdb/target.c b/gdb/target.c
index c8fa8e1217..cc4f81ec98 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -3211,16 +3211,6 @@ default_thread_architecture (struct target_ops *ops, ptid_t ptid)
   return inf->gdbarch;
 }
 
-/*
- * Find the next target down the stack from the specified target.
- */
-
-struct target_ops *
-find_target_beneath (struct target_ops *t)
-{
-  return t->beneath ();
-}
-
 /* See target.h.  */
 
 struct target_ops *
diff --git a/gdb/target.h b/gdb/target.h
index 04047cea48..9dd29a641d 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -2377,8 +2377,6 @@ extern void noprocess (void) ATTRIBUTE_NORETURN;
 
 extern void target_require_runnable (void);
 
-extern struct target_ops *find_target_beneath (struct target_ops *);
-
 /* Find the target at STRATUM.  If no target is at that stratum,
    return NULL.  */
 
-- 
2.14.3

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

* [PATCH 4/4] Introduce class target_stack
  2018-05-28 16:10 [PATCH 0/4] Change target stack representation Pedro Alves
                   ` (2 preceding siblings ...)
  2018-05-28 17:39 ` [PATCH 3/4] Eliminate find_target_beneath Pedro Alves
@ 2018-05-28 17:47 ` Pedro Alves
  2018-05-29 11:34   ` Tom Tromey
  3 siblings, 1 reply; 9+ messages in thread
From: Pedro Alves @ 2018-05-28 17:47 UTC (permalink / raw)
  To: gdb-patches

Currently, the target stack is represented by a singly linked list,
with target_ops having a pointer to the target beneath.  This poses a
problem for multi-process / multi-target debugging.  In that case, we
will naturally want multiple instances of target stacks.  E.g., one
stack for inferior 1 which is debugging a core file, and another
target stack for inferior 2 which is debugging a remote process.  The
problem then is in finding a target's "beneath" target, if we consider
that for some target_ops types, we'll be sharing a single target_ops
instance between several inferiors.  For example, so far, I found no
need to have multiple instances of the spu_multiarch_target /
exec_target / dummy_target targets.

Thus this patch, which changes the target stack representation to an
array of pointers.  For now, there's still a single global instance of
this new target_stack class, though further down in the multi-target
work, each inferior will have its own instance.

gdb/ChangeLog:
yyyy-mm-dd  Pedro Alves  <palves@redhat.com>

	* target.h (target_ops) <beneath>: Now a method.  All references
	updated.
	(class target_stack): New.
	* target.c (g_target_stack): New.
	(g_current_top_target): Delete.
	(current_top_target): Get the top target out of g_target_stack.
	(target_stack::push, target_stack::unpush): New.
	(push_target, unpush_target): Reimplement.
	(target_is_pushed): Reimplement in terms of g_target_stack.
	(target_ops::beneath, target_stack::find_beneath): New.
---
 gdb/target.c | 116 +++++++++++++++++++++++++++++------------------------------
 gdb/target.h |  47 ++++++++++++++++++++++--
 2 files changed, 103 insertions(+), 60 deletions(-)

diff --git a/gdb/target.c b/gdb/target.c
index cc4f81ec98..17e7e3821a 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -119,16 +119,17 @@ static std::unordered_map<const target_info *, target_open_ftype *>
 static struct target_ops *the_dummy_target;
 static struct target_ops *the_debug_target;
 
+/* The target stack.  */
+static target_stack g_target_stack;
+
 /* Top of target stack.  */
 /* The target structure we are currently using to talk to a process
    or file or whatever "inferior" we have.  */
 
-static target_ops *g_current_top_target;
-
 target_ops *
 current_top_target ()
 {
-  return g_current_top_target;
+  return g_target_stack.top ();
 }
 
 /* Command list for target.  */
@@ -631,49 +632,46 @@ default_execution_direction (struct target_ops *self)
 to_execution_direction must be implemented for reverse async");
 }
 
-/* Push a new target type into the stack of the existing target accessors,
-   possibly superseding some of the existing accessors.
-
-   Rather than allow an empty stack, we always have the dummy target at
-   the bottom stratum, so we can call the function vectors without
-   checking them.  */
+/* See target.h.  */
 
 void
-push_target (struct target_ops *t)
+target_stack::push (target_ops *t)
 {
-  struct target_ops **cur;
-
-  /* Find the proper stratum to install this target in.  */
-  for (cur = &g_current_top_target; (*cur) != NULL; cur = &(*cur)->m_beneath)
+  /* If there's already a target at this stratum, remove it.  */
+  if (m_stack[t->to_stratum] != NULL)
     {
-      if ((int) (t->to_stratum) >= (int) (*cur)->to_stratum)
-	break;
+      target_ops *prev = m_stack[t->to_stratum];
+      m_stack[t->to_stratum] = NULL;
+      target_close (prev);
     }
 
-  /* If there's already targets at this stratum, remove them.  */
-  /* FIXME: cagney/2003-10-15: I think this should be popping all
-     targets to CUR, and not just those at this stratum level.  */
-  while ((*cur) != NULL && t->to_stratum == (*cur)->to_stratum)
-    {
-      /* There's already something at this stratum level.  Close it,
-         and un-hook it from the stack.  */
-      struct target_ops *tmp = (*cur);
+  /* Now add the new one.  */
+  m_stack[t->to_stratum] = t;
 
-      (*cur) = (*cur)->m_beneath;
-      tmp->m_beneath = NULL;
-      target_close (tmp);
-    }
+  if (m_top < t->to_stratum)
+    m_top = t->to_stratum;
+}
 
-  /* We have removed all targets in our stratum, now add the new one.  */
-  t->m_beneath = (*cur);
-  (*cur) = t;
+/* See target.h.  */
+
+void
+push_target (struct target_ops *t)
+{
+  g_target_stack.push (t);
 }
 
-/* Remove a target_ops vector from the stack, wherever it may be.
-   Return how many times it was removed (0 or 1).  */
+/* See target.h.  */
 
 int
 unpush_target (struct target_ops *t)
+{
+  return g_target_stack.unpush (t);
+}
+
+/* See target.h.  */
+
+bool
+target_stack::unpush (target_ops *t)
 {
   struct target_ops **cur;
   struct target_ops *tmp;
@@ -682,31 +680,30 @@ unpush_target (struct target_ops *t)
     internal_error (__FILE__, __LINE__,
 		    _("Attempt to unpush the dummy target"));
 
+  gdb_assert (t != NULL);
+
   /* Look for the specified target.  Note that we assume that a target
      can only occur once in the target stack.  */
 
-  for (cur = &g_current_top_target; (*cur) != NULL; cur = &(*cur)->m_beneath)
+  if (m_stack[t->to_stratum] != t)
     {
-      if ((*cur) == t)
-	break;
+      /* If we don't find target_ops, quit.  Only open targets should be
+	 closed.  */
+      return false;
     }
 
-  /* If we don't find target_ops, quit.  Only open targets should be
-     closed.  */
-  if ((*cur) == NULL)
-    return 0;			
-
   /* Unchain the target.  */
-  tmp = (*cur);
-  (*cur) = (*cur)->m_beneath;
-  tmp->m_beneath = NULL;
+  m_stack[t->to_stratum] = NULL;
+
+  if (m_top == t->to_stratum)
+    m_top = t->beneath ()->to_stratum;
 
   /* Finally close the target.  Note we do this after unchaining, so
      any target method calls from within the target_close
      implementation don't end up in T anymore.  */
   target_close (t);
 
-  return 1;
+  return true;
 }
 
 /* Unpush TARGET and assert that it worked.  */
@@ -751,13 +748,7 @@ pop_all_targets (void)
 int
 target_is_pushed (struct target_ops *t)
 {
-  for (target_ops *cur = current_top_target ();
-       cur != NULL;
-       cur = cur->beneath ())
-    if (cur == t)
-      return 1;
-
-  return 0;
+  return g_target_stack.is_pushed (t);
 }
 
 /* Default implementation of to_get_thread_local_address.  */
@@ -2625,7 +2616,7 @@ target_thread_address_space (ptid_t ptid)
 target_ops *
 target_ops::beneath () const
 {
-  return m_beneath;
+  return g_target_stack.find_beneath (this);
 }
 
 void
@@ -3213,16 +3204,25 @@ default_thread_architecture (struct target_ops *ops, ptid_t ptid)
 
 /* See target.h.  */
 
-struct target_ops *
-find_target_at (enum strata stratum)
+target_ops *
+target_stack::find_beneath (const target_ops *t) const
 {
-  for (target_ops *t = current_top_target (); t != NULL; t = t->beneath ())
-    if (t->to_stratum == stratum)
-      return t;
+  /* Look for a non-empty slot at stratum levels beneath T's.  */
+  for (int stratum = t->to_stratum - 1; stratum >= 0; --stratum)
+    if (m_stack[stratum] != NULL)
+      return m_stack[stratum];
 
   return NULL;
 }
 
+/* See target.h.  */
+
+struct target_ops *
+find_target_at (enum strata stratum)
+{
+  return g_target_stack.at (stratum);
+}
+
 \f
 
 /* See target.h  */
diff --git a/gdb/target.h b/gdb/target.h
index 9dd29a641d..d1dd98912a 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -61,7 +61,11 @@ struct inferior;
    of variables any more (the file target is handling them and they
    never get to the process target).  So when you push a file target,
    it goes into the file stratum, which is always below the process
-   stratum.  */
+   stratum.
+
+   Note that rather than allow an empty stack, we always have the
+   dummy target at the bottom stratum, so we can call the function
+   vectors without checking them.  */
 
 #include "target/target.h"
 #include "target/resume.h"
@@ -425,7 +429,6 @@ struct target_info
 struct target_ops
   {
     /* To the target under this one.  */
-    target_ops *m_beneath;
     target_ops *beneath () const;
 
     /* Free resources associated with the target.  Note that singleton
@@ -1268,6 +1271,46 @@ extern void set_native_target (target_ops *target);
    NULL.  */
 extern target_ops *get_native_target ();
 
+/* Type that manages a target stack.  See description of target stacks
+   and strata at the top of the file.  */
+
+class target_stack
+{
+public:
+  target_stack () = default;
+  DISABLE_COPY_AND_ASSIGN (target_stack);
+
+  /* Push a new target into the stack of the existing target
+     accessors, possibly superseding some existing accessor.  */
+  void push (target_ops *t);
+
+  /* Remove a target from the stack, wherever it may be.  Return true
+     if it was removed, false otherwise.  */
+  bool unpush (target_ops *t);
+
+  /* Returns true if T is pushed on the target stack.  */
+  bool is_pushed (target_ops *t) const
+  { return at (t->to_stratum) == t; }
+
+  /* Return the target at STRATUM.  */
+  target_ops *at (strata stratum) const { return m_stack[stratum]; }
+
+  /* Return the target at the top of the stack.  */
+  target_ops *top () const { return at (m_top); }
+
+  /* Find the next target down the stack from the specified target.  */
+  target_ops *find_beneath (const target_ops *t) const;
+
+private:
+  /* The stratum of the top target target.  */
+  enum strata m_top {};
+
+  /* The stack, represented as an array, with one slot per stratum.
+     If no target is pushed at some stratum, the corresponding slot is
+     null.  */
+  target_ops *m_stack[(int) debug_stratum + 1] {};
+};
+
 /* The ops structure for our "current" target process.  This should
    never be NULL.  If there is no target, it points to the dummy_target.  */
 
-- 
2.14.3

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

* Re: [PATCH 1/4] target_stack -> current_top_target() throughout
  2018-05-28 16:10 ` [PATCH 1/4] target_stack -> current_top_target() throughout Pedro Alves
@ 2018-05-29  3:13   ` Tom Tromey
  2018-05-29 15:07     ` Pedro Alves
  0 siblings, 1 reply; 9+ messages in thread
From: Tom Tromey @ 2018-05-29  3:13 UTC (permalink / raw)
  To: Pedro Alves; +Cc: gdb-patches

>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:

I didn't really read this patch, since after a few glances it looked
mechanical.  But I did see a typo in the commit message

Pedro> Thus this commit renames target_target to current_top_target and

I think target_target -> target_stack here.

Tom

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

* Re: [PATCH 4/4] Introduce class target_stack
  2018-05-28 17:47 ` [PATCH 4/4] Introduce class target_stack Pedro Alves
@ 2018-05-29 11:34   ` Tom Tromey
  2018-05-29 14:59     ` Pedro Alves
  0 siblings, 1 reply; 9+ messages in thread
From: Tom Tromey @ 2018-05-29 11:34 UTC (permalink / raw)
  To: Pedro Alves; +Cc: gdb-patches

>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:

Pedro> The problem then is in finding a target's "beneath" target, if we
Pedro> consider that for some target_ops types, we'll be sharing a
Pedro> single target_ops instance between several inferiors.  For
Pedro> example, so far, I found no need to have multiple instances of
Pedro> the spu_multiarch_target / exec_target / dummy_target targets.

Is it the case that sometimes a particular target_ops instance will have
to be shared among multiple target stacks?

If so, then this all makes sense to me.

If not, then it seems maybe slightly off, because then if you need to
add state to some existing target_ops, you will have to check whether it
is shareable and then ensure it is unshared -- does this make sense?
But on the other hand, an instance of something like dummy_target should
be cheap (sizeof == 24 here).  So maybe a simpler rule is available.

On the third hand, it's only slightly off, and I don't want to get in
the way of this important project; but I would still like to understand.

Pedro> +/* The target stack.  */
Pedro> +static target_stack g_target_stack;

As an aside, I often wonder about blank lines between comments and
definitions.

I prefer not to have them, though not for any actual reason.  But some
spots have them and some do not, so in practice what I do is either
follow the local style; or leave the blank line out if I think I can; or
else feel guilty since I vaguely recall there was a rule to have one and
so put it in even though I'd rather not.

Pedro> +   Note that rather than allow an empty stack, we always have the
Pedro> +   dummy target at the bottom stratum, so we can call the function
Pedro> +   vectors without checking them.  */

Probably just "methods" rather than "function vectors".

Tom

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

* Re: [PATCH 4/4] Introduce class target_stack
  2018-05-29 11:34   ` Tom Tromey
@ 2018-05-29 14:59     ` Pedro Alves
  0 siblings, 0 replies; 9+ messages in thread
From: Pedro Alves @ 2018-05-29 14:59 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

On 05/29/2018 04:13 AM, Tom Tromey wrote:
>>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:
> 
> Pedro> The problem then is in finding a target's "beneath" target, if we
> Pedro> consider that for some target_ops types, we'll be sharing a
> Pedro> single target_ops instance between several inferiors.  For
> Pedro> example, so far, I found no need to have multiple instances of
> Pedro> the spu_multiarch_target / exec_target / dummy_target targets.
> 
> Is it the case that sometimes a particular target_ops instance will have
> to be shared among multiple target stacks?
> 
> If so, then this all makes sense to me.

Right, it is the case.  That is true for targets that support
multi-process.  E.g., native targets and remote targets.

The current model in the branch is:

- Each inferior gets its own target stack.  

- There's only ever one instance of the native target_ops.
  All native processes/inferiors use the same target_ops, because
  it's the same ptrace API "instance" that talks to all of them.
  For example, if you do "info os processes" to list all processes,
  it's the single native target_ops instance that implements that
  call.

- There's one remote_target (target_ops) instance for each
  remote connection.  All processes/inferiors debugged via that
  connection share the same remote_target instance.
  You can have multiple remote connections.

- Each process_stratum target_ops instance has its own PID number
  space.  IOW, a process is uniquely identified by the
  (process_stratum target_ops *, int PID) tuple.


Since each inferior has its own target stack, we should be able to
do things like activate "target record full" for inferior 1, and
"target record btrace" for inferior 2, though I haven't done that.


> 
> Pedro> +/* The target stack.  */
> Pedro> +static target_stack g_target_stack;
> 
> As an aside, I often wonder about blank lines between comments and
> definitions.
> 
> I prefer not to have them, though not for any actual reason.  But some
> spots have them and some do not, so in practice what I do is either
> follow the local style; or leave the blank line out if I think I can; or
> else feel guilty since I vaguely recall there was a rule to have one and
> so put it in even though I'd rather not.

I think the main rule is: blank line in definition, no blank line
in declarations:

 https://sourceware.org/gdb/wiki/Internals%20GDB-C-Coding-Standards#Documenting_Your_Code

That's what I think most newer code follows, but it's like you say,
in reality I guess most folks follow the local style.

I've fixed that case you pointed out.

The case in our codebase where I most tend to find blank lines odd,
is in the documentation of structure fields:

struct S
{
  /* This is foo.  */

  int foo;

  /* This is bar.  */

  int bar;
};

I think I dislike it because that way you lose the visual grouping
between comment and field that you otherwise have with:

struct S
{
  /* This is foo.  */
  int foo;

  /* This is bar.  */
  int bar;
};

Curiously, this case that is not explicitly specified in the wiki,
though the struct example there does not include spaces.

> 
> Pedro> +   Note that rather than allow an empty stack, we always have the
> Pedro> +   dummy target at the bottom stratum, so we can call the function
> Pedro> +   vectors without checking them.  */
> 
> Probably just "methods" rather than "function vectors".

Indeed, probably less confusing to newcomers.  That was just
copied over from elsewhere, but I'll adjust it.

Thanks,
Pedro Alves

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

* Re: [PATCH 1/4] target_stack -> current_top_target() throughout
  2018-05-29  3:13   ` Tom Tromey
@ 2018-05-29 15:07     ` Pedro Alves
  0 siblings, 0 replies; 9+ messages in thread
From: Pedro Alves @ 2018-05-29 15:07 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

On 05/28/2018 11:19 PM, Tom Tromey wrote:
>>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:
> 
> I didn't really read this patch, since after a few glances it looked
> mechanical.  But I did see a typo in the commit message
> 
> Pedro> Thus this commit renames target_target to current_top_target and
> 
> I think target_target -> target_stack here.

Whoops, thanks.  Fixed locally.

Pedro Alves

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

end of thread, other threads:[~2018-05-29 14:59 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-28 16:10 [PATCH 0/4] Change target stack representation Pedro Alves
2018-05-28 16:10 ` [PATCH 1/4] target_stack -> current_top_target() throughout Pedro Alves
2018-05-29  3:13   ` Tom Tromey
2018-05-29 15:07     ` Pedro Alves
2018-05-28 16:19 ` [PATCH 2/4] target_ops::beneath -> target_ops::beneath() Pedro Alves
2018-05-28 17:39 ` [PATCH 3/4] Eliminate find_target_beneath Pedro Alves
2018-05-28 17:47 ` [PATCH 4/4] Introduce class target_stack Pedro Alves
2018-05-29 11:34   ` Tom Tromey
2018-05-29 14:59     ` Pedro Alves

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).