This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


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

[binutils-gdb] Convert struct target_ops to C++


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f6ac5f3d63e03a81c4ff3749aba234961cc9090e

commit f6ac5f3d63e03a81c4ff3749aba234961cc9090e
Author: Pedro Alves <palves@redhat.com>
Date:   Thu May 3 00:37:22 2018 +0100

    Convert struct target_ops to C++
    
    I.e., use C++ virtual methods and inheritance instead of tables of
    function pointers.
    
    Unfortunately, there's no way to do a smooth transition.  ALL native
    targets in the tree must be converted at the same time.  I've tested
    all I could with cross compilers and with help from GCC compile farm,
    but naturally I haven't been able to test many of the ports.  Still, I
    made a best effort to port everything over, and while I expect some
    build problems due to typos and such, which should be trivial to fix,
    I don't expect any design problems.
    
    * Implementation notes:
    
    - The flattened current_target is gone.  References to current_target
      or current_target.beneath are replaced with references to
      target_stack (the top of the stack) directly.
    
    - To keep "set debug target" working, this adds a new debug_stratum
      layer that sits on top of the stack, prints the debug, and delegates
      to the target beneath.
    
      In addition, this makes the shortname and longname properties of
      target_ops be virtual methods instead of data fields, and makes the
      debug target defer those to the target beneath.  This is so that
      debug code sprinkled around that does "if (debugtarget) ..."  can
      transparently print the name of the target beneath.
    
      A patch later in the series actually splits out the
      shortname/longname methods to a separate structure, but I preferred
      to keep that chance separate as it is associated with changing a bit
      the design of how targets are registered and open.
    
    - Since you can't check whether a C++ virtual method is overridden,
      the old method of checking whether a target_ops implements a method
      by comparing the function pointer must be replaced with something
      else.
    
      Some cases are fixed by adding a parallel "can_do_foo" target_ops
      methods.  E.g.,:
    
        +  for (t = target_stack; t != NULL; t = t->beneath)
    	 {
        -      if (t->to_create_inferior != NULL)
        +      if (t->can_create_inferior ())
    	    break;
    	 }
    
      Others are fixed by changing void return type to bool or int return
      type, and have the default implementation return false or -1, to
      indicate lack of support.
    
    - make-target-delegates was adjusted to generate C++ classes and
      methods.
    
      It needed tweaks to grok "virtual" in front of the target method
      name, and for the fact that methods are no longer function pointers.
      (In particular, the current code parsing the return type was simple
      because it could simply parse up until the '(' in '(*to_foo)'.
    
      It now generates a couple C++ classes that inherit target_ops:
      dummy_target and debug_target.
    
      Since we need to generate the class declarations as well, i.e., we
      need to emit methods twice, we now generate the code in two passes.
    
    - The core_target global is renamed to avoid conflict with the
      "core_target" class.
    
    - ctf/tfile targets
    
      init_tracefile_ops is replaced by a base class that is inherited by
      both ctf and tfile.
    
    - bsd-uthread
    
      The bsd_uthread_ops_hack hack is gone.  It's not needed because
      nothing was extending a target created by bsd_uthread_target.
    
    - remote/extended-remote targets
    
      This is a first pass, just enough to C++ify target_ops.
    
      A later pass will convert more free functions to methods, and make
      remote_state be truly per remote instance, allowing multiple
      simultaneous instances of remote targets.
    
    - inf-child/"native" is converted to an actual base class
      (inf_child_target), that is inherited by all native targets.
    
    - GNU/Linux
    
      The old weird double-target linux_ops mechanism in linux-nat.c, is
      gone, replaced by adding a few virtual methods to linux-nat.h's
      target_ops, called low_XXX, that the concrete linux-nat
      implementations override.  Sort of like gdbserver's
      linux_target_ops, but simpler, for requiring only one
      target_ops-like hierarchy, which spares implementing the same method
      twice when we need to forward the method to a low implementation.
      The low target simply reimplements the target_ops method directly in
      that case.
    
      There are a few remaining linux-nat.c hooks that would be better
      converted to low_ methods like above too.  E.g.:
    
       linux_nat_set_new_thread (t, x86_linux_new_thread);
       linux_nat_set_new_fork (t, x86_linux_new_fork);
       linux_nat_set_forget_process
    
      That'll be done in a follow up patch.
    
    - We can no longer use functions like x86_use_watchpoints to install
      custom methods on an arbitrary base target.
    
      The patch replaces instances of such a pattern with template mixins.
      For example memory_breakpoint_target defined in target.h, or
      x86_nat_target in x86-nat.h.
    
    - linux_trad_target, MIPS and Alpha GNU/Linux
    
      The code in the new linux-nat-trad.h/c files which was split off of
      inf-ptrace.h/c recently, is converted to a C++ base class, and used
      by the MIPS and Alpha GNU/Linux ports.
    
    - BSD targets
    
      The
    
        $architecture x NetBSD/OpenBSD/FreeBSD
    
      support matrix complicates things a bit.  There's common BSD target
      code, and there's common architecture-specific code shared between
      the different BSDs.  Currently, all that is stiched together to form
      a final target, via the i386bsd_target, x86bsd_target,
      fbsd_nat_add_target functions etc.
    
      This introduces new fbsd_nat_target, obsd_nat_target and
      nbsd_nat_target classes that serve as base/prototype target for the
      corresponding BSD variant.
    
      And introduces generic i386/AMD64 BSD targets, to be used as
      template mixin to build a final target.  Similarly, a generic SPARC
      target is added, used by both BSD and Linux ports.
    
    - bsd_kvm_add_target, BSD libkvm target
    
      I considered making bsd_kvm_supply_pcb a virtual method, and then
      have each port inherit bsd_kvm_target and override that method, but
      that was resulting in lots of unjustified churn, so I left the
      function pointer mechanism alone.
    
    gdb/ChangeLog:
    2018-05-02  Pedro Alves  <palves@redhat.com>
    	    John Baldwin  <jhb@freebsd.org>
    
    	* target.h (enum strata) <debug_stratum>: New.
    	(struct target_ops) <all delegation methods>: Replace by C++
    	virtual methods, and drop "to_" prefix.  All references updated
    	throughout.
    	<to_shortname, to_longname, to_doc, to_data,
    	to_have_steppable_watchpoint, to_have_continuable_watchpoint,
    	to_has_thread_control, to_attach_no_wait>: Delete, replaced by
    	virtual methods.  All references updated throughout.
    	<can_attach, supports_terminal_ours, can_create_inferior,
    	get_thread_control_capabilities, attach_no_wait>: New
    	virtual methods.
    	<insert_breakpoint, remove_breakpoint>: Now
    	TARGET_DEFAULT_NORETURN methods.
    	<info_proc>: Now returns bool.
    	<to_magic>: Delete.
    	(OPS_MAGIC): Delete.
    	(current_target): Delete.  All references replaced by references
    	to ...
    	(target_stack): ... this.  New.
    	(target_shortname, target_longname): Adjust.
    	(target_can_run): Now a function declaration.
    	(default_child_has_all_memory, default_child_has_memory)
    	(default_child_has_stack, default_child_has_registers)
    	(default_child_has_execution): Remove target_ops parameter.
    	(complete_target_initialization): Delete.
    	(memory_breakpoint_target): New template class.
    	(test_target_ops): Refactor as a C++ class with virtual methods.
    	* make-target-delegates (NAME_PART): Tighten.
    	(POINTER_PART, CP_SYMBOL): New.
    	(SIMPLE_RETURN_PART): Reimplement.
    	(VEC_RETURN_PART): Expect less.
    	(RETURN_PART, VIRTUAL_PART): New.
    	(METHOD): Adjust to C++ virtual methods.
    	(scan_target_h): Remove reference to C99.
    	(dname): Output "target_ops::" prefix.
    	(write_function_header): Adjust to output a C++ class method.
    	(write_declaration): New.
    	(write_delegator): Adjust to output a C++ class method.
    	(tdname): Output "dummy_target::" prefix.
    	(write_tdefault, write_debugmethod): Adjust to output a C++ class
    	method.
    	(tdefault_names, debug_names): Delete.
    	(return_types, tdefaults, styles, argtypes_array): New.
    	(top level): All methods are delegators.
    	(print_class): New.
    	(top level): Print dummy_target and debug_target classes.
    	* target-delegates.c: Regenerate.
    	* target-debug.h (target_debug_print_enum_info_proc_what)
    	(target_debug_print_thread_control_capabilities)
    	(target_debug_print_thread_info_p): New.
    	* target.c (dummy_target): Delete.
    	(the_dummy_target, the_debug_target): New.
    	(target_stack): Now extern.
    	(set_targetdebug): Push/unpush debug target.
    	(default_child_has_all_memory, default_child_has_memory)
    	(default_child_has_stack, default_child_has_registers)
    	(default_child_has_execution): Remove target_ops parameter.
    	(complete_target_initialization): Delete.
    	(add_target_with_completer): No longer call
    	complete_target_initialization.
    	(target_supports_terminal_ours): Use regular delegation.
    	(update_current_target): Delete.
    	(push_target): No longer check magic number.  Don't call
    	update_current_target.
    	(unpush_target): Don't call update_current_target.
    	(target_is_pushed): No longer check magic number.
    	(target_require_runnable): Skip for all stratums over
    	process_stratum.
    	(target_ops::info_proc): New.
    	(target_info_proc): Use find_target_at and
    	find_default_run_target.
    	(target_supports_disable_randomization): Use regular delegation.
    	(target_get_osdata): Use find_target_at.
    	(target_ops::open, target_ops::close, target_ops::can_attach)
    	(target_ops::attach, target_ops::can_create_inferior)
    	(target_ops::create_inferior, target_ops::can_run)
    	(target_can_run): New.
    	(default_fileio_target): Use regular delegation.
    	(target_ops::fileio_open, target_ops::fileio_pwrite)
    	(target_ops::fileio_pread, target_ops::fileio_fstat)
    	(target_ops::fileio_close, target_ops::fileio_unlink)
    	(target_ops::fileio_readlink): New.
    	(target_fileio_open_1, target_fileio_unlink)
    	(target_fileio_readlink): Always call the target method.  Handle
    	FILEIO_ENOSYS.
    	(return_zero, return_zero_has_execution): Delete.
    	(init_dummy_target): Delete.
    	(dummy_target::dummy_target, dummy_target::shortname)
    	(dummy_target::longname, dummy_target::doc)
    	(debug_target::debug_target, debug_target::shortname)
    	(debug_target::longname, debug_target::doc): New.
    	(target_supports_delete_record): Use regular delegation.
    	(setup_target_debug): Delete.
    	(maintenance_print_target_stack): Skip debug_stratum.
    	(initialize_targets): Instantiate the_dummy_target and
    	the_debug_target.
    	* auxv.c (target_auxv_parse): Remove 'ops' parameter.  Adjust to
    	use target_stack.
    	(target_auxv_search, fprint_target_auxv): Adjust.
    	(info_auxv_command): Adjust to use target_stack.
    	* auxv.h (target_auxv_parse): Remove 'ops' parameter.
    	* exceptions.c (print_flush): Handle a NULL target_stack.
    	* regcache.c (target_ops_no_register): Refactor as class with
    	virtual methods.
    
    	* exec.c (exec_target): New class.
    	(exec_ops): Now an exec_target.
    	(exec_open, exec_close_1, exec_get_section_table)
    	(exec_xfer_partial, exec_files_info, exec_has_memory)
    	(exec_make_note_section): Refactor as exec_target methods.
    	(exec_file_clear, ignore, exec_remove_breakpoint, init_exec_ops):
    	Delete.
    	(exec_target::find_memory_regions): New.
    	(_initialize_exec): Don't call init_exec_ops.
    	* gdbcore.h (exec_file_clear): Delete.
    
    	* corefile.c (core_target): Delete.
    	(core_file_command): Adjust.
    	* corelow.c (core_target): New class.
    	(the_core_target): New.
    	(core_close): Remove target_ops parameter.
    	(core_close_cleanup): Adjust.
    	(core_target::close): New.
    	(core_open, core_detach, get_core_registers, core_files_info)
    	(core_xfer_partial, core_thread_alive, core_read_description)
    	(core_pid_to_str, core_thread_name, core_has_memory)
    	(core_has_stack, core_has_registers, core_info_proc): Rework as
    	core_target methods.
    	(ignore, core_remove_breakpoint, init_core_ops): Delete.
    	(_initialize_corelow): Initialize the_core_target.
    	* gdbcore.h (core_target): Delete.
    	(the_core_target): New.
    
    	* ctf.c: (ctf_target): New class.
    	(ctf_ops): Now a ctf_target.
    	(ctf_open, ctf_close, ctf_files_info, ctf_fetch_registers)
    	(ctf_xfer_partial, ctf_get_trace_state_variable_value)
    	(ctf_trace_find, ctf_traceframe_info): Refactor as ctf_target
    	methods.
    	(init_ctf_ops): Delete.
    	(_initialize_ctf): Don't call it.
    	* tracefile-tfile.c (tfile_target): New class.
    	(tfile_ops): Now a tfile_target.
    	(tfile_open, tfile_close, tfile_files_info)
    	(tfile_get_tracepoint_status, tfile_trace_find)
    	(tfile_fetch_registers, tfile_xfer_partial)
    	(tfile_get_trace_state_variable_value, tfile_traceframe_info):
    	Refactor as tfile_target methods.
    	(tfile_xfer_partial_features): Remove target_ops parameter.
    	(init_tfile_ops): Delete.
    	(_initialize_tracefile_tfile): Don't call it.
    	* tracefile.c (tracefile_has_all_memory, tracefile_has_memory)
    	(tracefile_has_stack, tracefile_has_registers)
    	(tracefile_thread_alive, tracefile_get_trace_status): Refactor as
    	tracefile_target methods.
    	(init_tracefile_ops): Delete.
    	(tracefile_target::tracefile_target): New.
    	* tracefile.h: Include "target.h".
    	(tracefile_target): New class.
    	(init_tracefile_ops): Delete.
    
    	* spu-multiarch.c (spu_multiarch_target): New class.
    	(spu_ops): Now a spu_multiarch_target.
    	(spu_thread_architecture, spu_region_ok_for_hw_watchpoint)
    	(spu_fetch_registers, spu_store_registers, spu_xfer_partial)
    	(spu_search_memory, spu_mourn_inferior): Refactor as
    	spu_multiarch_target methods.
    	(init_spu_ops): Delete.
    	(_initialize_spu_multiarch): Remove references to init_spu_ops,
    	complete_target_initialization.
    
    	* ravenscar-thread.c (ravenscar_thread_target): New class.
    	(ravenscar_ops): Now a ravenscar_thread_target.
    	(ravenscar_resume, ravenscar_wait, ravenscar_update_thread_list)
    	(ravenscar_thread_alive, ravenscar_pid_to_str)
    	(ravenscar_fetch_registers, ravenscar_store_registers)
    	(ravenscar_prepare_to_store, ravenscar_stopped_by_sw_breakpoint)
    	(ravenscar_stopped_by_hw_breakpoint)
    	(ravenscar_stopped_by_watchpoint, ravenscar_stopped_data_address)
    	(ravenscar_mourn_inferior, ravenscar_core_of_thread)
    	(ravenscar_get_ada_task_ptid): Refactor as ravenscar_thread_target
    	methods.
    	(init_ravenscar_thread_ops): Delete.
    	(_initialize_ravenscar): Remove references to
    	init_ravenscar_thread_ops and complete_target_initialization.
    
    	* bsd-uthread.c (bsd_uthread_ops_hack): Delete.
    	(bsd_uthread_target): New class.
    	(bsd_uthread_ops): Now a bsd_uthread_target.
    	(bsd_uthread_activate): Adjust to refer to bsd_uthread_ops.
    	(bsd_uthread_close, bsd_uthread_mourn_inferior)
    	(bsd_uthread_fetch_registers, bsd_uthread_store_registers)
    	(bsd_uthread_wait, bsd_uthread_resume, bsd_uthread_thread_alive)
    	(bsd_uthread_update_thread_list, bsd_uthread_extra_thread_info)
    	(bsd_uthread_pid_to_str): Refactor as bsd_uthread_target methods.
    	(bsd_uthread_target): Delete function.
    	(_initialize_bsd_uthread): Remove reference to
    	complete_target_initialization.
    
    	* bfd-target.c (target_bfd_data): Delete.  Fields folded into ...
    	(target_bfd): ... this new class.
    	(target_bfd_xfer_partial, target_bfd_get_section_table)
    	(target_bfd_close): Refactor as target_bfd methods.
    	(target_bfd::~target_bfd): New.
    	(target_bfd_reopen): Adjust.
    	(target_bfd::close): New.
    
    	* record-btrace.c (record_btrace_target): New class.
    	(record_btrace_ops): Now a record_btrace_target.
    	(record_btrace_open, record_btrace_stop_recording)
    	(record_btrace_disconnect, record_btrace_close)
    	(record_btrace_async, record_btrace_info)
    	(record_btrace_insn_history, record_btrace_insn_history_range)
    	(record_btrace_insn_history_from, record_btrace_call_history)
    	(record_btrace_call_history_range)
    	(record_btrace_call_history_from, record_btrace_record_method)
    	(record_btrace_is_replaying, record_btrace_will_replay)
    	(record_btrace_xfer_partial, record_btrace_insert_breakpoint)
    	(record_btrace_remove_breakpoint, record_btrace_fetch_registers)
    	(record_btrace_store_registers, record_btrace_prepare_to_store)
    	(record_btrace_to_get_unwinder)
    	(record_btrace_to_get_tailcall_unwinder, record_btrace_resume)
    	(record_btrace_commit_resume, record_btrace_wait)
    	(record_btrace_stop, record_btrace_can_execute_reverse)
    	(record_btrace_stopped_by_sw_breakpoint)
    	(record_btrace_supports_stopped_by_sw_breakpoint)
    	(record_btrace_stopped_by_hw_breakpoint)
    	(record_btrace_supports_stopped_by_hw_breakpoint)
    	(record_btrace_update_thread_list, record_btrace_thread_alive)
    	(record_btrace_goto_begin, record_btrace_goto_end)
    	(record_btrace_goto, record_btrace_stop_replaying_all)
    	(record_btrace_execution_direction)
    	(record_btrace_prepare_to_generate_core)
    	(record_btrace_done_generating_core): Refactor as
    	record_btrace_target methods.
    	(init_record_btrace_ops): Delete.
    	(_initialize_record_btrace): Remove reference to
    	init_record_btrace_ops.
    	* record-full.c (RECORD_FULL_IS_REPLAY): Adjust to always refer to
    	the execution_direction global.
    	(record_full_base_target, record_full_target)
    	(record_full_core_target): New classes.
    	(record_full_ops): Now a record_full_target.
    	(record_full_core_ops): Now a record_full_core_target.
    	(record_full_target::detach, record_full_target::disconnect)
    	(record_full_core_target::disconnect)
    	(record_full_target::mourn_inferior, record_full_target::kill):
    	New.
    	(record_full_open, record_full_close, record_full_async): Refactor
    	as methods of the record_full_base_target class.
    	(record_full_resume, record_full_commit_resume): Refactor
    	as methods of the record_full_target class.
    	(record_full_wait, record_full_stopped_by_watchpoint)
    	(record_full_stopped_data_address)
    	(record_full_stopped_by_sw_breakpoint)
    	(record_full_supports_stopped_by_sw_breakpoint)
    	(record_full_stopped_by_hw_breakpoint)
    	(record_full_supports_stopped_by_hw_breakpoint): Refactor as
    	methods of the record_full_base_target class.
    	(record_full_store_registers, record_full_xfer_partial)
    	(record_full_insert_breakpoint, record_full_remove_breakpoint):
    	Refactor as methods of the record_full_target class.
    	(record_full_can_execute_reverse, record_full_get_bookmark)
    	(record_full_goto_bookmark, record_full_execution_direction)
    	(record_full_record_method, record_full_info, record_full_delete)
    	(record_full_is_replaying, record_full_will_replay)
    	(record_full_goto_begin, record_full_goto_end, record_full_goto)
    	(record_full_stop_replaying): Refactor as methods of the
    	record_full_base_target class.
    	(record_full_core_resume, record_full_core_kill)
    	(record_full_core_fetch_registers)
    	(record_full_core_prepare_to_store)
    	(record_full_core_store_registers, record_full_core_xfer_partial)
    	(record_full_core_insert_breakpoint)
    	(record_full_core_remove_breakpoint)
    	(record_full_core_has_execution): Refactor
    	as methods of the record_full_core_target class.
    	(record_full_base_target::supports_delete_record): New.
    	(init_record_full_ops): Delete.
    	(init_record_full_core_ops): Delete.
    	(record_full_save): Refactor as method of the
    	record_full_base_target class.
    	(_initialize_record_full): Remove references to
    	init_record_full_ops and init_record_full_core_ops.
    
    	* remote.c (remote_target, extended_remote_target): New classes.
    	(remote_ops): Now a remote_target.
    	(extended_remote_ops): Now an extended_remote_target.
    	(remote_insert_fork_catchpoint, remote_remove_fork_catchpoint)
    	(remote_insert_vfork_catchpoint, remote_remove_vfork_catchpoint)
    	(remote_insert_exec_catchpoint, remote_remove_exec_catchpoint)
    	(remote_pass_signals, remote_set_syscall_catchpoint)
    	(remote_program_signals, )
    	(remote_thread_always_alive): Remove target_ops parameter.
    	(remote_thread_alive, remote_thread_name)
    	(remote_update_thread_list, remote_threads_extra_info)
    	(remote_static_tracepoint_marker_at)
    	(remote_static_tracepoint_markers_by_strid)
    	(remote_get_ada_task_ptid, remote_close, remote_start_remote)
    	(remote_open): Refactor as methods of remote_target.
    	(extended_remote_open, extended_remote_detach)
    	(extended_remote_attach, extended_remote_post_attach):
    	(extended_remote_supports_disable_randomization)
    	(extended_remote_create_inferior): : Refactor as method of
    	extended_remote_target.
    	(remote_set_permissions, remote_open_1, remote_detach)
    	(remote_follow_fork, remote_follow_exec, remote_disconnect)
    	(remote_resume, remote_commit_resume, remote_stop)
    	(remote_interrupt, remote_pass_ctrlc, remote_terminal_inferior)
    	(remote_terminal_ours, remote_wait, remote_fetch_registers)
    	(remote_prepare_to_store, remote_store_registers)
    	(remote_flash_erase, remote_flash_done, remote_files_info)
    	(remote_kill, remote_mourn, remote_insert_breakpoint)
    	(remote_remove_breakpoint, remote_insert_watchpoint)
    	(remote_watchpoint_addr_within_range)
    	(remote_remove_watchpoint, remote_region_ok_for_hw_watchpoint)
    	(remote_check_watch_resources, remote_stopped_by_sw_breakpoint)
    	(remote_supports_stopped_by_sw_breakpoint)
    	(remote_stopped_by_hw_breakpoint)
    	(remote_supports_stopped_by_hw_breakpoint)
    	(remote_stopped_by_watchpoint, remote_stopped_data_address)
    	(remote_insert_hw_breakpoint, remote_remove_hw_breakpoint)
    	(remote_verify_memory): Refactor as methods of remote_target.
    	(remote_write_qxfer, remote_read_qxfer): Remove target_ops
    	parameter.
    	(remote_xfer_partial, remote_get_memory_xfer_limit)
    	(remote_search_memory, remote_rcmd, remote_memory_map)
    	(remote_pid_to_str, remote_get_thread_local_address)
    	(remote_get_tib_address, remote_read_description): Refactor as
    	methods of remote_target.
    	(remote_target::fileio_open, remote_target::fileio_pwrite)
    	(remote_target::fileio_pread, remote_target::fileio_close): New.
    	(remote_hostio_readlink, remote_hostio_fstat)
    	(remote_filesystem_is_local, remote_can_execute_reverse)
    	(remote_supports_non_stop, remote_supports_disable_randomization)
    	(remote_supports_multi_process, remote_supports_cond_breakpoints)
    	(remote_supports_enable_disable_tracepoint)
    	(remote_supports_string_tracing)
    	(remote_can_run_breakpoint_commands, remote_trace_init)
    	(remote_download_tracepoint, remote_can_download_tracepoint)
    	(remote_download_trace_state_variable, remote_enable_tracepoint)
    	(remote_disable_tracepoint, remote_trace_set_readonly_regions)
    	(remote_trace_start, remote_get_trace_status)
    	(remote_get_tracepoint_status, remote_trace_stop)
    	(remote_trace_find, remote_get_trace_state_variable_value)
    	(remote_save_trace_data, remote_get_raw_trace_data)
    	(remote_set_disconnected_tracing, remote_core_of_thread)
    	(remote_set_circular_trace_buffer, remote_traceframe_info)
    	(remote_get_min_fast_tracepoint_insn_len)
    	(remote_set_trace_buffer_size, remote_set_trace_notes)
    	(remote_use_agent, remote_can_use_agent, remote_enable_btrace)
    	(remote_disable_btrace, remote_teardown_btrace)
    	(remote_read_btrace, remote_btrace_conf)
    	(remote_augmented_libraries_svr4_read, remote_load)
    	(remote_pid_to_exec_file, remote_can_do_single_step)
    	(remote_execution_direction, remote_thread_handle_to_thread_info):
    	Refactor as methods of remote_target.
    	(init_remote_ops, init_extended_remote_ops): Delete.
    	(remote_can_async_p, remote_is_async_p, remote_async)
    	(remote_thread_events, remote_upload_tracepoints)
    	(remote_upload_trace_state_variables): Refactor as methods of
    	remote_target.
    	(_initialize_remote): Remove references to init_remote_ops and
    	init_extended_remote_ops.
    
    	* remote-sim.c (gdbsim_target): New class.
    	(gdbsim_fetch_register, gdbsim_store_register, gdbsim_kill)
    	(gdbsim_load, gdbsim_create_inferior, gdbsim_open, gdbsim_close)
    	(gdbsim_detach, gdbsim_resume, gdbsim_interrupt)
    	(gdbsim_wait, gdbsim_prepare_to_store, gdbsim_xfer_partial)
    	(gdbsim_files_info, gdbsim_mourn_inferior, gdbsim_thread_alive)
    	(gdbsim_pid_to_str, gdbsim_has_all_memory, gdbsim_has_memory):
    	Refactor as methods of gdbsim_target.
    	(gdbsim_ops): Now a gdbsim_target.
    	(init_gdbsim_ops): Delete.
    	(gdbsim_cntrl_c): Adjust.
    	(_initialize_remote_sim): Remove reference to init_gdbsim_ops.
    
    	* amd64-linux-nat.c (amd64_linux_nat_target): New class.
    	(the_amd64_linux_nat_target): New.
    	(amd64_linux_fetch_inferior_registers)
    	(amd64_linux_store_inferior_registers): Refactor as methods of
    	amd64_linux_nat_target.
    	(_initialize_amd64_linux_nat): Adjust.  Set linux_target.
    	* i386-linux-nat.c: Don't include "linux-nat.h".
    	(i386_linux_nat_target): New class.
    	(the_i386_linux_nat_target): New.
    	(i386_linux_fetch_inferior_registers)
    	(i386_linux_store_inferior_registers, i386_linux_resume): Refactor
    	as methods of i386_linux_nat_target.
    	(_initialize_i386_linux_nat): Adjust.  Set linux_target.
    	* inf-child.c (inf_child_ops): Delete.
    	(inf_child_fetch_inferior_registers)
    	(inf_child_store_inferior_registers): Delete.
    	(inf_child_post_attach, inf_child_prepare_to_store): Refactor as
    	methods of inf_child_target.
    	(inf_child_target::supports_terminal_ours)
    	(inf_child_target::terminal_init)
    	(inf_child_target::terminal_inferior)
    	(inf_child_target::terminal_ours_for_output)
    	(inf_child_target::terminal_ours, inf_child_target::interrupt)
    	(inf_child_target::pass_ctrlc, inf_child_target::terminal_info):
    	New.
    	(inf_child_open, inf_child_disconnect, inf_child_close)
    	(inf_child_mourn_inferior, inf_child_maybe_unpush_target)
    	(inf_child_post_startup_inferior, inf_child_can_run)
    	(inf_child_pid_to_exec_file): Refactor as methods of
    	inf_child_target.
    	(inf_child_follow_fork): Delete.
    	(inf_child_target::can_create_inferior)
    	(inf_child_target::can_attach): New.
    	(inf_child_target::has_all_memory, inf_child_target::has_memory)
    	(inf_child_target::has_stack, inf_child_target::has_registers)
    	(inf_child_target::has_execution): New.
    	(inf_child_fileio_open, inf_child_fileio_pwrite)
    	(inf_child_fileio_pread, inf_child_fileio_fstat)
    	(inf_child_fileio_close, inf_child_fileio_unlink)
    	(inf_child_fileio_readlink, inf_child_use_agent)
    	(inf_child_can_use_agent): Refactor as methods of
    	inf_child_target.
    	(return_zero, inf_child_target): Delete.
    	(inf_child_target::inf_child_target): New.
    	* inf-child.h: Include "target.h".
    	(inf_child_target): Delete function prototype.
    	(inf_child_target): New class.
    	(inf_child_open_target, inf_child_mourn_inferior)
    	(inf_child_maybe_unpush_target): Delete.
    	* inf-ptrace.c (inf_ptrace_target::~inf_ptrace_target): New.
    	(inf_ptrace_follow_fork, inf_ptrace_insert_fork_catchpoint)
    	(inf_ptrace_remove_fork_catchpoint, inf_ptrace_create_inferior)
    	(inf_ptrace_post_startup_inferior, inf_ptrace_mourn_inferior)
    	(inf_ptrace_attach, inf_ptrace_post_attach, inf_ptrace_detach)
    	(inf_ptrace_detach_success, inf_ptrace_kill, inf_ptrace_resume)
    	(inf_ptrace_wait, inf_ptrace_xfer_partial)
    	(inf_ptrace_thread_alive, inf_ptrace_files_info)
    	(inf_ptrace_pid_to_str, inf_ptrace_auxv_parse): Refactor as
    	methods of inf_ptrace_target.
    	(inf_ptrace_target): Delete function.
    	* inf-ptrace.h: Include "inf-child.h".
    	(inf_ptrace_target): Delete function declaration.
    	(inf_ptrace_target): New class.
    	(inf_ptrace_trad_target, inf_ptrace_detach_success): Delete.
    	* linux-nat.c (linux_target): New.
    	(linux_ops, linux_ops_saved, super_xfer_partial): Delete.
    	(linux_nat_target::~linux_nat_target): New.
    	(linux_child_post_attach, linux_child_post_startup_inferior)
    	(linux_child_follow_fork, linux_child_insert_fork_catchpoint)
    	(linux_child_remove_fork_catchpoint)
    	(linux_child_insert_vfork_catchpoint)
    	(linux_child_remove_vfork_catchpoint)
    	(linux_child_insert_exec_catchpoint)
    	(linux_child_remove_exec_catchpoint)
    	(linux_child_set_syscall_catchpoint, linux_nat_pass_signals)
    	(linux_nat_create_inferior, linux_nat_attach, linux_nat_detach)
    	(linux_nat_resume, linux_nat_stopped_by_watchpoint)
    	(linux_nat_stopped_data_address)
    	(linux_nat_stopped_by_sw_breakpoint)
    	(linux_nat_supports_stopped_by_sw_breakpoint)
    	(linux_nat_stopped_by_hw_breakpoint)
    	(linux_nat_supports_stopped_by_hw_breakpoint, linux_nat_wait)
    	(linux_nat_kill, linux_nat_mourn_inferior)
    	(linux_nat_xfer_partial, linux_nat_thread_alive)
    	(linux_nat_update_thread_list, linux_nat_pid_to_str)
    	(linux_nat_thread_name, linux_child_pid_to_exec_file)
    	(linux_child_static_tracepoint_markers_by_strid)
    	(linux_nat_is_async_p, linux_nat_can_async_p)
    	(linux_nat_supports_non_stop, linux_nat_always_non_stop_p)
    	(linux_nat_supports_multi_process)
    	(linux_nat_supports_disable_randomization, linux_nat_async)
    	(linux_nat_stop, linux_nat_close, linux_nat_thread_address_space)
    	(linux_nat_core_of_thread, linux_nat_filesystem_is_local)
    	(linux_nat_fileio_open, linux_nat_fileio_readlink)
    	(linux_nat_fileio_unlink, linux_nat_thread_events): Refactor as
    	methods of linux_nat_target.
    	(linux_nat_wait_1, linux_xfer_siginfo, linux_proc_xfer_partial)
    	(linux_proc_xfer_spu, linux_nat_xfer_osdata): Remove target_ops
    	parameter.
    	(check_stopped_by_watchpoint): Adjust.
    	(linux_xfer_partial): Delete.
    	(linux_target_install_ops, linux_target, linux_nat_add_target):
    	Delete.
    	(linux_nat_target::linux_nat_target): New.
    	* linux-nat.h: Include "inf-ptrace.h".
    	(linux_nat_target): New.
    	(linux_target, linux_target_install_ops, linux_nat_add_target):
    	Delete function declarations.
    	(linux_target): Declare global.
    	* linux-thread-db.c (thread_db_target): New.
    	(thread_db_target::thread_db_target): New.
    	(thread_db_ops): Delete.
    	(the_thread_db_target): New.
    	(thread_db_detach, thread_db_wait, thread_db_mourn_inferior)
    	(thread_db_update_thread_list, thread_db_pid_to_str)
    	(thread_db_extra_thread_info)
    	(thread_db_thread_handle_to_thread_info)
    	(thread_db_get_thread_local_address, thread_db_get_ada_task_ptid)
    	(thread_db_resume): Refactor as methods of thread_db_target.
    	(init_thread_db_ops): Delete.
    	(_initialize_thread_db): Remove reference to init_thread_db_ops.
    	* x86-linux-nat.c: Don't include "linux-nat.h".
    	(super_post_startup_inferior): Delete.
    	(x86_linux_nat_target::~x86_linux_nat_target): New.
    	(x86_linux_child_post_startup_inferior)
    	(x86_linux_read_description, x86_linux_enable_btrace)
    	(x86_linux_disable_btrace, x86_linux_teardown_btrace)
    	(x86_linux_read_btrace, x86_linux_btrace_conf): Refactor as
    	methods of x86_linux_nat_target.
    	(x86_linux_create_target): Delete.  Bits folded ...
    	(x86_linux_add_target): ... here.  Now takes a linux_nat_target
    	pointer.
    	* x86-linux-nat.h: Include "linux-nat.h" and "x86-nat.h".
    	(x86_linux_nat_target): New class.
    	(x86_linux_create_target): Delete.
    	(x86_linux_add_target): Now takes a linux_nat_target pointer.
    	* x86-nat.c (x86_insert_watchpoint, x86_remove_watchpoint)
    	(x86_region_ok_for_watchpoint, x86_stopped_data_address)
    	(x86_stopped_by_watchpoint, x86_insert_hw_breakpoint)
    	(x86_remove_hw_breakpoint, x86_can_use_hw_breakpoint)
    	(x86_stopped_by_hw_breakpoint): Remove target_ops parameter and
    	make extern.
    	(x86_use_watchpoints): Delete.
    	* x86-nat.h: Include "breakpoint.h" and "target.h".
    	(x86_use_watchpoints): Delete.
    	(x86_can_use_hw_breakpoint, x86_region_ok_for_hw_watchpoint)
    	(x86_stopped_by_watchpoint, x86_stopped_data_address)
    	(x86_insert_watchpoint, x86_remove_watchpoint)
    	(x86_insert_hw_breakpoint, x86_remove_hw_breakpoint)
    	(x86_stopped_by_hw_breakpoint): New declarations.
    	(x86_nat_target): New template class.
    
    	* ppc-linux-nat.c (ppc_linux_nat_target): New class.
    	(the_ppc_linux_nat_target): New.
    	(ppc_linux_fetch_inferior_registers)
    	(ppc_linux_can_use_hw_breakpoint)
    	(ppc_linux_region_ok_for_hw_watchpoint)
    	(ppc_linux_ranged_break_num_registers)
    	(ppc_linux_insert_hw_breakpoint, ppc_linux_remove_hw_breakpoint)
    	(ppc_linux_insert_mask_watchpoint)
    	(ppc_linux_remove_mask_watchpoint)
    	(ppc_linux_can_accel_watchpoint_condition)
    	(ppc_linux_insert_watchpoint, ppc_linux_remove_watchpoint)
    	(ppc_linux_stopped_data_address, ppc_linux_stopped_by_watchpoint)
    	(ppc_linux_watchpoint_addr_within_range)
    	(ppc_linux_masked_watch_num_registers)
    	(ppc_linux_store_inferior_registers, ppc_linux_auxv_parse)
    	(ppc_linux_read_description): Refactor as methods of
    	ppc_linux_nat_target.
    	(_initialize_ppc_linux_nat): Adjust.  Set linux_target.
    
    	* procfs.c (procfs_xfer_partial): Delete forward declaration.
    	(procfs_target): New class.
    	(the_procfs_target): New.
    	(procfs_target): Delete function.
    	(procfs_auxv_parse, procfs_attach, procfs_detach)
    	(procfs_fetch_registers, procfs_store_registers, procfs_wait)
    	(procfs_xfer_partial, procfs_resume, procfs_pass_signals)
    	(procfs_files_info, procfs_kill_inferior, procfs_mourn_inferior)
    	(procfs_create_inferior, procfs_update_thread_list)
    	(procfs_thread_alive, procfs_pid_to_str)
    	(procfs_can_use_hw_breakpoint, procfs_stopped_by_watchpoint)
    	(procfs_stopped_data_address, procfs_insert_watchpoint)
    	(procfs_remove_watchpoint, procfs_region_ok_for_hw_watchpoint)
    	(proc_find_memory_regions, procfs_info_proc)
    	(procfs_make_note_section): Refactor as methods of procfs_target.
    	(_initialize_procfs): Adjust.
    	* sol-thread.c (sol_thread_target): New class.
    	(sol_thread_ops): Now a sol_thread_target.
    	(sol_thread_detach, sol_thread_resume, sol_thread_wait)
    	(sol_thread_fetch_registers, sol_thread_store_registers)
    	(sol_thread_xfer_partial, sol_thread_mourn_inferior)
    	(sol_thread_alive, solaris_pid_to_str, sol_update_thread_list)
    	(sol_get_ada_task_ptid): Refactor as methods of sol_thread_target.
    	(init_sol_thread_ops): Delete.
    	(_initialize_sol_thread): Adjust.  Remove references to
    	init_sol_thread_ops and complete_target_initialization.
    
    	* windows-nat.c (windows_nat_target): New class.
    	(windows_fetch_inferior_registers)
    	(windows_store_inferior_registers, windows_resume, windows_wait)
    	(windows_attach, windows_detach, windows_pid_to_exec_file)
    	(windows_files_info, windows_create_inferior)
    	(windows_mourn_inferior, windows_interrupt, windows_kill_inferior)
    	(windows_close, windows_pid_to_str, windows_xfer_partial)
    	(windows_get_tib_address, windows_get_ada_task_ptid)
    	(windows_thread_name, windows_thread_alive): Refactor as
    	windows_nat_target methods.
    	(do_initial_windows_stuff): Adjust.
    	(windows_target): Delete function.
    	(_initialize_windows_nat): Adjust.
    
    	* darwin-nat.c (darwin_resume, darwin_wait_to, darwin_interrupt)
    	(darwin_mourn_inferior, darwin_kill_inferior)
    	(darwin_create_inferior, darwin_attach, darwin_detach)
    	(darwin_pid_to_str, darwin_thread_alive, darwin_xfer_partial)
    	(darwin_pid_to_exec_file, darwin_get_ada_task_ptid)
    	(darwin_supports_multi_process): Refactor as darwin_nat_target
    	methods.
    	(darwin_resume_to, darwin_files_info): Delete.
    	(_initialize_darwin_inferior): Rename to ...
    	(_initialize_darwin_nat): ... this.  Adjust to C++ification.
    	* darwin-nat.h: Include "inf-child.h".
    	(darwin_nat_target): New class.
    	(darwin_complete_target): Delete.
    	* i386-darwin-nat.c (i386_darwin_nat_target): New class.
    	(darwin_target): New.
    	(i386_darwin_fetch_inferior_registers)
    	(i386_darwin_store_inferior_registers): Refactor as methods of
    	darwin_nat_target.
    	(darwin_complete_target): Delete, with ...
    	(_initialize_i386_darwin_nat): ... bits factored out here.
    
    	* alpha-linux-nat.c (alpha_linux_nat_target): New class.
    	(the_alpha_linux_nat_target): New.
    	(alpha_linux_register_u_offset): Refactor as
    	alpha_linux_nat_target method.
    	(_initialize_alpha_linux_nat): Adjust.
    	* linux-nat-trad.c (inf_ptrace_register_u_offset): Delete.
    	(inf_ptrace_fetch_register, inf_ptrace_fetch_registers)
    	(inf_ptrace_store_register, inf_ptrace_store_registers): Refact as
    	methods of linux_nat_trad_target.
    	(linux_trad_target): Delete.
    	* linux-nat-trad.h (linux_trad_target): Delete function.
    	(linux_nat_trad_target): New class.
    	* mips-linux-nat.c (mips_linux_nat_target): New class.
    	(super_fetch_registers, super_store_registers, super_close):
    	Delete.
    	(the_mips_linux_nat_target): New.
    	(mips64_linux_regsets_fetch_registers)
    	(mips64_linux_regsets_store_registers)
    	(mips64_linux_fetch_registers, mips64_linux_store_registers)
    	(mips_linux_register_u_offset, mips_linux_read_description)
    	(mips_linux_can_use_hw_breakpoint)
    	(mips_linux_stopped_by_watchpoint)
    	(mips_linux_stopped_data_address)
    	(mips_linux_region_ok_for_hw_watchpoint)
    	(mips_linux_insert_watchpoint, mips_linux_remove_watchpoint)
    	(mips_linux_close): Refactor as methods of mips_linux_nat.
    	(_initialize_mips_linux_nat): Adjust to C++ification.
    
    	* aix-thread.c (aix_thread_target): New class.
    	(aix_thread_ops): Now an aix_thread_target.
    	(aix_thread_detach, aix_thread_resume, aix_thread_wait)
    	(aix_thread_fetch_registers, aix_thread_store_registers)
    	(aix_thread_xfer_partial, aix_thread_mourn_inferior)
    	(aix_thread_thread_alive, aix_thread_pid_to_str)
    	(aix_thread_extra_thread_info, aix_thread_get_ada_task_ptid):
    	Refactor as methods of aix_thread_target.
    	(init_aix_thread_ops): Delete.
    	(_initialize_aix_thread): Remove references to init_aix_thread_ops
    	and complete_target_initialization.
    	* rs6000-nat.c (rs6000_xfer_shared_libraries): Delete.
    	(rs6000_nat_target): New class.
    	(the_rs6000_nat_target): New.
    	(rs6000_fetch_inferior_registers, rs6000_store_inferior_registers)
    	(rs6000_xfer_partial, rs6000_wait, rs6000_create_inferior)
    	(rs6000_xfer_shared_libraries): Refactor as rs6000_nat_target methods.
    	(super_create_inferior): Delete.
    	(_initialize_rs6000_nat): Adjust to C++ification.
    
    	* arm-linux-nat.c (arm_linux_nat_target): New class.
    	(the_arm_linux_nat_target): New.
    	(arm_linux_fetch_inferior_registers)
    	(arm_linux_store_inferior_registers, arm_linux_read_description)
    	(arm_linux_can_use_hw_breakpoint, arm_linux_insert_hw_breakpoint)
    	(arm_linux_remove_hw_breakpoint)
    	(arm_linux_region_ok_for_hw_watchpoint)
    	(arm_linux_insert_watchpoint, arm_linux_remove_watchpoint)
    	(arm_linux_stopped_data_address, arm_linux_stopped_by_watchpoint)
    	(arm_linux_watchpoint_addr_within_range): Refactor as methods of
    	arm_linux_nat_target.
    	(_initialize_arm_linux_nat): Adjust to C++ification.
    
    	* aarch64-linux-nat.c (aarch64_linux_nat_target): New class.
    	(the_aarch64_linux_nat_target): New.
    	(aarch64_linux_fetch_inferior_registers)
    	(aarch64_linux_store_inferior_registers)
    	(aarch64_linux_child_post_startup_inferior)
    	(aarch64_linux_read_description)
    	(aarch64_linux_can_use_hw_breakpoint)
    	(aarch64_linux_insert_hw_breakpoint)
    	(aarch64_linux_remove_hw_breakpoint)
    	(aarch64_linux_insert_watchpoint, aarch64_linux_remove_watchpoint)
    	(aarch64_linux_region_ok_for_hw_watchpoint)
    	(aarch64_linux_stopped_data_address)
    	(aarch64_linux_stopped_by_watchpoint)
    	(aarch64_linux_watchpoint_addr_within_range)
    	(aarch64_linux_can_do_single_step): Refactor as methods of
    	aarch64_linux_nat_target.
    	(super_post_startup_inferior): Delete.
    	(_initialize_aarch64_linux_nat): Adjust to C++ification.
    
    	* hppa-linux-nat.c (hppa_linux_nat_target): New class.
    	(the_hppa_linux_nat_target): New.
    	(hppa_linux_fetch_inferior_registers)
    	(hppa_linux_store_inferior_registers): Refactor as methods of
    	hppa_linux_nat_target.
    	(_initialize_hppa_linux_nat): Adjust to C++ification.
    
    	* ia64-linux-nat.c (ia64_linux_nat_target): New class.
    	(the_ia64_linux_nat_target): New.
    	(ia64_linux_insert_watchpoint, ia64_linux_remove_watchpoint)
    	(ia64_linux_stopped_data_address)
    	(ia64_linux_stopped_by_watchpoint, ia64_linux_fetch_registers)
    	(ia64_linux_store_registers, ia64_linux_xfer_partial): Refactor as
    	ia64_linux_nat_target methods.
    	(super_xfer_partial): Delete.
    	(_initialize_ia64_linux_nat): Adjust to C++ification.
    
    	* m32r-linux-nat.c (m32r_linux_nat_target): New class.
    	(the_m32r_linux_nat_target): New.
    	(m32r_linux_fetch_inferior_registers)
    	(m32r_linux_store_inferior_registers): Refactor as
    	m32r_linux_nat_target methods.
    	(_initialize_m32r_linux_nat): Adjust to C++ification.
    
    	* m68k-linux-nat.c (m68k_linux_nat_target): New class.
    	(the_m68k_linux_nat_target): New.
    	(m68k_linux_fetch_inferior_registers)
    	(m68k_linux_store_inferior_registers): Refactor as
    	m68k_linux_nat_target methods.
    	(_initialize_m68k_linux_nat): Adjust to C++ification.
    
    	* s390-linux-nat.c (s390_linux_nat_target): New class.
    	(the_s390_linux_nat_target): New.
    	(s390_linux_fetch_inferior_registers)
    	(s390_linux_store_inferior_registers, s390_stopped_by_watchpoint)
    	(s390_insert_watchpoint, s390_remove_watchpoint)
    	(s390_can_use_hw_breakpoint, s390_insert_hw_breakpoint)
    	(s390_remove_hw_breakpoint, s390_region_ok_for_hw_watchpoint)
    	(s390_auxv_parse, s390_read_description): Refactor as methods of
    	s390_linux_nat_target.
    	(_initialize_s390_nat): Adjust to C++ification.
    
    	* sparc-linux-nat.c (sparc_linux_nat_target): New class.
    	(the_sparc_linux_nat_target): New.
    	(_initialize_sparc_linux_nat): Adjust to C++ification.
    	* sparc-nat.c (sparc_fetch_inferior_registers)
    	(sparc_store_inferior_registers): Remove target_ops parameter.
    	* sparc-nat.h (sparc_fetch_inferior_registers)
    	(sparc_store_inferior_registers): Remove target_ops parameter.
    	* sparc64-linux-nat.c (sparc64_linux_nat_target): New class.
    	(the_sparc64_linux_nat_target): New.
    	(_initialize_sparc64_linux_nat): Adjust to C++ification.
    
    	* spu-linux-nat.c (spu_linux_nat_target): New class.
    	(the_spu_linux_nat_target): New.
    	(spu_child_post_startup_inferior, spu_child_post_attach)
    	(spu_child_wait, spu_fetch_inferior_registers)
    	(spu_store_inferior_registers, spu_xfer_partial)
    	(spu_can_use_hw_breakpoint): Refactor as spu_linux_nat_target
    	methods.
    	(_initialize_spu_nat): Adjust to C++ification.
    
    	* tilegx-linux-nat.c (tilegx_linux_nat_target): New class.
    	(the_tilegx_linux_nat_target): New.
    	(fetch_inferior_registers, store_inferior_registers):
    	Refactor as methods.
    	(_initialize_tile_linux_nat): Adjust to C++ification.
    
    	* xtensa-linux-nat.c (xtensa_linux_nat_target): New class.
    	(the_xtensa_linux_nat_target): New.
    	(xtensa_linux_fetch_inferior_registers)
    	(xtensa_linux_store_inferior_registers): Refactor as
    	xtensa_linux_nat_target methods.
    	(_initialize_xtensa_linux_nat): Adjust to C++ification.
    
    	* fbsd-nat.c (USE_SIGTRAP_SIGINFO): Delete.
    	(fbsd_pid_to_exec_file, fbsd_find_memory_regions)
    	(fbsd_find_memory_regions, fbsd_info_proc, fbsd_xfer_partial)
    	(fbsd_thread_alive, fbsd_pid_to_str, fbsd_thread_name)
    	(fbsd_update_thread_list, fbsd_resume, fbsd_wait)
    	(fbsd_stopped_by_sw_breakpoint)
    	(fbsd_supports_stopped_by_sw_breakpoint, fbsd_follow_fork)
    	(fbsd_insert_fork_catchpoint, fbsd_remove_fork_catchpoint)
    	(fbsd_insert_vfork_catchpoint, fbsd_remove_vfork_catchpoint)
    	(fbsd_post_startup_inferior, fbsd_post_attach)
    	(fbsd_insert_exec_catchpoint, fbsd_remove_exec_catchpoint)
    	(fbsd_set_syscall_catchpoint)
    	(super_xfer_partial, super_resume, super_wait)
    	(fbsd_supports_stopped_by_hw_breakpoint): Delete.
    	(fbsd_handle_debug_trap): Remove target_ops parameter.
    	(fbsd_nat_add_target): Delete.
    	* fbsd-nat.h: Include "inf-ptrace.h".
    	(fbsd_nat_add_target): Delete.
    	(USE_SIGTRAP_SIGINFO): Define.
    	(fbsd_nat_target): New class.
    
    	* amd64-bsd-nat.c (amd64bsd_fetch_inferior_registers)
    	(amd64bsd_store_inferior_registers): Remove target_ops parameter.
    	(amd64bsd_target): Delete.
    	* amd64-bsd-nat.h: New file.
    	* amd64-fbsd-nat.c: Include "amd64-bsd-nat.h" instead of
    	"x86-bsd-nat.h".
    	(amd64_fbsd_nat_target): New class.
    	(the_amd64_fbsd_nat_target): New.
    	(amd64fbsd_read_description): Refactor as method of
    	amd64_fbsd_nat_target.
    	(amd64_fbsd_nat_target::supports_stopped_by_hw_breakpoint): New.
    	(_initialize_amd64fbsd_nat): Adjust to C++ification.
    	* amd64-nat.h (amd64bsd_target): Delete function declaration.
    	* i386-bsd-nat.c (i386bsd_fetch_inferior_registers)
    	(i386bsd_store_inferior_registers): Remove target_ops parameter.
    	(i386bsd_target): Delete.
    	* i386-bsd-nat.h (i386bsd_target): Delete function declaration.
    	(i386bsd_fetch_inferior_registers)
    	(i386bsd_store_inferior_registers): Declare.
    	(i386_bsd_nat_target): New class.
    	* i386-fbsd-nat.c (i386_fbsd_nat_target): New class.
    	(the_i386_fbsd_nat_target): New.
    	(i386fbsd_resume, i386fbsd_read_description): Refactor as
    	i386_fbsd_nat_target methods.
    	(i386_fbsd_nat_target::supports_stopped_by_hw_breakpoint): New.
    	(_initialize_i386fbsd_nat): Adjust to C++ification.
    	* x86-bsd-nat.c (super_mourn_inferior): Delete.
    	(x86bsd_mourn_inferior, x86bsd_target): Delete.
    	(_initialize_x86_bsd_nat): Adjust to C++ification.
    	* x86-bsd-nat.h: Include "x86-nat.h".
    	(x86bsd_target): Delete declaration.
    	(x86bsd_nat_target): New class.
    
    	* aarch64-fbsd-nat.c (aarch64_fbsd_nat_target): New class.
    	(the_aarch64_fbsd_nat_target): New.
    	(aarch64_fbsd_fetch_inferior_registers)
    	(aarch64_fbsd_store_inferior_registers): Refactor as methods of
    	aarch64_fbsd_nat_target.
    	(_initialize_aarch64_fbsd_nat): Adjust to C++ification.
    	* alpha-bsd-nat.c (alpha_bsd_nat_target): New class.
    	(the_alpha_bsd_nat_target): New.
    	(alphabsd_fetch_inferior_registers)
    	(alphabsd_store_inferior_registers): Refactor as
    	alpha_bsd_nat_target methods.
    	(_initialize_alphabsd_nat): Refactor as methods of
    	alpha_bsd_nat_target.
    	* amd64-nbsd-nat.c: Include "amd64-bsd-nat.h".
    	(the_amd64_nbsd_nat_target): New.
    	(_initialize_amd64nbsd_nat): Adjust to C++ification.
    	* amd64-obsd-nat.c: Include "amd64-bsd-nat.h".
    	(the_amd64_obsd_nat_target): New.
    	(_initialize_amd64obsd_nat): Adjust to C++ification.
    	* arm-fbsd-nat.c (arm_fbsd_nat_target): New.
    	(the_arm_fbsd_nat_target): New.
    	(arm_fbsd_fetch_inferior_registers)
    	(arm_fbsd_store_inferior_registers, arm_fbsd_read_description):
    	(_initialize_arm_fbsd_nat): Refactor as methods of
    	arm_fbsd_nat_target.
    	(_initialize_arm_fbsd_nat): Adjust to C++ification.
    	* arm-nbsd-nat.c (arm_netbsd_nat_target): New class.
    	(the_arm_netbsd_nat_target): New.
    	(armnbsd_fetch_registers, armnbsd_store_registers): Refactor as
    	arm_netbsd_nat_target.
    	(_initialize_arm_netbsd_nat): Adjust to C++ification.
    	* hppa-nbsd-nat.c (hppa_nbsd_nat_target): New class.
    	(the_hppa_nbsd_nat_target): New.
    	(hppanbsd_fetch_registers, hppanbsd_store_registers): Refactor as
    	hppa_nbsd_nat_target methods.
    	(_initialize_hppanbsd_nat): Adjust to C++ification.
    	* hppa-obsd-nat.c (hppa_obsd_nat_target): New class.
    	(the_hppa_obsd_nat_target): New.
    	(hppaobsd_fetch_registers, hppaobsd_store_registers): Refactor as
    	methods of hppa_obsd_nat_target.
    	(_initialize_hppaobsd_nat): Adjust to C++ification.  Use
    	add_target.
    	* i386-nbsd-nat.c (the_i386_nbsd_nat_target): New.
    	(_initialize_i386nbsd_nat): Adjust to C++ification.  Use
    	add_target.
    	* i386-obsd-nat.c (the_i386_obsd_nat_target): New.
    	(_initialize_i386obsd_nat): Use add_target.
    	* m68k-bsd-nat.c (m68k_bsd_nat_target): New class.
    	(the_m68k_bsd_nat_target): New.
    	(m68kbsd_fetch_inferior_registers)
    	(m68kbsd_store_inferior_registers): Refactor as methods of
    	m68k_bsd_nat_target.
    	(_initialize_m68kbsd_nat): Adjust to C++ification.
    	* mips-fbsd-nat.c (mips_fbsd_nat_target): New class.
    	(the_mips_fbsd_nat_target): New.
    	(mips_fbsd_fetch_inferior_registers)
    	(mips_fbsd_store_inferior_registers): Refactor as methods of
    	mips_fbsd_nat_target.
    	(_initialize_mips_fbsd_nat): Adjust to C++ification.  Use
    	add_target.
    	* mips-nbsd-nat.c (mips_nbsd_nat_target): New class.
    	(the_mips_nbsd_nat_target): New.
    	(mipsnbsd_fetch_inferior_registers)
    	(mipsnbsd_store_inferior_registers): Refactor as methods of
    	mips_nbsd_nat_target.
    	(_initialize_mipsnbsd_nat): Adjust to C++ification.
    	* mips64-obsd-nat.c (mips64_obsd_nat_target): New class.
    	(the_mips64_obsd_nat_target): New.
    	(mips64obsd_fetch_inferior_registers)
    	(mips64obsd_store_inferior_registers): Refactor as methods of
    	mips64_obsd_nat_target.
    	(_initialize_mips64obsd_nat): Adjust to C++ification.  Use
    	add_target.
    	* nbsd-nat.c (nbsd_pid_to_exec_file): Refactor as method of
    	nbsd_nat_target.
    	* nbsd-nat.h: Include "inf-ptrace.h".
    	(nbsd_nat_target): New class.
    	* obsd-nat.c (obsd_pid_to_str, obsd_update_thread_list)
    	(obsd_wait): Refactor as methods of obsd_nat_target.
    	(obsd_add_target): Delete.
    	* obsd-nat.h: Include "inf-ptrace.h".
    	(obsd_nat_target): New class.
    	* ppc-fbsd-nat.c (ppc_fbsd_nat_target): New class.
    	(the_ppc_fbsd_nat_target): New.
    	(ppcfbsd_fetch_inferior_registers)
    	(ppcfbsd_store_inferior_registers): Refactor as methods of
    	ppc_fbsd_nat_target.
    	(_initialize_ppcfbsd_nat): Adjust to C++ification.  Use
    	add_target.
    	* ppc-nbsd-nat.c (ppc_nbsd_nat_target): New class.
    	(the_ppc_nbsd_nat_target): New.
    	(ppcnbsd_fetch_inferior_registers)
    	(ppcnbsd_store_inferior_registers): Refactor as methods of
    	ppc_nbsd_nat_target.
    	(_initialize_ppcnbsd_nat): Adjust to C++ification.
    	* ppc-obsd-nat.c (ppc_obsd_nat_target): New class.
    	(the_ppc_obsd_nat_target): New.
    	(ppcobsd_fetch_registers, ppcobsd_store_registers): Refactor as
    	methods of ppc_obsd_nat_target.
    	(_initialize_ppcobsd_nat): Adjust to C++ification.  Use
    	add_target.
    	* sh-nbsd-nat.c (sh_nbsd_nat_target): New class.
    	(the_sh_nbsd_nat_target): New.
    	(shnbsd_fetch_inferior_registers)
    	(shnbsd_store_inferior_registers): Refactor as methods of
    	sh_nbsd_nat_target.
    	(_initialize_shnbsd_nat): Adjust to C++ification.
    	* sparc-nat.c (sparc_xfer_wcookie): Make extern.
    	(inf_ptrace_xfer_partial): Delete.
    	(sparc_xfer_partial, sparc_target): Delete.
    	* sparc-nat.h (sparc_fetch_inferior_registers)
    	(sparc_store_inferior_registers, sparc_xfer_wcookie): Declare.
    	(sparc_target): Delete function declaration.
    	(sparc_target): New template class.
    	* sparc-nbsd-nat.c (the_sparc_nbsd_nat_target): New.
    	(_initialize_sparcnbsd_nat): Adjust to C++ification.
    	* sparc64-fbsd-nat.c (the_sparc64_fbsd_nat_target): New.
    	(_initialize_sparc64fbsd_nat): Adjust to C++ification.  Use
    	add_target.
    	* sparc64-nbsd-nat.c (the_sparc64_nbsd_nat_target): New.
    	(_initialize_sparc64nbsd_nat): Adjust to C++ification.
    	* sparc64-obsd-nat.c (the_sparc64_obsd_nat_target): New.
    	(_initialize_sparc64obsd_nat): Adjust to C++ification.  Use
    	add_target.
    	* vax-bsd-nat.c (vax_bsd_nat_target): New class.
    	(the_vax_bsd_nat_target): New.
    	(vaxbsd_fetch_inferior_registers)
    	(vaxbsd_store_inferior_registers): Refactor as vax_bsd_nat_target
    	methods.
    	(_initialize_vaxbsd_nat): Adjust to C++ification.
    
    	* bsd-kvm.c (bsd_kvm_target): New class.
    	(bsd_kvm_ops): Now a bsd_kvm_target.
    	(bsd_kvm_open, bsd_kvm_close, bsd_kvm_xfer_partial)
    	(bsd_kvm_files_info, bsd_kvm_fetch_registers)
    	(bsd_kvm_thread_alive, bsd_kvm_pid_to_str): Refactor as methods of
    	bsd_kvm_target.
    	(bsd_kvm_return_one): Delete.
    	(bsd_kvm_add_target): Adjust to C++ification.
    
    	* nto-procfs.c (nto_procfs_target, nto_procfs_target_native)
    	(nto_procfs_target_procfs): New classes.
    	(procfs_open_1, procfs_thread_alive, procfs_update_thread_list)
    	(procfs_files_info, procfs_pid_to_exec_file, procfs_attach)
    	(procfs_post_attach, procfs_wait, procfs_fetch_registers)
    	(procfs_xfer_partial, procfs_detach, procfs_insert_breakpoint)
    	(procfs_remove_breakpoint, procfs_insert_hw_breakpoint)
    	(procfs_remove_hw_breakpoint, procfs_resume)
    	(procfs_mourn_inferior, procfs_create_inferior, procfs_interrupt)
    	(procfs_kill_inferior, procfs_store_registers)
    	(procfs_pass_signals, procfs_pid_to_str, procfs_can_run): Refactor
    	as methods of nto_procfs_target.
    	(nto_procfs_ops): Now an nto_procfs_target_procfs.
    	(nto_native_ops): Delete.
    	(procfs_open, procfs_native_open): Delete.
    	(nto_native_ops): Now an nto_procfs_target_native.
    	(init_procfs_targets): Adjust to C++ification.
    	(procfs_can_use_hw_breakpoint, procfs_remove_hw_watchpoint)
    	(procfs_insert_hw_watchpoint, procfs_stopped_by_watchpoint):
    	Refactor as methods of nto_procfs_target.
    
    	* go32-nat.c (go32_nat_target): New class.
    	(the_go32_nat_target): New.
    	(go32_attach, go32_resume, go32_wait, go32_fetch_registers)
    	(go32_store_registers, go32_xfer_partial, go32_files_info)
    	(go32_kill_inferior, go32_create_inferior, go32_mourn_inferior)
    	(go32_terminal_init, go32_terminal_info, go32_terminal_inferior)
    	(go32_terminal_ours, go32_pass_ctrlc, go32_thread_alive)
    	(go32_pid_to_str): Refactor as methods of go32_nat_target.
    	(go32_target): Delete.
    	(_initialize_go32_nat): Adjust to C++ification.
    
    	* gnu-nat.c (gnu_wait, gnu_resume, gnu_kill_inferior)
    	(gnu_mourn_inferior, gnu_create_inferior, gnu_attach, gnu_detach)
    	(gnu_stop, gnu_thread_alive, gnu_xfer_partial)
    	(gnu_find_memory_regions, gnu_pid_to_str): Refactor as methods of
    	gnu_nat_target.
    	(gnu_target): Delete.
    	* gnu-nat.h (gnu_target): Delete.
    	(gnu_nat_target): New class.
    	* i386-gnu-nat.c (gnu_base_target): New.
    	(i386_gnu_nat_target): New class.
    	(the_i386_gnu_nat_target): New.
    	(_initialize_i386gnu_nat): Adjust to C++ification.
    
    gdb/testsuite/ChangeLog:
    2018-05-02  Pedro Alves  <palves@redhat.com>
    
    	* gdb.base/breakpoint-in-ro-region.exp: Adjust to to_resume and
    	to_log_command renames.
    	* gdb.base/sss-bp-on-user-bp-2.exp: Likewise.

Diff:
---
 gdb/ChangeLog                                      | 1008 ++++
 gdb/aarch64-fbsd-nat.c                             |   27 +-
 gdb/aarch64-linux-nat.c                            |  177 +-
 gdb/aix-thread.c                                   |  161 +-
 gdb/alpha-bsd-nat.c                                |   25 +-
 gdb/alpha-linux-nat.c                              |   18 +-
 gdb/amd64-bsd-nat.c                                |   24 +-
 gdb/amd64-bsd-nat.h                                |   44 +
 gdb/amd64-fbsd-nat.c                               |   39 +-
 gdb/amd64-linux-nat.c                              |   33 +-
 gdb/amd64-nat.h                                    |    5 -
 gdb/amd64-nbsd-nat.c                               |   10 +-
 gdb/amd64-obsd-nat.c                               |    6 +-
 gdb/arm-fbsd-nat.c                                 |   35 +-
 gdb/arm-linux-nat.c                                |  138 +-
 gdb/arm-nbsd-nat.c                                 |   27 +-
 gdb/auxv.c                                         |   13 +-
 gdb/auxv.h                                         |    3 +-
 gdb/avr-tdep.c                                     |    4 +-
 gdb/bfd-target.c                                   |  104 +-
 gdb/breakpoint.c                                   |    7 +-
 gdb/bsd-kvm.c                                      |  103 +-
 gdb/bsd-uthread.c                                  |  137 +-
 gdb/corefile.c                                     |   12 +-
 gdb/corelow.c                                      |  202 +-
 gdb/ctf.c                                          |  103 +-
 gdb/darwin-nat.c                                   |  142 +-
 gdb/darwin-nat.h                                   |   46 +-
 gdb/elfread.c                                      |   10 +-
 gdb/eval.c                                         |    2 +-
 gdb/exceptions.c                                   |    6 +-
 gdb/exec.c                                         |  139 +-
 gdb/fbsd-nat.c                                     |  234 +-
 gdb/fbsd-nat.h                                     |   79 +-
 gdb/frame.c                                        |    2 +-
 gdb/gdbarch-selftests.c                            |    4 +-
 gdb/gdbcore.h                                      |    6 +-
 gdb/gnu-nat.c                                      |  101 +-
 gdb/gnu-nat.h                                      |   34 +-
 gdb/gnu-v3-abi.c                                   |    2 +-
 gdb/go32-nat.c                                     |  181 +-
 gdb/hppa-linux-nat.c                               |   33 +-
 gdb/hppa-nbsd-nat.c                                |   30 +-
 gdb/hppa-obsd-nat.c                                |   25 +-
 gdb/i386-bsd-nat.c                                 |   24 +-
 gdb/i386-bsd-nat.h                                 |   22 +-
 gdb/i386-darwin-nat.c                              |   28 +-
 gdb/i386-fbsd-nat.c                                |   51 +-
 gdb/i386-gnu-nat.c                                 |   29 +-
 gdb/i386-linux-nat.c                               |   42 +-
 gdb/i386-nbsd-nat.c                                |    9 +-
 gdb/i386-obsd-nat.c                                |    5 +-
 gdb/ia64-linux-nat.c                               |  134 +-
 gdb/ia64-tdep.c                                    |    2 +-
 gdb/ia64-vms-tdep.c                                |    2 +-
 gdb/inf-child.c                                    |  295 +-
 gdb/inf-child.h                                    |  113 +-
 gdb/inf-ptrace.c                                   |  142 +-
 gdb/inf-ptrace.h                                   |   67 +-
 gdb/infcall.c                                      |    4 +-
 gdb/infcmd.c                                       |   36 +-
 gdb/infrun.c                                       |   12 +-
 gdb/linespec.c                                     |    2 +-
 gdb/linux-nat-trad.c                               |   54 +-
 gdb/linux-nat-trad.h                               |   24 +-
 gdb/linux-nat.c                                    |  480 +-
 gdb/linux-nat.h                                    |  141 +-
 gdb/linux-tdep.c                                   |   18 +-
 gdb/linux-thread-db.c                              |  155 +-
 gdb/m32r-linux-nat.c                               |   30 +-
 gdb/m68k-bsd-nat.c                                 |   25 +-
 gdb/m68k-linux-nat.c                               |   33 +-
 gdb/make-target-delegates                          |  205 +-
 gdb/mi/mi-main.c                                   |   13 +-
 gdb/minsyms.c                                      |    2 +-
 gdb/mips-fbsd-nat.c                                |   25 +-
 gdb/mips-linux-nat.c                               |  176 +-
 gdb/mips-nbsd-nat.c                                |   25 +-
 gdb/mips64-obsd-nat.c                              |   23 +-
 gdb/nbsd-nat.c                                     |    2 +-
 gdb/nbsd-nat.h                                     |   10 +-
 gdb/nto-procfs.c                                   |  332 +-
 gdb/obsd-nat.c                                     |   32 +-
 gdb/obsd-nat.h                                     |   10 +-
 gdb/ppc-fbsd-nat.c                                 |   26 +-
 gdb/ppc-linux-nat.c                                |  195 +-
 gdb/ppc-linux-tdep.c                               |   10 +-
 gdb/ppc-nbsd-nat.c                                 |   26 +-
 gdb/ppc-obsd-nat.c                                 |   26 +-
 gdb/procfs.c                                       |  306 +-
 gdb/ravenscar-thread.c                             |  230 +-
 gdb/record-btrace.c                                |  557 +--
 gdb/record-full.c                                  |  596 +--
 gdb/record.c                                       |   18 +-
 gdb/regcache.c                                     |   64 +-
 gdb/remote-sim.c                                   |  220 +-
 gdb/remote.c                                       | 1331 +++---
 gdb/rs6000-nat.c                                   |   95 +-
 gdb/rs6000-tdep.c                                  |    2 +-
 gdb/s390-linux-nat.c                               |  124 +-
 gdb/s390-tdep.c                                    |    2 +-
 gdb/sh-nbsd-nat.c                                  |   24 +-
 gdb/sol-thread.c                                   |  165 +-
 gdb/solib-aix.c                                    |    2 +-
 gdb/solib-darwin.c                                 |    2 +-
 gdb/solib-dsbt.c                                   |    4 +-
 gdb/solib-spu.c                                    |    6 +-
 gdb/solib-svr4.c                                   |   18 +-
 gdb/solib-target.c                                 |    2 +-
 gdb/sparc-linux-nat.c                              |   25 +-
 gdb/sparc-nat.c                                    |   39 +-
 gdb/sparc-nat.h                                    |   41 +-
 gdb/sparc-nbsd-nat.c                               |    5 +-
 gdb/sparc-tdep.c                                   |    2 +-
 gdb/sparc64-fbsd-nat.c                             |    7 +-
 gdb/sparc64-linux-nat.c                            |   25 +-
 gdb/sparc64-nbsd-nat.c                             |    6 +-
 gdb/sparc64-obsd-nat.c                             |    5 +-
 gdb/sparc64-tdep.c                                 |    4 +-
 gdb/spu-linux-nat.c                                |   78 +-
 gdb/spu-multiarch.c                                |  163 +-
 gdb/spu-tdep.c                                     |   30 +-
 gdb/symfile.c                                      |    2 +-
 gdb/symtab.c                                       |    2 +-
 gdb/target-debug.h                                 |    6 +
 gdb/target-delegates.c                             | 5036 +++++++++-----------
 gdb/target-descriptions.c                          |    4 +-
 gdb/target-memory.c                                |    4 +-
 gdb/target.c                                       |  846 ++--
 gdb/target.h                                       |  830 ++--
 gdb/testsuite/ChangeLog                            |    6 +
 gdb/testsuite/gdb.base/breakpoint-in-ro-region.exp |    4 +-
 gdb/testsuite/gdb.base/sss-bp-on-user-bp-2.exp     |    4 +-
 gdb/tilegx-linux-nat.c                             |   35 +-
 gdb/tracefile-tfile.c                              |  120 +-
 gdb/tracefile.c                                    |   38 +-
 gdb/tracefile.h                                    |   16 +-
 gdb/tracepoint.c                                   |    2 +-
 gdb/valops.c                                       |    4 +-
 gdb/valprint.c                                     |    2 +-
 gdb/value.c                                        |    2 +-
 gdb/vax-bsd-nat.c                                  |   25 +-
 gdb/windows-nat.c                                  |  216 +-
 gdb/windows-tdep.c                                 |    2 +-
 gdb/x86-bsd-nat.c                                  |   27 +-
 gdb/x86-bsd-nat.h                                  |   21 +-
 gdb/x86-linux-nat.c                                |   80 +-
 gdb/x86-linux-nat.h                                |   44 +-
 gdb/x86-nat.c                                      |   64 +-
 gdb/x86-nat.h                                      |   79 +-
 gdb/xtensa-linux-nat.c                             |   33 +-
 151 files changed, 9667 insertions(+), 8743 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 2faf82d..5b79d6f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,4 +1,1012 @@
 2018-05-02  Pedro Alves  <palves@redhat.com>
+	    John Baldwin  <jhb@freebsd.org>
+
+	* target.h (enum strata) <debug_stratum>: New.
+	(struct target_ops) <all delegation methods>: Replace by C++
+	virtual methods, and drop "to_" prefix.  All references updated
+	throughout.
+	<to_shortname, to_longname, to_doc, to_data,
+	to_have_steppable_watchpoint, to_have_continuable_watchpoint,
+	to_has_thread_control, to_attach_no_wait>: Delete, replaced by
+	virtual methods.  All references updated throughout.
+	<can_attach, supports_terminal_ours, can_create_inferior,
+	get_thread_control_capabilities, attach_no_wait>: New
+	virtual methods.
+	<insert_breakpoint, remove_breakpoint>: Now
+	TARGET_DEFAULT_NORETURN methods.
+	<info_proc>: Now returns bool.
+	<to_magic>: Delete.
+	(OPS_MAGIC): Delete.
+	(current_target): Delete.  All references replaced by references
+	to ...
+	(target_stack): ... this.  New.
+	(target_shortname, target_longname): Adjust.
+	(target_can_run): Now a function declaration.
+	(default_child_has_all_memory, default_child_has_memory)
+	(default_child_has_stack, default_child_has_registers)
+	(default_child_has_execution): Remove target_ops parameter.
+	(complete_target_initialization): Delete.
+	(memory_breakpoint_target): New template class.
+	(test_target_ops): Refactor as a C++ class with virtual methods.
+	* make-target-delegates (NAME_PART): Tighten.
+	(POINTER_PART, CP_SYMBOL): New.
+	(SIMPLE_RETURN_PART): Reimplement.
+	(VEC_RETURN_PART): Expect less.
+	(RETURN_PART, VIRTUAL_PART): New.
+	(METHOD): Adjust to C++ virtual methods.
+	(scan_target_h): Remove reference to C99.
+	(dname): Output "target_ops::" prefix.
+	(write_function_header): Adjust to output a C++ class method.
+	(write_declaration): New.
+	(write_delegator): Adjust to output a C++ class method.
+	(tdname): Output "dummy_target::" prefix.
+	(write_tdefault, write_debugmethod): Adjust to output a C++ class
+	method.
+	(tdefault_names, debug_names): Delete.
+	(return_types, tdefaults, styles, argtypes_array): New.
+	(top level): All methods are delegators.
+	(print_class): New.
+	(top level): Print dummy_target and debug_target classes.
+	* target-delegates.c: Regenerate.
+	* target-debug.h (target_debug_print_enum_info_proc_what)
+	(target_debug_print_thread_control_capabilities)
+	(target_debug_print_thread_info_p): New.
+	* target.c (dummy_target): Delete.
+	(the_dummy_target, the_debug_target): New.
+	(target_stack): Now extern.
+	(set_targetdebug): Push/unpush debug target.
+	(default_child_has_all_memory, default_child_has_memory)
+	(default_child_has_stack, default_child_has_registers)
+	(default_child_has_execution): Remove target_ops parameter.
+	(complete_target_initialization): Delete.
+	(add_target_with_completer): No longer call
+	complete_target_initialization.
+	(target_supports_terminal_ours): Use regular delegation.
+	(update_current_target): Delete.
+	(push_target): No longer check magic number.  Don't call
+	update_current_target.
+	(unpush_target): Don't call update_current_target.
+	(target_is_pushed): No longer check magic number.
+	(target_require_runnable): Skip for all stratums over
+	process_stratum.
+	(target_ops::info_proc): New.
+	(target_info_proc): Use find_target_at and
+	find_default_run_target.
+	(target_supports_disable_randomization): Use regular delegation.
+	(target_get_osdata): Use find_target_at.
+	(target_ops::open, target_ops::close, target_ops::can_attach)
+	(target_ops::attach, target_ops::can_create_inferior)
+	(target_ops::create_inferior, target_ops::can_run)
+	(target_can_run): New.
+	(default_fileio_target): Use regular delegation.
+	(target_ops::fileio_open, target_ops::fileio_pwrite)
+	(target_ops::fileio_pread, target_ops::fileio_fstat)
+	(target_ops::fileio_close, target_ops::fileio_unlink)
+	(target_ops::fileio_readlink): New.
+	(target_fileio_open_1, target_fileio_unlink)
+	(target_fileio_readlink): Always call the target method.  Handle
+	FILEIO_ENOSYS.
+	(return_zero, return_zero_has_execution): Delete.
+	(init_dummy_target): Delete.
+	(dummy_target::dummy_target, dummy_target::shortname)
+	(dummy_target::longname, dummy_target::doc)
+	(debug_target::debug_target, debug_target::shortname)
+	(debug_target::longname, debug_target::doc): New.
+	(target_supports_delete_record): Use regular delegation.
+	(setup_target_debug): Delete.
+	(maintenance_print_target_stack): Skip debug_stratum.
+	(initialize_targets): Instantiate the_dummy_target and
+	the_debug_target.
+	* auxv.c (target_auxv_parse): Remove 'ops' parameter.  Adjust to
+	use target_stack.
+	(target_auxv_search, fprint_target_auxv): Adjust.
+	(info_auxv_command): Adjust to use target_stack.
+	* auxv.h (target_auxv_parse): Remove 'ops' parameter.
+	* exceptions.c (print_flush): Handle a NULL target_stack.
+	* regcache.c (target_ops_no_register): Refactor as class with
+	virtual methods.
+
+	* exec.c (exec_target): New class.
+	(exec_ops): Now an exec_target.
+	(exec_open, exec_close_1, exec_get_section_table)
+	(exec_xfer_partial, exec_files_info, exec_has_memory)
+	(exec_make_note_section): Refactor as exec_target methods.
+	(exec_file_clear, ignore, exec_remove_breakpoint, init_exec_ops):
+	Delete.
+	(exec_target::find_memory_regions): New.
+	(_initialize_exec): Don't call init_exec_ops.
+	* gdbcore.h (exec_file_clear): Delete.
+
+	* corefile.c (core_target): Delete.
+	(core_file_command): Adjust.
+	* corelow.c (core_target): New class.
+	(the_core_target): New.
+	(core_close): Remove target_ops parameter.
+	(core_close_cleanup): Adjust.
+	(core_target::close): New.
+	(core_open, core_detach, get_core_registers, core_files_info)
+	(core_xfer_partial, core_thread_alive, core_read_description)
+	(core_pid_to_str, core_thread_name, core_has_memory)
+	(core_has_stack, core_has_registers, core_info_proc): Rework as
+	core_target methods.
+	(ignore, core_remove_breakpoint, init_core_ops): Delete.
+	(_initialize_corelow): Initialize the_core_target.
+	* gdbcore.h (core_target): Delete.
+	(the_core_target): New.
+
+	* ctf.c: (ctf_target): New class.
+	(ctf_ops): Now a ctf_target.
+	(ctf_open, ctf_close, ctf_files_info, ctf_fetch_registers)
+	(ctf_xfer_partial, ctf_get_trace_state_variable_value)
+	(ctf_trace_find, ctf_traceframe_info): Refactor as ctf_target
+	methods.
+	(init_ctf_ops): Delete.
+	(_initialize_ctf): Don't call it.
+	* tracefile-tfile.c (tfile_target): New class.
+	(tfile_ops): Now a tfile_target.
+	(tfile_open, tfile_close, tfile_files_info)
+	(tfile_get_tracepoint_status, tfile_trace_find)
+	(tfile_fetch_registers, tfile_xfer_partial)
+	(tfile_get_trace_state_variable_value, tfile_traceframe_info):
+	Refactor as tfile_target methods.
+	(tfile_xfer_partial_features): Remove target_ops parameter.
+	(init_tfile_ops): Delete.
+	(_initialize_tracefile_tfile): Don't call it.
+	* tracefile.c (tracefile_has_all_memory, tracefile_has_memory)
+	(tracefile_has_stack, tracefile_has_registers)
+	(tracefile_thread_alive, tracefile_get_trace_status): Refactor as
+	tracefile_target methods.
+	(init_tracefile_ops): Delete.
+	(tracefile_target::tracefile_target): New.
+	* tracefile.h: Include "target.h".
+	(tracefile_target): New class.
+	(init_tracefile_ops): Delete.
+
+	* spu-multiarch.c (spu_multiarch_target): New class.
+	(spu_ops): Now a spu_multiarch_target.
+	(spu_thread_architecture, spu_region_ok_for_hw_watchpoint)
+	(spu_fetch_registers, spu_store_registers, spu_xfer_partial)
+	(spu_search_memory, spu_mourn_inferior): Refactor as
+	spu_multiarch_target methods.
+	(init_spu_ops): Delete.
+	(_initialize_spu_multiarch): Remove references to init_spu_ops,
+	complete_target_initialization.
+
+	* ravenscar-thread.c (ravenscar_thread_target): New class.
+	(ravenscar_ops): Now a ravenscar_thread_target.
+	(ravenscar_resume, ravenscar_wait, ravenscar_update_thread_list)
+	(ravenscar_thread_alive, ravenscar_pid_to_str)
+	(ravenscar_fetch_registers, ravenscar_store_registers)
+	(ravenscar_prepare_to_store, ravenscar_stopped_by_sw_breakpoint)
+	(ravenscar_stopped_by_hw_breakpoint)
+	(ravenscar_stopped_by_watchpoint, ravenscar_stopped_data_address)
+	(ravenscar_mourn_inferior, ravenscar_core_of_thread)
+	(ravenscar_get_ada_task_ptid): Refactor as ravenscar_thread_target
+	methods.
+	(init_ravenscar_thread_ops): Delete.
+	(_initialize_ravenscar): Remove references to
+	init_ravenscar_thread_ops and complete_target_initialization.
+
+	* bsd-uthread.c (bsd_uthread_ops_hack): Delete.
+	(bsd_uthread_target): New class.
+	(bsd_uthread_ops): Now a bsd_uthread_target.
+	(bsd_uthread_activate): Adjust to refer to bsd_uthread_ops.
+	(bsd_uthread_close, bsd_uthread_mourn_inferior)
+	(bsd_uthread_fetch_registers, bsd_uthread_store_registers)
+	(bsd_uthread_wait, bsd_uthread_resume, bsd_uthread_thread_alive)
+	(bsd_uthread_update_thread_list, bsd_uthread_extra_thread_info)
+	(bsd_uthread_pid_to_str): Refactor as bsd_uthread_target methods.
+	(bsd_uthread_target): Delete function.
+	(_initialize_bsd_uthread): Remove reference to
+	complete_target_initialization.
+
+	* bfd-target.c (target_bfd_data): Delete.  Fields folded into ...
+	(target_bfd): ... this new class.
+	(target_bfd_xfer_partial, target_bfd_get_section_table)
+	(target_bfd_close): Refactor as target_bfd methods.
+	(target_bfd::~target_bfd): New.
+	(target_bfd_reopen): Adjust.
+	(target_bfd::close): New.
+
+	* record-btrace.c (record_btrace_target): New class.
+	(record_btrace_ops): Now a record_btrace_target.
+	(record_btrace_open, record_btrace_stop_recording)
+	(record_btrace_disconnect, record_btrace_close)
+	(record_btrace_async, record_btrace_info)
+	(record_btrace_insn_history, record_btrace_insn_history_range)
+	(record_btrace_insn_history_from, record_btrace_call_history)
+	(record_btrace_call_history_range)
+	(record_btrace_call_history_from, record_btrace_record_method)
+	(record_btrace_is_replaying, record_btrace_will_replay)
+	(record_btrace_xfer_partial, record_btrace_insert_breakpoint)
+	(record_btrace_remove_breakpoint, record_btrace_fetch_registers)
+	(record_btrace_store_registers, record_btrace_prepare_to_store)
+	(record_btrace_to_get_unwinder)
+	(record_btrace_to_get_tailcall_unwinder, record_btrace_resume)
+	(record_btrace_commit_resume, record_btrace_wait)
+	(record_btrace_stop, record_btrace_can_execute_reverse)
+	(record_btrace_stopped_by_sw_breakpoint)
+	(record_btrace_supports_stopped_by_sw_breakpoint)
+	(record_btrace_stopped_by_hw_breakpoint)
+	(record_btrace_supports_stopped_by_hw_breakpoint)
+	(record_btrace_update_thread_list, record_btrace_thread_alive)
+	(record_btrace_goto_begin, record_btrace_goto_end)
+	(record_btrace_goto, record_btrace_stop_replaying_all)
+	(record_btrace_execution_direction)
+	(record_btrace_prepare_to_generate_core)
+	(record_btrace_done_generating_core): Refactor as
+	record_btrace_target methods.
+	(init_record_btrace_ops): Delete.
+	(_initialize_record_btrace): Remove reference to
+	init_record_btrace_ops.
+	* record-full.c (RECORD_FULL_IS_REPLAY): Adjust to always refer to
+	the execution_direction global.
+	(record_full_base_target, record_full_target)
+	(record_full_core_target): New classes.
+	(record_full_ops): Now a record_full_target.
+	(record_full_core_ops): Now a record_full_core_target.
+	(record_full_target::detach, record_full_target::disconnect)
+	(record_full_core_target::disconnect)
+	(record_full_target::mourn_inferior, record_full_target::kill):
+	New.
+	(record_full_open, record_full_close, record_full_async): Refactor
+	as methods of the record_full_base_target class.
+	(record_full_resume, record_full_commit_resume): Refactor
+	as methods of the record_full_target class.
+	(record_full_wait, record_full_stopped_by_watchpoint)
+	(record_full_stopped_data_address)
+	(record_full_stopped_by_sw_breakpoint)
+	(record_full_supports_stopped_by_sw_breakpoint)
+	(record_full_stopped_by_hw_breakpoint)
+	(record_full_supports_stopped_by_hw_breakpoint): Refactor as
+	methods of the record_full_base_target class.
+	(record_full_store_registers, record_full_xfer_partial)
+	(record_full_insert_breakpoint, record_full_remove_breakpoint):
+	Refactor as methods of the record_full_target class.
+	(record_full_can_execute_reverse, record_full_get_bookmark)
+	(record_full_goto_bookmark, record_full_execution_direction)
+	(record_full_record_method, record_full_info, record_full_delete)
+	(record_full_is_replaying, record_full_will_replay)
+	(record_full_goto_begin, record_full_goto_end, record_full_goto)
+	(record_full_stop_replaying): Refactor as methods of the
+	record_full_base_target class.
+	(record_full_core_resume, record_full_core_kill)
+	(record_full_core_fetch_registers)
+	(record_full_core_prepare_to_store)
+	(record_full_core_store_registers, record_full_core_xfer_partial)
+	(record_full_core_insert_breakpoint)
+	(record_full_core_remove_breakpoint)
+	(record_full_core_has_execution): Refactor
+	as methods of the record_full_core_target class.
+	(record_full_base_target::supports_delete_record): New.
+	(init_record_full_ops): Delete.
+	(init_record_full_core_ops): Delete.
+	(record_full_save): Refactor as method of the
+	record_full_base_target class.
+	(_initialize_record_full): Remove references to
+	init_record_full_ops and init_record_full_core_ops.
+
+	* remote.c (remote_target, extended_remote_target): New classes.
+	(remote_ops): Now a remote_target.
+	(extended_remote_ops): Now an extended_remote_target.
+	(remote_insert_fork_catchpoint, remote_remove_fork_catchpoint)
+	(remote_insert_vfork_catchpoint, remote_remove_vfork_catchpoint)
+	(remote_insert_exec_catchpoint, remote_remove_exec_catchpoint)
+	(remote_pass_signals, remote_set_syscall_catchpoint)
+	(remote_program_signals, )
+	(remote_thread_always_alive): Remove target_ops parameter.
+	(remote_thread_alive, remote_thread_name)
+	(remote_update_thread_list, remote_threads_extra_info)
+	(remote_static_tracepoint_marker_at)
+	(remote_static_tracepoint_markers_by_strid)
+	(remote_get_ada_task_ptid, remote_close, remote_start_remote)
+	(remote_open): Refactor as methods of remote_target.
+	(extended_remote_open, extended_remote_detach)
+	(extended_remote_attach, extended_remote_post_attach):
+	(extended_remote_supports_disable_randomization)
+	(extended_remote_create_inferior): : Refactor as method of
+	extended_remote_target.
+	(remote_set_permissions, remote_open_1, remote_detach)
+	(remote_follow_fork, remote_follow_exec, remote_disconnect)
+	(remote_resume, remote_commit_resume, remote_stop)
+	(remote_interrupt, remote_pass_ctrlc, remote_terminal_inferior)
+	(remote_terminal_ours, remote_wait, remote_fetch_registers)
+	(remote_prepare_to_store, remote_store_registers)
+	(remote_flash_erase, remote_flash_done, remote_files_info)
+	(remote_kill, remote_mourn, remote_insert_breakpoint)
+	(remote_remove_breakpoint, remote_insert_watchpoint)
+	(remote_watchpoint_addr_within_range)
+	(remote_remove_watchpoint, remote_region_ok_for_hw_watchpoint)
+	(remote_check_watch_resources, remote_stopped_by_sw_breakpoint)
+	(remote_supports_stopped_by_sw_breakpoint)
+	(remote_stopped_by_hw_breakpoint)
+	(remote_supports_stopped_by_hw_breakpoint)
+	(remote_stopped_by_watchpoint, remote_stopped_data_address)
+	(remote_insert_hw_breakpoint, remote_remove_hw_breakpoint)
+	(remote_verify_memory): Refactor as methods of remote_target.
+	(remote_write_qxfer, remote_read_qxfer): Remove target_ops
+	parameter.
+	(remote_xfer_partial, remote_get_memory_xfer_limit)
+	(remote_search_memory, remote_rcmd, remote_memory_map)
+	(remote_pid_to_str, remote_get_thread_local_address)
+	(remote_get_tib_address, remote_read_description): Refactor as
+	methods of remote_target.
+	(remote_target::fileio_open, remote_target::fileio_pwrite)
+	(remote_target::fileio_pread, remote_target::fileio_close): New.
+	(remote_hostio_readlink, remote_hostio_fstat)
+	(remote_filesystem_is_local, remote_can_execute_reverse)
+	(remote_supports_non_stop, remote_supports_disable_randomization)
+	(remote_supports_multi_process, remote_supports_cond_breakpoints)
+	(remote_supports_enable_disable_tracepoint)
+	(remote_supports_string_tracing)
+	(remote_can_run_breakpoint_commands, remote_trace_init)
+	(remote_download_tracepoint, remote_can_download_tracepoint)
+	(remote_download_trace_state_variable, remote_enable_tracepoint)
+	(remote_disable_tracepoint, remote_trace_set_readonly_regions)
+	(remote_trace_start, remote_get_trace_status)
+	(remote_get_tracepoint_status, remote_trace_stop)
+	(remote_trace_find, remote_get_trace_state_variable_value)
+	(remote_save_trace_data, remote_get_raw_trace_data)
+	(remote_set_disconnected_tracing, remote_core_of_thread)
+	(remote_set_circular_trace_buffer, remote_traceframe_info)
+	(remote_get_min_fast_tracepoint_insn_len)
+	(remote_set_trace_buffer_size, remote_set_trace_notes)
+	(remote_use_agent, remote_can_use_agent, remote_enable_btrace)
+	(remote_disable_btrace, remote_teardown_btrace)
+	(remote_read_btrace, remote_btrace_conf)
+	(remote_augmented_libraries_svr4_read, remote_load)
+	(remote_pid_to_exec_file, remote_can_do_single_step)
+	(remote_execution_direction, remote_thread_handle_to_thread_info):
+	Refactor as methods of remote_target.
+	(init_remote_ops, init_extended_remote_ops): Delete.
+	(remote_can_async_p, remote_is_async_p, remote_async)
+	(remote_thread_events, remote_upload_tracepoints)
+	(remote_upload_trace_state_variables): Refactor as methods of
+	remote_target.
+	(_initialize_remote): Remove references to init_remote_ops and
+	init_extended_remote_ops.
+
+	* remote-sim.c (gdbsim_target): New class.
+	(gdbsim_fetch_register, gdbsim_store_register, gdbsim_kill)
+	(gdbsim_load, gdbsim_create_inferior, gdbsim_open, gdbsim_close)
+	(gdbsim_detach, gdbsim_resume, gdbsim_interrupt)
+	(gdbsim_wait, gdbsim_prepare_to_store, gdbsim_xfer_partial)
+	(gdbsim_files_info, gdbsim_mourn_inferior, gdbsim_thread_alive)
+	(gdbsim_pid_to_str, gdbsim_has_all_memory, gdbsim_has_memory):
+	Refactor as methods of gdbsim_target.
+	(gdbsim_ops): Now a gdbsim_target.
+	(init_gdbsim_ops): Delete.
+	(gdbsim_cntrl_c): Adjust.
+	(_initialize_remote_sim): Remove reference to init_gdbsim_ops.
+
+	* amd64-linux-nat.c (amd64_linux_nat_target): New class.
+	(the_amd64_linux_nat_target): New.
+	(amd64_linux_fetch_inferior_registers)
+	(amd64_linux_store_inferior_registers): Refactor as methods of
+	amd64_linux_nat_target.
+	(_initialize_amd64_linux_nat): Adjust.  Set linux_target.
+	* i386-linux-nat.c: Don't include "linux-nat.h".
+	(i386_linux_nat_target): New class.
+	(the_i386_linux_nat_target): New.
+	(i386_linux_fetch_inferior_registers)
+	(i386_linux_store_inferior_registers, i386_linux_resume): Refactor
+	as methods of i386_linux_nat_target.
+	(_initialize_i386_linux_nat): Adjust.  Set linux_target.
+	* inf-child.c (inf_child_ops): Delete.
+	(inf_child_fetch_inferior_registers)
+	(inf_child_store_inferior_registers): Delete.
+	(inf_child_post_attach, inf_child_prepare_to_store): Refactor as
+	methods of inf_child_target.
+	(inf_child_target::supports_terminal_ours)
+	(inf_child_target::terminal_init)
+	(inf_child_target::terminal_inferior)
+	(inf_child_target::terminal_ours_for_output)
+	(inf_child_target::terminal_ours, inf_child_target::interrupt)
+	(inf_child_target::pass_ctrlc, inf_child_target::terminal_info):
+	New.
+	(inf_child_open, inf_child_disconnect, inf_child_close)
+	(inf_child_mourn_inferior, inf_child_maybe_unpush_target)
+	(inf_child_post_startup_inferior, inf_child_can_run)
+	(inf_child_pid_to_exec_file): Refactor as methods of
+	inf_child_target.
+	(inf_child_follow_fork): Delete.
+	(inf_child_target::can_create_inferior)
+	(inf_child_target::can_attach): New.
+	(inf_child_target::has_all_memory, inf_child_target::has_memory)
+	(inf_child_target::has_stack, inf_child_target::has_registers)
+	(inf_child_target::has_execution): New.
+	(inf_child_fileio_open, inf_child_fileio_pwrite)
+	(inf_child_fileio_pread, inf_child_fileio_fstat)
+	(inf_child_fileio_close, inf_child_fileio_unlink)
+	(inf_child_fileio_readlink, inf_child_use_agent)
+	(inf_child_can_use_agent): Refactor as methods of
+	inf_child_target.
+	(return_zero, inf_child_target): Delete.
+	(inf_child_target::inf_child_target): New.
+	* inf-child.h: Include "target.h".
+	(inf_child_target): Delete function prototype.
+	(inf_child_target): New class.
+	(inf_child_open_target, inf_child_mourn_inferior)
+	(inf_child_maybe_unpush_target): Delete.
+	* inf-ptrace.c (inf_ptrace_target::~inf_ptrace_target): New.
+	(inf_ptrace_follow_fork, inf_ptrace_insert_fork_catchpoint)
+	(inf_ptrace_remove_fork_catchpoint, inf_ptrace_create_inferior)
+	(inf_ptrace_post_startup_inferior, inf_ptrace_mourn_inferior)
+	(inf_ptrace_attach, inf_ptrace_post_attach, inf_ptrace_detach)
+	(inf_ptrace_detach_success, inf_ptrace_kill, inf_ptrace_resume)
+	(inf_ptrace_wait, inf_ptrace_xfer_partial)
+	(inf_ptrace_thread_alive, inf_ptrace_files_info)
+	(inf_ptrace_pid_to_str, inf_ptrace_auxv_parse): Refactor as
+	methods of inf_ptrace_target.
+	(inf_ptrace_target): Delete function.
+	* inf-ptrace.h: Include "inf-child.h".
+	(inf_ptrace_target): Delete function declaration.
+	(inf_ptrace_target): New class.
+	(inf_ptrace_trad_target, inf_ptrace_detach_success): Delete.
+	* linux-nat.c (linux_target): New.
+	(linux_ops, linux_ops_saved, super_xfer_partial): Delete.
+	(linux_nat_target::~linux_nat_target): New.
+	(linux_child_post_attach, linux_child_post_startup_inferior)
+	(linux_child_follow_fork, linux_child_insert_fork_catchpoint)
+	(linux_child_remove_fork_catchpoint)
+	(linux_child_insert_vfork_catchpoint)
+	(linux_child_remove_vfork_catchpoint)
+	(linux_child_insert_exec_catchpoint)
+	(linux_child_remove_exec_catchpoint)
+	(linux_child_set_syscall_catchpoint, linux_nat_pass_signals)
+	(linux_nat_create_inferior, linux_nat_attach, linux_nat_detach)
+	(linux_nat_resume, linux_nat_stopped_by_watchpoint)
+	(linux_nat_stopped_data_address)
+	(linux_nat_stopped_by_sw_breakpoint)
+	(linux_nat_supports_stopped_by_sw_breakpoint)
+	(linux_nat_stopped_by_hw_breakpoint)
+	(linux_nat_supports_stopped_by_hw_breakpoint, linux_nat_wait)
+	(linux_nat_kill, linux_nat_mourn_inferior)
+	(linux_nat_xfer_partial, linux_nat_thread_alive)
+	(linux_nat_update_thread_list, linux_nat_pid_to_str)
+	(linux_nat_thread_name, linux_child_pid_to_exec_file)
+	(linux_child_static_tracepoint_markers_by_strid)
+	(linux_nat_is_async_p, linux_nat_can_async_p)
+	(linux_nat_supports_non_stop, linux_nat_always_non_stop_p)
+	(linux_nat_supports_multi_process)
+	(linux_nat_supports_disable_randomization, linux_nat_async)
+	(linux_nat_stop, linux_nat_close, linux_nat_thread_address_space)
+	(linux_nat_core_of_thread, linux_nat_filesystem_is_local)
+	(linux_nat_fileio_open, linux_nat_fileio_readlink)
+	(linux_nat_fileio_unlink, linux_nat_thread_events): Refactor as
+	methods of linux_nat_target.
+	(linux_nat_wait_1, linux_xfer_siginfo, linux_proc_xfer_partial)
+	(linux_proc_xfer_spu, linux_nat_xfer_osdata): Remove target_ops
+	parameter.
+	(check_stopped_by_watchpoint): Adjust.
+	(linux_xfer_partial): Delete.
+	(linux_target_install_ops, linux_target, linux_nat_add_target):
+	Delete.
+	(linux_nat_target::linux_nat_target): New.
+	* linux-nat.h: Include "inf-ptrace.h".
+	(linux_nat_target): New.
+	(linux_target, linux_target_install_ops, linux_nat_add_target):
+	Delete function declarations.
+	(linux_target): Declare global.
+	* linux-thread-db.c (thread_db_target): New.
+	(thread_db_target::thread_db_target): New.
+	(thread_db_ops): Delete.
+	(the_thread_db_target): New.
+	(thread_db_detach, thread_db_wait, thread_db_mourn_inferior)
+	(thread_db_update_thread_list, thread_db_pid_to_str)
+	(thread_db_extra_thread_info)
+	(thread_db_thread_handle_to_thread_info)
+	(thread_db_get_thread_local_address, thread_db_get_ada_task_ptid)
+	(thread_db_resume): Refactor as methods of thread_db_target.
+	(init_thread_db_ops): Delete.
+	(_initialize_thread_db): Remove reference to init_thread_db_ops.
+	* x86-linux-nat.c: Don't include "linux-nat.h".
+	(super_post_startup_inferior): Delete.
+	(x86_linux_nat_target::~x86_linux_nat_target): New.
+	(x86_linux_child_post_startup_inferior)
+	(x86_linux_read_description, x86_linux_enable_btrace)
+	(x86_linux_disable_btrace, x86_linux_teardown_btrace)
+	(x86_linux_read_btrace, x86_linux_btrace_conf): Refactor as
+	methods of x86_linux_nat_target.
+	(x86_linux_create_target): Delete.  Bits folded ...
+	(x86_linux_add_target): ... here.  Now takes a linux_nat_target
+	pointer.
+	* x86-linux-nat.h: Include "linux-nat.h" and "x86-nat.h".
+	(x86_linux_nat_target): New class.
+	(x86_linux_create_target): Delete.
+	(x86_linux_add_target): Now takes a linux_nat_target pointer.
+	* x86-nat.c (x86_insert_watchpoint, x86_remove_watchpoint)
+	(x86_region_ok_for_watchpoint, x86_stopped_data_address)
+	(x86_stopped_by_watchpoint, x86_insert_hw_breakpoint)
+	(x86_remove_hw_breakpoint, x86_can_use_hw_breakpoint)
+	(x86_stopped_by_hw_breakpoint): Remove target_ops parameter and
+	make extern.
+	(x86_use_watchpoints): Delete.
+	* x86-nat.h: Include "breakpoint.h" and "target.h".
+	(x86_use_watchpoints): Delete.
+	(x86_can_use_hw_breakpoint, x86_region_ok_for_hw_watchpoint)
+	(x86_stopped_by_watchpoint, x86_stopped_data_address)
+	(x86_insert_watchpoint, x86_remove_watchpoint)
+	(x86_insert_hw_breakpoint, x86_remove_hw_breakpoint)
+	(x86_stopped_by_hw_breakpoint): New declarations.
+	(x86_nat_target): New template class.
+
+	* ppc-linux-nat.c (ppc_linux_nat_target): New class.
+	(the_ppc_linux_nat_target): New.
+	(ppc_linux_fetch_inferior_registers)
+	(ppc_linux_can_use_hw_breakpoint)
+	(ppc_linux_region_ok_for_hw_watchpoint)
+	(ppc_linux_ranged_break_num_registers)
+	(ppc_linux_insert_hw_breakpoint, ppc_linux_remove_hw_breakpoint)
+	(ppc_linux_insert_mask_watchpoint)
+	(ppc_linux_remove_mask_watchpoint)
+	(ppc_linux_can_accel_watchpoint_condition)
+	(ppc_linux_insert_watchpoint, ppc_linux_remove_watchpoint)
+	(ppc_linux_stopped_data_address, ppc_linux_stopped_by_watchpoint)
+	(ppc_linux_watchpoint_addr_within_range)
+	(ppc_linux_masked_watch_num_registers)
+	(ppc_linux_store_inferior_registers, ppc_linux_auxv_parse)
+	(ppc_linux_read_description): Refactor as methods of
+	ppc_linux_nat_target.
+	(_initialize_ppc_linux_nat): Adjust.  Set linux_target.
+
+	* procfs.c (procfs_xfer_partial): Delete forward declaration.
+	(procfs_target): New class.
+	(the_procfs_target): New.
+	(procfs_target): Delete function.
+	(procfs_auxv_parse, procfs_attach, procfs_detach)
+	(procfs_fetch_registers, procfs_store_registers, procfs_wait)
+	(procfs_xfer_partial, procfs_resume, procfs_pass_signals)
+	(procfs_files_info, procfs_kill_inferior, procfs_mourn_inferior)
+	(procfs_create_inferior, procfs_update_thread_list)
+	(procfs_thread_alive, procfs_pid_to_str)
+	(procfs_can_use_hw_breakpoint, procfs_stopped_by_watchpoint)
+	(procfs_stopped_data_address, procfs_insert_watchpoint)
+	(procfs_remove_watchpoint, procfs_region_ok_for_hw_watchpoint)
+	(proc_find_memory_regions, procfs_info_proc)
+	(procfs_make_note_section): Refactor as methods of procfs_target.
+	(_initialize_procfs): Adjust.
+	* sol-thread.c (sol_thread_target): New class.
+	(sol_thread_ops): Now a sol_thread_target.
+	(sol_thread_detach, sol_thread_resume, sol_thread_wait)
+	(sol_thread_fetch_registers, sol_thread_store_registers)
+	(sol_thread_xfer_partial, sol_thread_mourn_inferior)
+	(sol_thread_alive, solaris_pid_to_str, sol_update_thread_list)
+	(sol_get_ada_task_ptid): Refactor as methods of sol_thread_target.
+	(init_sol_thread_ops): Delete.
+	(_initialize_sol_thread): Adjust.  Remove references to
+	init_sol_thread_ops and complete_target_initialization.
+
+	* windows-nat.c (windows_nat_target): New class.
+	(windows_fetch_inferior_registers)
+	(windows_store_inferior_registers, windows_resume, windows_wait)
+	(windows_attach, windows_detach, windows_pid_to_exec_file)
+	(windows_files_info, windows_create_inferior)
+	(windows_mourn_inferior, windows_interrupt, windows_kill_inferior)
+	(windows_close, windows_pid_to_str, windows_xfer_partial)
+	(windows_get_tib_address, windows_get_ada_task_ptid)
+	(windows_thread_name, windows_thread_alive): Refactor as
+	windows_nat_target methods.
+	(do_initial_windows_stuff): Adjust.
+	(windows_target): Delete function.
+	(_initialize_windows_nat): Adjust.
+
+	* darwin-nat.c (darwin_resume, darwin_wait_to, darwin_interrupt)
+	(darwin_mourn_inferior, darwin_kill_inferior)
+	(darwin_create_inferior, darwin_attach, darwin_detach)
+	(darwin_pid_to_str, darwin_thread_alive, darwin_xfer_partial)
+	(darwin_pid_to_exec_file, darwin_get_ada_task_ptid)
+	(darwin_supports_multi_process): Refactor as darwin_nat_target
+	methods.
+	(darwin_resume_to, darwin_files_info): Delete.
+	(_initialize_darwin_inferior): Rename to ...
+	(_initialize_darwin_nat): ... this.  Adjust to C++ification.
+	* darwin-nat.h: Include "inf-child.h".
+	(darwin_nat_target): New class.
+	(darwin_complete_target): Delete.
+	* i386-darwin-nat.c (i386_darwin_nat_target): New class.
+	(darwin_target): New.
+	(i386_darwin_fetch_inferior_registers)
+	(i386_darwin_store_inferior_registers): Refactor as methods of
+	darwin_nat_target.
+	(darwin_complete_target): Delete, with ...
+	(_initialize_i386_darwin_nat): ... bits factored out here.
+
+	* alpha-linux-nat.c (alpha_linux_nat_target): New class.
+	(the_alpha_linux_nat_target): New.
+	(alpha_linux_register_u_offset): Refactor as
+	alpha_linux_nat_target method.
+	(_initialize_alpha_linux_nat): Adjust.
+	* linux-nat-trad.c (inf_ptrace_register_u_offset): Delete.
+	(inf_ptrace_fetch_register, inf_ptrace_fetch_registers)
+	(inf_ptrace_store_register, inf_ptrace_store_registers): Refact as
+	methods of linux_nat_trad_target.
+	(linux_trad_target): Delete.
+	* linux-nat-trad.h (linux_trad_target): Delete function.
+	(linux_nat_trad_target): New class.
+	* mips-linux-nat.c (mips_linux_nat_target): New class.
+	(super_fetch_registers, super_store_registers, super_close):
+	Delete.
+	(the_mips_linux_nat_target): New.
+	(mips64_linux_regsets_fetch_registers)
+	(mips64_linux_regsets_store_registers)
+	(mips64_linux_fetch_registers, mips64_linux_store_registers)
+	(mips_linux_register_u_offset, mips_linux_read_description)
+	(mips_linux_can_use_hw_breakpoint)
+	(mips_linux_stopped_by_watchpoint)
+	(mips_linux_stopped_data_address)
+	(mips_linux_region_ok_for_hw_watchpoint)
+	(mips_linux_insert_watchpoint, mips_linux_remove_watchpoint)
+	(mips_linux_close): Refactor as methods of mips_linux_nat.
+	(_initialize_mips_linux_nat): Adjust to C++ification.
+
+	* aix-thread.c (aix_thread_target): New class.
+	(aix_thread_ops): Now an aix_thread_target.
+	(aix_thread_detach, aix_thread_resume, aix_thread_wait)
+	(aix_thread_fetch_registers, aix_thread_store_registers)
+	(aix_thread_xfer_partial, aix_thread_mourn_inferior)
+	(aix_thread_thread_alive, aix_thread_pid_to_str)
+	(aix_thread_extra_thread_info, aix_thread_get_ada_task_ptid):
+	Refactor as methods of aix_thread_target.
+	(init_aix_thread_ops): Delete.
+	(_initialize_aix_thread): Remove references to init_aix_thread_ops
+	and complete_target_initialization.
+	* rs6000-nat.c (rs6000_xfer_shared_libraries): Delete.
+	(rs6000_nat_target): New class.
+	(the_rs6000_nat_target): New.
+	(rs6000_fetch_inferior_registers, rs6000_store_inferior_registers)
+	(rs6000_xfer_partial, rs6000_wait, rs6000_create_inferior)
+	(rs6000_xfer_shared_libraries): Refactor as rs6000_nat_target methods.
+	(super_create_inferior): Delete.
+	(_initialize_rs6000_nat): Adjust to C++ification.
+
+	* arm-linux-nat.c (arm_linux_nat_target): New class.
+	(the_arm_linux_nat_target): New.
+	(arm_linux_fetch_inferior_registers)
+	(arm_linux_store_inferior_registers, arm_linux_read_description)
+	(arm_linux_can_use_hw_breakpoint, arm_linux_insert_hw_breakpoint)
+	(arm_linux_remove_hw_breakpoint)
+	(arm_linux_region_ok_for_hw_watchpoint)
+	(arm_linux_insert_watchpoint, arm_linux_remove_watchpoint)
+	(arm_linux_stopped_data_address, arm_linux_stopped_by_watchpoint)
+	(arm_linux_watchpoint_addr_within_range): Refactor as methods of
+	arm_linux_nat_target.
+	(_initialize_arm_linux_nat): Adjust to C++ification.
+
+	* aarch64-linux-nat.c (aarch64_linux_nat_target): New class.
+	(the_aarch64_linux_nat_target): New.
+	(aarch64_linux_fetch_inferior_registers)
+	(aarch64_linux_store_inferior_registers)
+	(aarch64_linux_child_post_startup_inferior)
+	(aarch64_linux_read_description)
+	(aarch64_linux_can_use_hw_breakpoint)
+	(aarch64_linux_insert_hw_breakpoint)
+	(aarch64_linux_remove_hw_breakpoint)
+	(aarch64_linux_insert_watchpoint, aarch64_linux_remove_watchpoint)
+	(aarch64_linux_region_ok_for_hw_watchpoint)
+	(aarch64_linux_stopped_data_address)
+	(aarch64_linux_stopped_by_watchpoint)
+	(aarch64_linux_watchpoint_addr_within_range)
+	(aarch64_linux_can_do_single_step): Refactor as methods of
+	aarch64_linux_nat_target.
+	(super_post_startup_inferior): Delete.
+	(_initialize_aarch64_linux_nat): Adjust to C++ification.
+
+	* hppa-linux-nat.c (hppa_linux_nat_target): New class.
+	(the_hppa_linux_nat_target): New.
+	(hppa_linux_fetch_inferior_registers)
+	(hppa_linux_store_inferior_registers): Refactor as methods of
+	hppa_linux_nat_target.
+	(_initialize_hppa_linux_nat): Adjust to C++ification.
+
+	* ia64-linux-nat.c (ia64_linux_nat_target): New class.
+	(the_ia64_linux_nat_target): New.
+	(ia64_linux_insert_watchpoint, ia64_linux_remove_watchpoint)
+	(ia64_linux_stopped_data_address)
+	(ia64_linux_stopped_by_watchpoint, ia64_linux_fetch_registers)
+	(ia64_linux_store_registers, ia64_linux_xfer_partial): Refactor as
+	ia64_linux_nat_target methods.
+	(super_xfer_partial): Delete.
+	(_initialize_ia64_linux_nat): Adjust to C++ification.
+
+	* m32r-linux-nat.c (m32r_linux_nat_target): New class.
+	(the_m32r_linux_nat_target): New.
+	(m32r_linux_fetch_inferior_registers)
+	(m32r_linux_store_inferior_registers): Refactor as
+	m32r_linux_nat_target methods.
+	(_initialize_m32r_linux_nat): Adjust to C++ification.
+
+	* m68k-linux-nat.c (m68k_linux_nat_target): New class.
+	(the_m68k_linux_nat_target): New.
+	(m68k_linux_fetch_inferior_registers)
+	(m68k_linux_store_inferior_registers): Refactor as
+	m68k_linux_nat_target methods.
+	(_initialize_m68k_linux_nat): Adjust to C++ification.
+
+	* s390-linux-nat.c (s390_linux_nat_target): New class.
+	(the_s390_linux_nat_target): New.
+	(s390_linux_fetch_inferior_registers)
+	(s390_linux_store_inferior_registers, s390_stopped_by_watchpoint)
+	(s390_insert_watchpoint, s390_remove_watchpoint)
+	(s390_can_use_hw_breakpoint, s390_insert_hw_breakpoint)
+	(s390_remove_hw_breakpoint, s390_region_ok_for_hw_watchpoint)
+	(s390_auxv_parse, s390_read_description): Refactor as methods of
+	s390_linux_nat_target.
+	(_initialize_s390_nat): Adjust to C++ification.
+
+	* sparc-linux-nat.c (sparc_linux_nat_target): New class.
+	(the_sparc_linux_nat_target): New.
+	(_initialize_sparc_linux_nat): Adjust to C++ification.
+	* sparc-nat.c (sparc_fetch_inferior_registers)
+	(sparc_store_inferior_registers): Remove target_ops parameter.
+	* sparc-nat.h (sparc_fetch_inferior_registers)
+	(sparc_store_inferior_registers): Remove target_ops parameter.
+	* sparc64-linux-nat.c (sparc64_linux_nat_target): New class.
+	(the_sparc64_linux_nat_target): New.
+	(_initialize_sparc64_linux_nat): Adjust to C++ification.
+
+	* spu-linux-nat.c (spu_linux_nat_target): New class.
+	(the_spu_linux_nat_target): New.
+	(spu_child_post_startup_inferior, spu_child_post_attach)
+	(spu_child_wait, spu_fetch_inferior_registers)
+	(spu_store_inferior_registers, spu_xfer_partial)
+	(spu_can_use_hw_breakpoint): Refactor as spu_linux_nat_target
+	methods.
+	(_initialize_spu_nat): Adjust to C++ification.
+
+	* tilegx-linux-nat.c (tilegx_linux_nat_target): New class.
+	(the_tilegx_linux_nat_target): New.
+	(fetch_inferior_registers, store_inferior_registers):
+	Refactor as methods.
+	(_initialize_tile_linux_nat): Adjust to C++ification.
+
+	* xtensa-linux-nat.c (xtensa_linux_nat_target): New class.
+	(the_xtensa_linux_nat_target): New.
+	(xtensa_linux_fetch_inferior_registers)
+	(xtensa_linux_store_inferior_registers): Refactor as
+	xtensa_linux_nat_target methods.
+	(_initialize_xtensa_linux_nat): Adjust to C++ification.
+
+	* fbsd-nat.c (USE_SIGTRAP_SIGINFO): Delete.
+	(fbsd_pid_to_exec_file, fbsd_find_memory_regions)
+	(fbsd_find_memory_regions, fbsd_info_proc, fbsd_xfer_partial)
+	(fbsd_thread_alive, fbsd_pid_to_str, fbsd_thread_name)
+	(fbsd_update_thread_list, fbsd_resume, fbsd_wait)
+	(fbsd_stopped_by_sw_breakpoint)
+	(fbsd_supports_stopped_by_sw_breakpoint, fbsd_follow_fork)
+	(fbsd_insert_fork_catchpoint, fbsd_remove_fork_catchpoint)
+	(fbsd_insert_vfork_catchpoint, fbsd_remove_vfork_catchpoint)
+	(fbsd_post_startup_inferior, fbsd_post_attach)
+	(fbsd_insert_exec_catchpoint, fbsd_remove_exec_catchpoint)
+	(fbsd_set_syscall_catchpoint)
+	(super_xfer_partial, super_resume, super_wait)
+	(fbsd_supports_stopped_by_hw_breakpoint): Delete.
+	(fbsd_handle_debug_trap): Remove target_ops parameter.
+	(fbsd_nat_add_target): Delete.
+	* fbsd-nat.h: Include "inf-ptrace.h".
+	(fbsd_nat_add_target): Delete.
+	(USE_SIGTRAP_SIGINFO): Define.
+	(fbsd_nat_target): New class.
+
+	* amd64-bsd-nat.c (amd64bsd_fetch_inferior_registers)
+	(amd64bsd_store_inferior_registers): Remove target_ops parameter.
+	(amd64bsd_target): Delete.
+	* amd64-bsd-nat.h: New file.
+	* amd64-fbsd-nat.c: Include "amd64-bsd-nat.h" instead of
+	"x86-bsd-nat.h".
+	(amd64_fbsd_nat_target): New class.
+	(the_amd64_fbsd_nat_target): New.
+	(amd64fbsd_read_description): Refactor as method of
+	amd64_fbsd_nat_target.
+	(amd64_fbsd_nat_target::supports_stopped_by_hw_breakpoint): New.
+	(_initialize_amd64fbsd_nat): Adjust to C++ification.
+	* amd64-nat.h (amd64bsd_target): Delete function declaration.
+	* i386-bsd-nat.c (i386bsd_fetch_inferior_registers)
+	(i386bsd_store_inferior_registers): Remove target_ops parameter.
+	(i386bsd_target): Delete.
+	* i386-bsd-nat.h (i386bsd_target): Delete function declaration.
+	(i386bsd_fetch_inferior_registers)
+	(i386bsd_store_inferior_registers): Declare.
+	(i386_bsd_nat_target): New class.
+	* i386-fbsd-nat.c (i386_fbsd_nat_target): New class.
+	(the_i386_fbsd_nat_target): New.
+	(i386fbsd_resume, i386fbsd_read_description): Refactor as
+	i386_fbsd_nat_target methods.
+	(i386_fbsd_nat_target::supports_stopped_by_hw_breakpoint): New.
+	(_initialize_i386fbsd_nat): Adjust to C++ification.
+	* x86-bsd-nat.c (super_mourn_inferior): Delete.
+	(x86bsd_mourn_inferior, x86bsd_target): Delete.
+	(_initialize_x86_bsd_nat): Adjust to C++ification.
+	* x86-bsd-nat.h: Include "x86-nat.h".
+	(x86bsd_target): Delete declaration.
+	(x86bsd_nat_target): New class.
+
+	* aarch64-fbsd-nat.c (aarch64_fbsd_nat_target): New class.
+	(the_aarch64_fbsd_nat_target): New.
+	(aarch64_fbsd_fetch_inferior_registers)
+	(aarch64_fbsd_store_inferior_registers): Refactor as methods of
+	aarch64_fbsd_nat_target.
+	(_initialize_aarch64_fbsd_nat): Adjust to C++ification.
+	* alpha-bsd-nat.c (alpha_bsd_nat_target): New class.
+	(the_alpha_bsd_nat_target): New.
+	(alphabsd_fetch_inferior_registers)
+	(alphabsd_store_inferior_registers): Refactor as
+	alpha_bsd_nat_target methods.
+	(_initialize_alphabsd_nat): Refactor as methods of
+	alpha_bsd_nat_target.
+	* amd64-nbsd-nat.c: Include "amd64-bsd-nat.h".
+	(the_amd64_nbsd_nat_target): New.
+	(_initialize_amd64nbsd_nat): Adjust to C++ification.
+	* amd64-obsd-nat.c: Include "amd64-bsd-nat.h".
+	(the_amd64_obsd_nat_target): New.
+	(_initialize_amd64obsd_nat): Adjust to C++ification.
+	* arm-fbsd-nat.c (arm_fbsd_nat_target): New.
+	(the_arm_fbsd_nat_target): New.
+	(arm_fbsd_fetch_inferior_registers)
+	(arm_fbsd_store_inferior_registers, arm_fbsd_read_description):
+	(_initialize_arm_fbsd_nat): Refactor as methods of
+	arm_fbsd_nat_target.
+	(_initialize_arm_fbsd_nat): Adjust to C++ification.
+	* arm-nbsd-nat.c (arm_netbsd_nat_target): New class.
+	(the_arm_netbsd_nat_target): New.
+	(armnbsd_fetch_registers, armnbsd_store_registers): Refactor as
+	arm_netbsd_nat_target.
+	(_initialize_arm_netbsd_nat): Adjust to C++ification.
+	* hppa-nbsd-nat.c (hppa_nbsd_nat_target): New class.
+	(the_hppa_nbsd_nat_target): New.
+	(hppanbsd_fetch_registers, hppanbsd_store_registers): Refactor as
+	hppa_nbsd_nat_target methods.
+	(_initialize_hppanbsd_nat): Adjust to C++ification.
+	* hppa-obsd-nat.c (hppa_obsd_nat_target): New class.
+	(the_hppa_obsd_nat_target): New.
+	(hppaobsd_fetch_registers, hppaobsd_store_registers): Refactor as
+	methods of hppa_obsd_nat_target.
+	(_initialize_hppaobsd_nat): Adjust to C++ification.  Use
+	add_target.
+	* i386-nbsd-nat.c (the_i386_nbsd_nat_target): New.
+	(_initialize_i386nbsd_nat): Adjust to C++ification.  Use
+	add_target.
+	* i386-obsd-nat.c (the_i386_obsd_nat_target): New.
+	(_initialize_i386obsd_nat): Use add_target.
+	* m68k-bsd-nat.c (m68k_bsd_nat_target): New class.
+	(the_m68k_bsd_nat_target): New.
+	(m68kbsd_fetch_inferior_registers)
+	(m68kbsd_store_inferior_registers): Refactor as methods of
+	m68k_bsd_nat_target.
+	(_initialize_m68kbsd_nat): Adjust to C++ification.
+	* mips-fbsd-nat.c (mips_fbsd_nat_target): New class.
+	(the_mips_fbsd_nat_target): New.
+	(mips_fbsd_fetch_inferior_registers)
+	(mips_fbsd_store_inferior_registers): Refactor as methods of
+	mips_fbsd_nat_target.
+	(_initialize_mips_fbsd_nat): Adjust to C++ification.  Use
+	add_target.
+	* mips-nbsd-nat.c (mips_nbsd_nat_target): New class.
+	(the_mips_nbsd_nat_target): New.
+	(mipsnbsd_fetch_inferior_registers)
+	(mipsnbsd_store_inferior_registers): Refactor as methods of
+	mips_nbsd_nat_target.
+	(_initialize_mipsnbsd_nat): Adjust to C++ification.
+	* mips64-obsd-nat.c (mips64_obsd_nat_target): New class.
+	(the_mips64_obsd_nat_target): New.
+	(mips64obsd_fetch_inferior_registers)
+	(mips64obsd_store_inferior_registers): Refactor as methods of
+	mips64_obsd_nat_target.
+	(_initialize_mips64obsd_nat): Adjust to C++ification.  Use
+	add_target.
+	* nbsd-nat.c (nbsd_pid_to_exec_file): Refactor as method of
+	nbsd_nat_target.
+	* nbsd-nat.h: Include "inf-ptrace.h".
+	(nbsd_nat_target): New class.
+	* obsd-nat.c (obsd_pid_to_str, obsd_update_thread_list)
+	(obsd_wait): Refactor as methods of obsd_nat_target.
+	(obsd_add_target): Delete.
+	* obsd-nat.h: Include "inf-ptrace.h".
+	(obsd_nat_target): New class.
+	* ppc-fbsd-nat.c (ppc_fbsd_nat_target): New class.
+	(the_ppc_fbsd_nat_target): New.
+	(ppcfbsd_fetch_inferior_registers)
+	(ppcfbsd_store_inferior_registers): Refactor as methods of
+	ppc_fbsd_nat_target.
+	(_initialize_ppcfbsd_nat): Adjust to C++ification.  Use
+	add_target.
+	* ppc-nbsd-nat.c (ppc_nbsd_nat_target): New class.
+	(the_ppc_nbsd_nat_target): New.
+	(ppcnbsd_fetch_inferior_registers)
+	(ppcnbsd_store_inferior_registers): Refactor as methods of
+	ppc_nbsd_nat_target.
+	(_initialize_ppcnbsd_nat): Adjust to C++ification.
+	* ppc-obsd-nat.c (ppc_obsd_nat_target): New class.
+	(the_ppc_obsd_nat_target): New.
+	(ppcobsd_fetch_registers, ppcobsd_store_registers): Refactor as
+	methods of ppc_obsd_nat_target.
+	(_initialize_ppcobsd_nat): Adjust to C++ification.  Use
+	add_target.
+	* sh-nbsd-nat.c (sh_nbsd_nat_target): New class.
+	(the_sh_nbsd_nat_target): New.
+	(shnbsd_fetch_inferior_registers)
+	(shnbsd_store_inferior_registers): Refactor as methods of
+	sh_nbsd_nat_target.
+	(_initialize_shnbsd_nat): Adjust to C++ification.
+	* sparc-nat.c (sparc_xfer_wcookie): Make extern.
+	(inf_ptrace_xfer_partial): Delete.
+	(sparc_xfer_partial, sparc_target): Delete.
+	* sparc-nat.h (sparc_fetch_inferior_registers)
+	(sparc_store_inferior_registers, sparc_xfer_wcookie): Declare.
+	(sparc_target): Delete function declaration.
+	(sparc_target): New template class.
+	* sparc-nbsd-nat.c (the_sparc_nbsd_nat_target): New.
+	(_initialize_sparcnbsd_nat): Adjust to C++ification.
+	* sparc64-fbsd-nat.c (the_sparc64_fbsd_nat_target): New.
+	(_initialize_sparc64fbsd_nat): Adjust to C++ification.  Use
+	add_target.
+	* sparc64-nbsd-nat.c (the_sparc64_nbsd_nat_target): New.
+	(_initialize_sparc64nbsd_nat): Adjust to C++ification.
+	* sparc64-obsd-nat.c (the_sparc64_obsd_nat_target): New.
+	(_initialize_sparc64obsd_nat): Adjust to C++ification.  Use
+	add_target.
+	* vax-bsd-nat.c (vax_bsd_nat_target): New class.
+	(the_vax_bsd_nat_target): New.
+	(vaxbsd_fetch_inferior_registers)
+	(vaxbsd_store_inferior_registers): Refactor as vax_bsd_nat_target
+	methods.
+	(_initialize_vaxbsd_nat): Adjust to C++ification.
+
+	* bsd-kvm.c (bsd_kvm_target): New class.
+	(bsd_kvm_ops): Now a bsd_kvm_target.
+	(bsd_kvm_open, bsd_kvm_close, bsd_kvm_xfer_partial)
+	(bsd_kvm_files_info, bsd_kvm_fetch_registers)
+	(bsd_kvm_thread_alive, bsd_kvm_pid_to_str): Refactor as methods of
+	bsd_kvm_target.
+	(bsd_kvm_return_one): Delete.
+	(bsd_kvm_add_target): Adjust to C++ification.
+
+	* nto-procfs.c (nto_procfs_target, nto_procfs_target_native)
+	(nto_procfs_target_procfs): New classes.
+	(procfs_open_1, procfs_thread_alive, procfs_update_thread_list)
+	(procfs_files_info, procfs_pid_to_exec_file, procfs_attach)
+	(procfs_post_attach, procfs_wait, procfs_fetch_registers)
+	(procfs_xfer_partial, procfs_detach, procfs_insert_breakpoint)
+	(procfs_remove_breakpoint, procfs_insert_hw_breakpoint)
+	(procfs_remove_hw_breakpoint, procfs_resume)
+	(procfs_mourn_inferior, procfs_create_inferior, procfs_interrupt)
+	(procfs_kill_inferior, procfs_store_registers)
+	(procfs_pass_signals, procfs_pid_to_str, procfs_can_run): Refactor
+	as methods of nto_procfs_target.
+	(nto_procfs_ops): Now an nto_procfs_target_procfs.
+	(nto_native_ops): Delete.
+	(procfs_open, procfs_native_open): Delete.
+	(nto_native_ops): Now an nto_procfs_target_native.
+	(init_procfs_targets): Adjust to C++ification.
+	(procfs_can_use_hw_breakpoint, procfs_remove_hw_watchpoint)
+	(procfs_insert_hw_watchpoint, procfs_stopped_by_watchpoint):
+	Refactor as methods of nto_procfs_target.
+
+	* go32-nat.c (go32_nat_target): New class.
+	(the_go32_nat_target): New.
+	(go32_attach, go32_resume, go32_wait, go32_fetch_registers)
+	(go32_store_registers, go32_xfer_partial, go32_files_info)
+	(go32_kill_inferior, go32_create_inferior, go32_mourn_inferior)
+	(go32_terminal_init, go32_terminal_info, go32_terminal_inferior)
+	(go32_terminal_ours, go32_pass_ctrlc, go32_thread_alive)
+	(go32_pid_to_str): Refactor as methods of go32_nat_target.
+	(go32_target): Delete.
+	(_initialize_go32_nat): Adjust to C++ification.
+
+	* gnu-nat.c (gnu_wait, gnu_resume, gnu_kill_inferior)
+	(gnu_mourn_inferior, gnu_create_inferior, gnu_attach, gnu_detach)
+	(gnu_stop, gnu_thread_alive, gnu_xfer_partial)
+	(gnu_find_memory_regions, gnu_pid_to_str): Refactor as methods of
+	gnu_nat_target.
+	(gnu_target): Delete.
+	* gnu-nat.h (gnu_target): Delete.
+	(gnu_nat_target): New class.
+	* i386-gnu-nat.c (gnu_base_target): New.
+	(i386_gnu_nat_target): New class.
+	(the_i386_gnu_nat_target): New.
+	(_initialize_i386gnu_nat): Adjust to C++ification.
+
+2018-05-02  Pedro Alves  <palves@redhat.com>
 
 	* bfd-target.c (target_bfd_xclose): Rename to ...
 	(target_bfd_close): ... this.
diff --git a/gdb/aarch64-fbsd-nat.c b/gdb/aarch64-fbsd-nat.c
index 4f4eb89..5ffbf1f 100644
--- a/gdb/aarch64-fbsd-nat.c
+++ b/gdb/aarch64-fbsd-nat.c
@@ -29,6 +29,14 @@
 #include "aarch64-fbsd-tdep.h"
 #include "inf-ptrace.h"
 
+struct aarch64_fbsd_nat_target final : public fbsd_nat_target
+{
+  void fetch_registers (struct regcache *, int) override;
+  void store_registers (struct regcache *, int) override;
+};
+
+static aarch64_fbsd_nat_target the_aarch64_fbsd_nat_target;
+
 /* Determine if PT_GETREGS fetches REGNUM.  */
 
 static bool
@@ -48,9 +56,9 @@ getfpregs_supplies (struct gdbarch *gdbarch, int regnum)
 /* Fetch register REGNUM from the inferior.  If REGNUM is -1, do this
    for all registers.  */
 
-static void
-aarch64_fbsd_fetch_inferior_registers (struct target_ops *ops,
-				    struct regcache *regcache, int regnum)
+void
+aarch64_fbsd_nat_target::fetch_registers (struct regcache *regcache,
+					  int regnum)
 {
   pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache));
 
@@ -81,9 +89,9 @@ aarch64_fbsd_fetch_inferior_registers (struct target_ops *ops,
 /* Store register REGNUM back into the inferior.  If REGNUM is -1, do
    this for all registers.  */
 
-static void
-aarch64_fbsd_store_inferior_registers (struct target_ops *ops,
-				    struct regcache *regcache, int regnum)
+void
+aarch64_fbsd_nat_target::store_registers (struct regcache *regcache,
+					  int regnum)
 {
   pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache));
 
@@ -120,10 +128,5 @@ aarch64_fbsd_store_inferior_registers (struct target_ops *ops,
 void
 _initialize_aarch64_fbsd_nat (void)
 {
-  struct target_ops *t;
-
-  t = inf_ptrace_target ();
-  t->to_fetch_registers = aarch64_fbsd_fetch_inferior_registers;
-  t->to_store_registers = aarch64_fbsd_store_inferior_registers;
-  fbsd_nat_add_target (t);
+  add_target (&the_aarch64_fbsd_nat_target);
 }
diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c
index 9385659..63276ec 100644
--- a/gdb/aarch64-linux-nat.c
+++ b/gdb/aarch64-linux-nat.c
@@ -49,6 +49,36 @@
 #define TRAP_HWBKPT 0x0004
 #endif
 
+class aarch64_linux_nat_target final : public linux_nat_target
+{
+public:
+  /* Add our register access methods.  */
+  void fetch_registers (struct regcache *, int) override;
+  void store_registers (struct regcache *, int) override;
+
+  const struct target_desc *read_description () override;
+
+  /* Add our hardware breakpoint and watchpoint implementation.  */
+  int can_use_hw_breakpoint (enum bptype, int, int) override;
+  int insert_hw_breakpoint (struct gdbarch *, struct bp_target_info *) override;
+  int remove_hw_breakpoint (struct gdbarch *, struct bp_target_info *) override;
+  int region_ok_for_hw_watchpoint (CORE_ADDR, int) override;
+  int insert_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
+			 struct expression *) override;
+  int remove_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
+			 struct expression *) override;
+  int stopped_by_watchpoint () override;
+  int stopped_data_address (CORE_ADDR *) override;
+  int watchpoint_addr_within_range (CORE_ADDR, CORE_ADDR, int) override;
+
+  int can_do_single_step () override;
+
+  /* Override the GNU/Linux inferior startup hook.  */
+  void post_startup_inferior (ptid_t) override;
+};
+
+static aarch64_linux_nat_target the_aarch64_linux_nat_target;
+
 /* Per-process data.  We don't bind this to a per-inferior registry
    because of targets like x86 GNU/Linux that need to keep track of
    processes that aren't bound to any inferior (e.g., fork children,
@@ -342,12 +372,11 @@ store_fpregs_to_thread (const struct regcache *regcache)
     }
 }
 
-/* Implement the "to_fetch_register" target_ops method.  */
+/* Implement the "fetch_registers" target_ops method.  */
 
-static void
-aarch64_linux_fetch_inferior_registers (struct target_ops *ops,
-					struct regcache *regcache,
-					int regno)
+void
+aarch64_linux_nat_target::fetch_registers (struct regcache *regcache,
+					   int regno)
 {
   if (regno == -1)
     {
@@ -360,12 +389,11 @@ aarch64_linux_fetch_inferior_registers (struct target_ops *ops,
     fetch_fpregs_from_thread (regcache);
 }
 
-/* Implement the "to_store_register" target_ops method.  */
+/* Implement the "store_registers" target_ops method.  */
 
-static void
-aarch64_linux_store_inferior_registers (struct target_ops *ops,
-					struct regcache *regcache,
-					int regno)
+void
+aarch64_linux_nat_target::store_registers (struct regcache *regcache,
+					   int regno)
 {
   if (regno == -1)
     {
@@ -467,26 +495,22 @@ ps_get_thread_area (struct ps_prochandle *ph,
 }
 
 
-static void (*super_post_startup_inferior) (struct target_ops *self,
-					    ptid_t ptid);
-
-/* Implement the "to_post_startup_inferior" target_ops method.  */
+/* Implement the "post_startup_inferior" target_ops method.  */
 
-static void
-aarch64_linux_child_post_startup_inferior (struct target_ops *self,
-					   ptid_t ptid)
+void
+aarch64_linux_nat_target::post_startup_inferior (ptid_t ptid)
 {
   aarch64_forget_process (ptid_get_pid (ptid));
   aarch64_linux_get_debug_reg_capacity (ptid_get_pid (ptid));
-  super_post_startup_inferior (self, ptid);
+  linux_nat_target::post_startup_inferior (ptid);
 }
 
 extern struct target_desc *tdesc_arm_with_neon;
 
-/* Implement the "to_read_description" target_ops method.  */
+/* Implement the "read_description" target_ops method.  */
 
-static const struct target_desc *
-aarch64_linux_read_description (struct target_ops *ops)
+const struct target_desc *
+aarch64_linux_nat_target::read_description ()
 {
   int ret, tid;
   gdb_byte regbuf[VFP_REGS_SIZE];
@@ -542,10 +566,9 @@ aarch64_linux_siginfo_fixup (siginfo_t *native, gdb_byte *inf, int direction)
    one).  OTHERTYPE is non-zero if other types of watchpoints are
    currently enabled.  */
 
-static int
-aarch64_linux_can_use_hw_breakpoint (struct target_ops *self,
-				     enum bptype type,
-				     int cnt, int othertype)
+int
+aarch64_linux_nat_target::can_use_hw_breakpoint (enum bptype type,
+						 int cnt, int othertype)
 {
   if (type == bp_hardware_watchpoint || type == bp_read_watchpoint
       || type == bp_access_watchpoint || type == bp_watchpoint)
@@ -573,10 +596,9 @@ aarch64_linux_can_use_hw_breakpoint (struct target_ops *self,
 /* Insert a hardware-assisted breakpoint at BP_TGT->reqstd_address.
    Return 0 on success, -1 on failure.  */
 
-static int
-aarch64_linux_insert_hw_breakpoint (struct target_ops *self,
-				    struct gdbarch *gdbarch,
-				    struct bp_target_info *bp_tgt)
+int
+aarch64_linux_nat_target::insert_hw_breakpoint (struct gdbarch *gdbarch,
+						struct bp_target_info *bp_tgt)
 {
   int ret;
   CORE_ADDR addr = bp_tgt->placed_address = bp_tgt->reqstd_address;
@@ -607,10 +629,9 @@ aarch64_linux_insert_hw_breakpoint (struct target_ops *self,
 /* Remove a hardware-assisted breakpoint at BP_TGT->placed_address.
    Return 0 on success, -1 on failure.  */
 
-static int
-aarch64_linux_remove_hw_breakpoint (struct target_ops *self,
-				    struct gdbarch *gdbarch,
-				    struct bp_target_info *bp_tgt)
+int
+aarch64_linux_nat_target::remove_hw_breakpoint (struct gdbarch *gdbarch,
+						struct bp_target_info *bp_tgt)
 {
   int ret;
   CORE_ADDR addr = bp_tgt->placed_address;
@@ -637,17 +658,16 @@ aarch64_linux_remove_hw_breakpoint (struct target_ops *self,
   return ret;
 }
 
-/* Implement the "to_insert_watchpoint" target_ops method.
+/* Implement the "insert_watchpoint" target_ops method.
 
    Insert a watchpoint to watch a memory region which starts at
    address ADDR and whose length is LEN bytes.  Watch memory accesses
    of the type TYPE.  Return 0 on success, -1 on failure.  */
 
-static int
-aarch64_linux_insert_watchpoint (struct target_ops *self,
-				 CORE_ADDR addr, int len,
-				 enum target_hw_bp_type type,
-				 struct expression *cond)
+int
+aarch64_linux_nat_target::insert_watchpoint (CORE_ADDR addr, int len,
+					     enum target_hw_bp_type type,
+					     struct expression *cond)
 {
   int ret;
   struct aarch64_debug_reg_state *state
@@ -671,16 +691,15 @@ aarch64_linux_insert_watchpoint (struct target_ops *self,
   return ret;
 }
 
-/* Implement the "to_remove_watchpoint" target_ops method.
+/* Implement the "remove_watchpoint" target_ops method.
    Remove a watchpoint that watched the memory region which starts at
    address ADDR, whose length is LEN bytes, and for accesses of the
    type TYPE.  Return 0 on success, -1 on failure.  */
 
-static int
-aarch64_linux_remove_watchpoint (struct target_ops *self,
-				 CORE_ADDR addr, int len,
-				 enum target_hw_bp_type type,
-				 struct expression *cond)
+int
+aarch64_linux_nat_target::remove_watchpoint (CORE_ADDR addr, int len,
+					     enum target_hw_bp_type type,
+					     struct expression *cond)
 {
   int ret;
   struct aarch64_debug_reg_state *state
@@ -704,20 +723,18 @@ aarch64_linux_remove_watchpoint (struct target_ops *self,
   return ret;
 }
 
-/* Implement the "to_region_ok_for_hw_watchpoint" target_ops method.  */
+/* Implement the "region_ok_for_hw_watchpoint" target_ops method.  */
 
-static int
-aarch64_linux_region_ok_for_hw_watchpoint (struct target_ops *self,
-					   CORE_ADDR addr, int len)
+int
+aarch64_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
 {
   return aarch64_linux_region_ok_for_watchpoint (addr, len);
 }
 
-/* Implement the "to_stopped_data_address" target_ops method.  */
+/* Implement the "stopped_data_address" target_ops method.  */
 
-static int
-aarch64_linux_stopped_data_address (struct target_ops *target,
-				    CORE_ADDR *addr_p)
+int
+aarch64_linux_nat_target::stopped_data_address (CORE_ADDR *addr_p)
 {
   siginfo_t siginfo;
   int i, tid;
@@ -752,30 +769,29 @@ aarch64_linux_stopped_data_address (struct target_ops *target,
   return 0;
 }
 
-/* Implement the "to_stopped_by_watchpoint" target_ops method.  */
+/* Implement the "stopped_by_watchpoint" target_ops method.  */
 
-static int
-aarch64_linux_stopped_by_watchpoint (struct target_ops *ops)
+int
+aarch64_linux_nat_target::stopped_by_watchpoint ()
 {
   CORE_ADDR addr;
 
-  return aarch64_linux_stopped_data_address (ops, &addr);
+  return stopped_data_address (&addr);
 }
 
-/* Implement the "to_watchpoint_addr_within_range" target_ops method.  */
+/* Implement the "watchpoint_addr_within_range" target_ops method.  */
 
-static int
-aarch64_linux_watchpoint_addr_within_range (struct target_ops *target,
-					    CORE_ADDR addr,
-					    CORE_ADDR start, int length)
+int
+aarch64_linux_nat_target::watchpoint_addr_within_range (CORE_ADDR addr,
+							CORE_ADDR start, int length)
 {
   return start <= addr && start + length - 1 >= addr;
 }
 
-/* Implement the "to_can_do_single_step" target_ops method.  */
+/* Implement the "can_do_single_step" target_ops method.  */
 
-static int
-aarch64_linux_can_do_single_step (struct target_ops *target)
+int
+aarch64_linux_nat_target::can_do_single_step ()
 {
   return 1;
 }
@@ -804,38 +820,13 @@ triggers a breakpoint or watchpoint."),
 void
 _initialize_aarch64_linux_nat (void)
 {
-  struct target_ops *t;
-
-  /* Fill in the generic GNU/Linux methods.  */
-  t = linux_target ();
+  struct target_ops *t = &the_aarch64_linux_nat_target;
 
   add_show_debug_regs_command ();
 
-  /* Add our register access methods.  */
-  t->to_fetch_registers = aarch64_linux_fetch_inferior_registers;
-  t->to_store_registers = aarch64_linux_store_inferior_registers;
-
-  t->to_read_description = aarch64_linux_read_description;
-
-  t->to_can_use_hw_breakpoint = aarch64_linux_can_use_hw_breakpoint;
-  t->to_insert_hw_breakpoint = aarch64_linux_insert_hw_breakpoint;
-  t->to_remove_hw_breakpoint = aarch64_linux_remove_hw_breakpoint;
-  t->to_region_ok_for_hw_watchpoint =
-    aarch64_linux_region_ok_for_hw_watchpoint;
-  t->to_insert_watchpoint = aarch64_linux_insert_watchpoint;
-  t->to_remove_watchpoint = aarch64_linux_remove_watchpoint;
-  t->to_stopped_by_watchpoint = aarch64_linux_stopped_by_watchpoint;
-  t->to_stopped_data_address = aarch64_linux_stopped_data_address;
-  t->to_watchpoint_addr_within_range =
-    aarch64_linux_watchpoint_addr_within_range;
-  t->to_can_do_single_step = aarch64_linux_can_do_single_step;
-
-  /* Override the GNU/Linux inferior startup hook.  */
-  super_post_startup_inferior = t->to_post_startup_inferior;
-  t->to_post_startup_inferior = aarch64_linux_child_post_startup_inferior;
-
   /* Register the target.  */
-  linux_nat_add_target (t);
+  linux_target = &the_aarch64_linux_nat_target;
+  add_target (t);
   linux_nat_set_new_thread (t, aarch64_linux_new_thread);
   linux_nat_set_delete_thread (t, aarch64_linux_delete_thread);
   linux_nat_set_new_fork (t, aarch64_linux_new_fork);
diff --git a/gdb/aix-thread.c b/gdb/aix-thread.c
index d2b951d..3727336f 100644
--- a/gdb/aix-thread.c
+++ b/gdb/aix-thread.c
@@ -108,7 +108,45 @@ struct pd_thread {
 
 /* This module's target-specific operations, active while pd_able is true.  */
 
-static struct target_ops aix_thread_ops;
+class aix_thread_target final : public target_ops
+{
+public:
+  aix_thread_target ()
+  { to_stratum = thread_stratum; }
+
+  const char *shortname () override
+  { return "aix-threads"; }
+  const char *longname () override
+  { return _("AIX pthread support"); }
+  const char *doc () override
+  { return _("AIX pthread support"); }
+
+  void detach (inferior *, int) override;
+  void resume (ptid_t, int, enum gdb_signal) override;
+  ptid_t wait (ptid_t, struct target_waitstatus *, int) override;
+
+  void fetch_registers (struct regcache *, int) override;
+  void store_registers (struct regcache *, int) override;
+
+  enum target_xfer_status xfer_partial (enum target_object object,
+					const char *annex,
+					gdb_byte *readbuf,
+					const gdb_byte *writebuf,
+					ULONGEST offset, ULONGEST len,
+					ULONGEST *xfered_len) override;
+
+  void mourn_inferior () override;
+
+  int thread_alive (ptid_t ptid) override;
+
+  const char *pid_to_str (ptid_t) override;
+
+  const char *extra_thread_info (struct thread_info *) override;
+
+  ptid_t get_ada_task_ptid (long lwp, long thread) override;
+};
+
+static aix_thread_target aix_thread_ops;
 
 /* Address of the function that libpthread will call when libpthdebug
    is ready to be initialized.  */
@@ -980,21 +1018,20 @@ aix_thread_inferior_created (struct target_ops *ops, int from_tty)
 
 /* Detach from the process attached to by aix_thread_attach().  */
 
-static void
-aix_thread_detach (struct target_ops *ops, inferior *inf, int from_tty)
+void
+aix_thread_target::detach (inferior *inf, int from_tty)
 {
-  struct target_ops *beneath = find_target_beneath (ops);
+  struct target_ops *beneath = find_target_beneath (this);
 
   pd_disable ();
-  beneath->to_detach (beneath, inf, from_tty);
+  beneath->detach (inf, from_tty);
 }
 
 /* Tell the inferior process to continue running thread PID if != -1
    and all threads otherwise.  */
 
-static void
-aix_thread_resume (struct target_ops *ops,
-                   ptid_t ptid, int step, enum gdb_signal sig)
+void
+aix_thread_target::resume (ptid_t ptid, int step, enum gdb_signal sig)
 {
   struct thread_info *thread;
   pthdb_tid_t tid[2];
@@ -1002,10 +1039,10 @@ aix_thread_resume (struct target_ops *ops,
   if (!PD_TID (ptid))
     {
       scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
-      struct target_ops *beneath = find_target_beneath (ops);
+      struct target_ops *beneath = find_target_beneath (this);
       
       inferior_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
-      beneath->to_resume (beneath, ptid, step, sig);
+      beneath->resume (ptid, step, sig);
     }
   else
     {
@@ -1035,11 +1072,11 @@ aix_thread_resume (struct target_ops *ops,
    If an error occurs, return -1, else return the pid of the stopped
    thread.  */
 
-static ptid_t
-aix_thread_wait (struct target_ops *ops,
-		 ptid_t ptid, struct target_waitstatus *status, int options)
+ptid_t
+aix_thread_target::wait (ptid_t ptid, struct target_waitstatus *status,
+			 int options)
 {
-  struct target_ops *beneath = find_target_beneath (ops);
+  struct target_ops *beneath = find_target_beneath (this);
 
   {
     scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
@@ -1047,7 +1084,7 @@ aix_thread_wait (struct target_ops *ops,
     pid_to_prc (&ptid);
 
     inferior_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
-    ptid = beneath->to_wait (beneath, ptid, status, options);
+    ptid = beneath->wait (ptid, status, options);
   }
 
   if (ptid_get_pid (ptid) == -1)
@@ -1319,16 +1356,15 @@ fetch_regs_kernel_thread (struct regcache *regcache, int regno,
 /* Fetch register REGNO if != -1 or all registers otherwise from the
    thread/process connected to REGCACHE.  */
 
-static void
-aix_thread_fetch_registers (struct target_ops *ops,
-                            struct regcache *regcache, int regno)
+void
+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 (ops);
+  struct target_ops *beneath = find_target_beneath (this);
 
   if (!PD_TID (regcache_get_ptid (regcache)))
-    beneath->to_fetch_registers (beneath, regcache, regno);
+    beneath->fetch_registers (regcache, regno);
   else
     {
       thread = find_thread_ptid (regcache_get_ptid (regcache));
@@ -1674,16 +1710,15 @@ store_regs_kernel_thread (const struct regcache *regcache, int regno,
 /* Store gdb's current view of the register set into the
    thread/process connected to REGCACHE.  */
 
-static void
-aix_thread_store_registers (struct target_ops *ops,
-                            struct regcache *regcache, int regno)
+void
+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 (ops);
+  struct target_ops *beneath = find_target_beneath (this);
 
   if (!PD_TID (regcache_get_ptid (regcache)))
-    beneath->to_store_registers (beneath, regcache, regno);
+    beneath->store_registers (regcache, regno);
   else
     {
       thread = find_thread_ptid (regcache_get_ptid (regcache));
@@ -1699,40 +1734,41 @@ aix_thread_store_registers (struct target_ops *ops,
 
 /* Implement the to_xfer_partial target_ops method.  */
 
-static enum target_xfer_status
-aix_thread_xfer_partial (struct target_ops *ops, enum target_object object,
-			 const char *annex, gdb_byte *readbuf,
-			 const gdb_byte *writebuf,
-			 ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
+enum target_xfer_status
+aix_thread_target::xfer_partial (enum target_object object,
+				 const char *annex, gdb_byte *readbuf,
+				 const gdb_byte *writebuf,
+				 ULONGEST offset, ULONGEST len,
+				 ULONGEST *xfered_len)
 {
   scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
-  struct target_ops *beneath = find_target_beneath (ops);
+  struct target_ops *beneath = find_target_beneath (this);
 
   inferior_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
-  return beneath->to_xfer_partial (beneath, 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.  */
 
-static void
-aix_thread_mourn_inferior (struct target_ops *ops)
+void
+aix_thread_target::mourn_inferior ()
 {
-  struct target_ops *beneath = find_target_beneath (ops);
+  struct target_ops *beneath = find_target_beneath (this);
 
   pd_deactivate ();
-  beneath->to_mourn_inferior (beneath);
+  beneath->mourn_inferior ();
 }
 
 /* Return whether thread PID is still valid.  */
 
-static int
-aix_thread_thread_alive (struct target_ops *ops, ptid_t ptid)
+int
+aix_thread_target::thread_alive (ptid_t ptid)
 {
-  struct target_ops *beneath = find_target_beneath (ops);
+  struct target_ops *beneath = find_target_beneath (this);
 
   if (!PD_TID (ptid))
-    return beneath->to_thread_alive (beneath, 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.  */
@@ -1742,14 +1778,14 @@ aix_thread_thread_alive (struct target_ops *ops, ptid_t ptid)
 /* Return a printable representation of composite PID for use in
    "info threads" output.  */
 
-static const char *
-aix_thread_pid_to_str (struct target_ops *ops, ptid_t ptid)
+const char *
+aix_thread_target::pid_to_str (ptid_t ptid)
 {
   static char *ret = NULL;
-  struct target_ops *beneath = find_target_beneath (ops);
+  struct target_ops *beneath = find_target_beneath (this);
 
   if (!PD_TID (ptid))
-    return beneath->to_pid_to_str (beneath, ptid);
+    return beneath->pid_to_str (ptid);
 
   /* Free previous return value; a new one will be allocated by
      xstrprintf().  */
@@ -1762,9 +1798,8 @@ aix_thread_pid_to_str (struct target_ops *ops, ptid_t ptid)
 /* Return a printable representation of extra information about
    THREAD, for use in "info threads" output.  */
 
-static const char *
-aix_thread_extra_thread_info (struct target_ops *self,
-			      struct thread_info *thread)
+const char *
+aix_thread_target::extra_thread_info (struct thread_info *thread)
 {
   int status;
   pthdb_pthread_t pdtid;
@@ -1819,35 +1854,12 @@ aix_thread_extra_thread_info (struct target_ops *self,
   return ret;
 }
 
-static ptid_t
-aix_thread_get_ada_task_ptid (struct target_ops *self, long lwp, long thread)
+ptid_t
+aix_thread_target::get_ada_task_ptid (long lwp, long thread)
 {
   return ptid_build (ptid_get_pid (inferior_ptid), 0, thread);
 }
 
-/* Initialize target aix_thread_ops.  */
-
-static void
-init_aix_thread_ops (void)
-{
-  aix_thread_ops.to_shortname = "aix-threads";
-  aix_thread_ops.to_longname = _("AIX pthread support");
-  aix_thread_ops.to_doc = _("AIX pthread support");
-
-  aix_thread_ops.to_detach = aix_thread_detach;
-  aix_thread_ops.to_resume = aix_thread_resume;
-  aix_thread_ops.to_wait = aix_thread_wait;
-  aix_thread_ops.to_fetch_registers = aix_thread_fetch_registers;
-  aix_thread_ops.to_store_registers = aix_thread_store_registers;
-  aix_thread_ops.to_xfer_partial = aix_thread_xfer_partial;
-  aix_thread_ops.to_mourn_inferior = aix_thread_mourn_inferior;
-  aix_thread_ops.to_thread_alive = aix_thread_thread_alive;
-  aix_thread_ops.to_pid_to_str = aix_thread_pid_to_str;
-  aix_thread_ops.to_extra_thread_info = aix_thread_extra_thread_info;
-  aix_thread_ops.to_get_ada_task_ptid = aix_thread_get_ada_task_ptid;
-  aix_thread_ops.to_stratum = thread_stratum;
-  aix_thread_ops.to_magic = OPS_MAGIC;
-}
 
 /* Module startup initialization function, automagically called by
    init.c.  */
@@ -1855,9 +1867,6 @@ init_aix_thread_ops (void)
 void
 _initialize_aix_thread (void)
 {
-  init_aix_thread_ops ();
-  complete_target_initialization (&aix_thread_ops);
-
   /* Notice when object files get loaded and unloaded.  */
   gdb::observers::new_objfile.attach (new_objfile);
 
diff --git a/gdb/alpha-bsd-nat.c b/gdb/alpha-bsd-nat.c
index 80139b6..234dac9 100644
--- a/gdb/alpha-bsd-nat.c
+++ b/gdb/alpha-bsd-nat.c
@@ -43,6 +43,14 @@ typedef struct fpreg fpregset_t;
 
 #include "gregset.h"
 
+struct alpha_bsd_nat_target final : public inf_ptrace_target
+{
+  void fetch_registers (struct regcache *, int) override;
+  void store_registers (struct regcache *, int) override;
+};
+
+static alpha_bsd_nat_target the_alpha_bsd_nat_target;
+
 /* Provide *regset() wrappers around the generic Alpha BSD register
    supply/fill routines.  */
 
@@ -83,9 +91,8 @@ getregs_supplies (int regno)
 /* Fetch register REGNO from the inferior.  If REGNO is -1, do this
    for all registers (including the floating point registers).  */
 
-static void
-alphabsd_fetch_inferior_registers (struct target_ops *ops,
-				   struct regcache *regcache, int regno)
+void
+alpha_bsd_nat_target::fetch_registers (struct regcache *regcache, int regno)
 {
   if (regno == -1 || getregs_supplies (regno))
     {
@@ -116,9 +123,8 @@ alphabsd_fetch_inferior_registers (struct target_ops *ops,
 /* Store register REGNO back into the inferior.  If REGNO is -1, do
    this for all registers (including the floating point registers).  */
 
-static void
-alphabsd_store_inferior_registers (struct target_ops *ops,
-				   struct regcache *regcache, int regno)
+void
+alpha_bsd_nat_target::store_registers (struct regcache *regcache, int regno)
 {
   if (regno == -1 || getregs_supplies (regno))
     {
@@ -190,12 +196,7 @@ alphabsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
 void
 _initialize_alphabsd_nat (void)
 {
-  struct target_ops *t;
-
-  t = inf_ptrace_target ();
-  t->to_fetch_registers = alphabsd_fetch_inferior_registers;
-  t->to_store_registers = alphabsd_store_inferior_registers;
-  add_target (t);
+  add_target (&the_alpha_bsd_nat_target);
 
   /* Support debugging kernel virtual memory images.  */
   bsd_kvm_add_target (alphabsd_supply_pcb);
diff --git a/gdb/alpha-linux-nat.c b/gdb/alpha-linux-nat.c
index 8d46af4..e08e19d 100644
--- a/gdb/alpha-linux-nat.c
+++ b/gdb/alpha-linux-nat.c
@@ -32,6 +32,15 @@
 /* The address of UNIQUE for ptrace.  */
 #define ALPHA_UNIQUE_PTRACE_ADDR 65
 
+class alpha_linux_nat_target final : public linux_nat_trad_target
+{
+protected:
+  /* Override linux_nat_trad_target methods.  */
+  CORE_ADDR register_u_offset (struct gdbarch *gdbarch,
+			       int regno, int store_p) override;
+};
+
+static alpha_linux_nat_target the_alpha_linux_nat_target;
 
 /* See the comment in m68k-tdep.c regarding the utility of these
    functions.  */
@@ -77,9 +86,9 @@ fill_fpregset (const struct regcache *regcache,
   alpha_fill_fp_regs (regcache, regno, regp, regp + 31);
 }
 
-
-static CORE_ADDR
-alpha_linux_register_u_offset (struct gdbarch *gdbarch, int regno, int store_p)
+CORE_ADDR
+alpha_linux_nat_target::register_u_offset (struct gdbarch *gdbarch,
+					   int regno, int store_p)
 {
   if (regno == gdbarch_pc_regnum (gdbarch))
     return PC;
@@ -94,5 +103,6 @@ alpha_linux_register_u_offset (struct gdbarch *gdbarch, int regno, int store_p)
 void
 _initialize_alpha_linux_nat (void)
 {
-  linux_nat_add_target (linux_trad_target (alpha_linux_register_u_offset));
+  linux_target = &the_alpha_linux_nat_target;
+  add_target (&the_alpha_linux_nat_target);
 }
diff --git a/gdb/amd64-bsd-nat.c b/gdb/amd64-bsd-nat.c
index d3a516f..74a1842 100644
--- a/gdb/amd64-bsd-nat.c
+++ b/gdb/amd64-bsd-nat.c
@@ -38,9 +38,8 @@
 /* Fetch register REGNUM from the inferior.  If REGNUM is -1, do this
    for all registers (including the floating-point registers).  */
 
-static void
-amd64bsd_fetch_inferior_registers (struct target_ops *ops,
-				   struct regcache *regcache, int regnum)
+void
+amd64bsd_fetch_inferior_registers (struct regcache *regcache, int regnum)
 {
   struct gdbarch *gdbarch = regcache->arch ();
   pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache));
@@ -112,9 +111,8 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops,
 /* Store register REGNUM back into the inferior.  If REGNUM is -1, do
    this for all registers (including the floating-point registers).  */
 
-static void
-amd64bsd_store_inferior_registers (struct target_ops *ops,
-				   struct regcache *regcache, int regnum)
+void
+amd64bsd_store_inferior_registers (struct regcache *regcache, int regnum)
 {
   struct gdbarch *gdbarch = regcache->arch ();
   pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache));
@@ -193,17 +191,3 @@ amd64bsd_store_inferior_registers (struct target_ops *ops,
 	perror_with_name (_("Couldn't write floating point status"));
     }
 }
-
-/* Create a prototype *BSD/amd64 target.  The client can override it
-   with local methods.  */
-
-struct target_ops *
-amd64bsd_target (void)
-{
-  struct target_ops *t;
-
-  t = x86bsd_target ();
-  t->to_fetch_registers = amd64bsd_fetch_inferior_registers;
-  t->to_store_registers = amd64bsd_store_inferior_registers;
-  return t;
-}
diff --git a/gdb/amd64-bsd-nat.h b/gdb/amd64-bsd-nat.h
new file mode 100644
index 0000000..84528ca
--- /dev/null
+++ b/gdb/amd64-bsd-nat.h
@@ -0,0 +1,44 @@
+/* Native-dependent code for modern AMD64 BSD's.
+
+   Copyright (C) 2018 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef AMD64_BSD_NAT_H
+#define AMD64_BSD_NAT_H
+
+#include "x86-bsd-nat.h"
+
+/* Helper functions.  See definitions.  */
+extern void amd64bsd_fetch_inferior_registers (struct regcache *regcache,
+					       int regnum);
+extern void amd64bsd_store_inferior_registers (struct regcache *regcache,
+					       int regnum);
+
+/* A prototype *BSD/AMD64 target.  */
+
+template<typename BaseTarget>
+class amd64_bsd_nat_target : public x86bsd_nat_target<BaseTarget>
+{
+public:
+  void fetch_registers (struct regcache *regcache, int regnum) override
+  { amd64bsd_fetch_inferior_registers (regcache, regnum); }
+
+  void store_registers (struct regcache *regcache, int regnum) override
+  { amd64bsd_store_inferior_registers (regcache, regnum); }
+};
+
+#endif /* i386-bsd-nat.h */
diff --git a/gdb/amd64-fbsd-nat.c b/gdb/amd64-fbsd-nat.c
index 07963f5..57e6ff2 100644
--- a/gdb/amd64-fbsd-nat.c
+++ b/gdb/amd64-fbsd-nat.c
@@ -32,11 +32,25 @@
 #include "fbsd-nat.h"
 #include "amd64-tdep.h"
 #include "amd64-nat.h"
-#include "x86-bsd-nat.h"
+#include "amd64-bsd-nat.h"
 #include "x86-nat.h"
 #include "x86-xstate.h"
 
 
+class amd64_fbsd_nat_target final
+  : public amd64_bsd_nat_target<fbsd_nat_target>
+{
+public:
+  /* Add some extra features to the common *BSD/amd64 target.  */
+  const struct target_desc *read_description () override;
+
+#if defined(HAVE_PT_GETDBREGS) && defined(USE_SIGTRAP_SIGINFO)
+  int supports_stopped_by_hw_breakpoint () override;
+#endif
+};
+
+static amd64_fbsd_nat_target the_amd64_fbsd_nat_target;
+
 /* Offset in `struct reg' where MEMBER is stored.  */
 #define REG_OFFSET(member) offsetof (struct reg, member)
 
@@ -141,10 +155,10 @@ amd64fbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
 }
 
 
-/* Implement the to_read_description method.  */
+/* Implement the read_description method.  */
 
-static const struct target_desc *
-amd64fbsd_read_description (struct target_ops *ops)
+const struct target_desc *
+amd64_fbsd_nat_target::read_description ()
 {
 #ifdef PT_GETXSTATE_INFO
   static int xsave_probed;
@@ -185,20 +199,25 @@ amd64fbsd_read_description (struct target_ops *ops)
     return i386_target_description (X86_XSTATE_SSE_MASK);
 }
 
+#if defined(HAVE_PT_GETDBREGS) && defined(USE_SIGTRAP_SIGINFO)
+/* Implement the supports_stopped_by_hw_breakpoints method.  */
+
+int
+amd64_fbsd_nat_target::supports_stopped_by_hw_breakpoint ()
+{
+  return 1;
+}
+#endif
+
 void
 _initialize_amd64fbsd_nat (void)
 {
-  struct target_ops *t;
   int offset;
 
   amd64_native_gregset32_reg_offset = amd64fbsd32_r_reg_offset;
   amd64_native_gregset64_reg_offset = amd64fbsd64_r_reg_offset;
 
-  /* Add some extra features to the common *BSD/i386 target.  */
-  t = amd64bsd_target ();
-  t->to_read_description = amd64fbsd_read_description;
-
-  fbsd_nat_add_target (t);
+  add_target (&the_amd64_fbsd_nat_target);
 
   /* Support debugging kernel virtual memory images.  */
   bsd_kvm_add_target (amd64fbsd_supply_pcb);
diff --git a/gdb/amd64-linux-nat.c b/gdb/amd64-linux-nat.c
index ad94243..cee3644 100644
--- a/gdb/amd64-linux-nat.c
+++ b/gdb/amd64-linux-nat.c
@@ -30,7 +30,6 @@
 #include "gdb_proc_service.h"
 
 #include "amd64-nat.h"
-#include "linux-nat.h"
 #include "amd64-tdep.h"
 #include "amd64-linux-tdep.h"
 #include "i386-linux-tdep.h"
@@ -46,6 +45,15 @@
 #define PTRACE_ARCH_PRCTL      30
 #endif
 
+struct amd64_linux_nat_target final : public x86_linux_nat_target
+{
+  /* Add our register access methods.  */
+  void fetch_registers (struct regcache *, int) override;
+  void store_registers (struct regcache *, int) override;
+};
+
+static amd64_linux_nat_target the_amd64_linux_nat_target;
+
 /* Mapping between the general-purpose registers in GNU/Linux x86-64
    `struct user' format and GDB's register cache layout for GNU/Linux
    i386.
@@ -130,9 +138,8 @@ fill_fpregset (const struct regcache *regcache,
    this for all registers (including the floating point and SSE
    registers).  */
 
-static void
-amd64_linux_fetch_inferior_registers (struct target_ops *ops,
-				      struct regcache *regcache, int regnum)
+void
+amd64_linux_nat_target::fetch_registers (struct regcache *regcache, int regnum)
 {
   struct gdbarch *gdbarch = regcache->arch ();
   int tid;
@@ -209,9 +216,8 @@ amd64_linux_fetch_inferior_registers (struct target_ops *ops,
    -1, do this for all registers (including the floating-point and SSE
    registers).  */
 
-static void
-amd64_linux_store_inferior_registers (struct target_ops *ops,
-				      struct regcache *regcache, int regnum)
+void
+amd64_linux_nat_target::store_registers (struct regcache *regcache, int regnum)
 {
   struct gdbarch *gdbarch = regcache->arch ();
   int tid;
@@ -399,8 +405,6 @@ amd64_linux_siginfo_fixup (siginfo_t *ptrace, gdb_byte *inf, int direction)
 void
 _initialize_amd64_linux_nat (void)
 {
-  struct target_ops *t;
-
   amd64_native_gregset32_reg_offset = amd64_linux_gregset32_reg_offset;
   amd64_native_gregset32_num_regs = I386_LINUX_NUM_REGS;
   amd64_native_gregset64_reg_offset = amd64_linux_gregset_reg_offset;
@@ -409,16 +413,11 @@ _initialize_amd64_linux_nat (void)
   gdb_assert (ARRAY_SIZE (amd64_linux_gregset32_reg_offset)
 	      == amd64_native_gregset32_num_regs);
 
-  /* Create a generic x86 GNU/Linux target.  */
-  t = x86_linux_create_target ();
-
-  /* Add our register access methods.  */
-  t->to_fetch_registers = amd64_linux_fetch_inferior_registers;
-  t->to_store_registers = amd64_linux_store_inferior_registers;
+  linux_target = &the_amd64_linux_nat_target;
 
   /* Add the target.  */
-  x86_linux_add_target (t);
+  x86_linux_add_target (linux_target);
 
   /* Add our siginfo layout converter.  */
-  linux_nat_set_siginfo_fixup (t, amd64_linux_siginfo_fixup);
+  linux_nat_set_siginfo_fixup (linux_target, amd64_linux_siginfo_fixup);
 }
diff --git a/gdb/amd64-nat.h b/gdb/amd64-nat.h
index c1a4a87..11bddf5 100644
--- a/gdb/amd64-nat.h
+++ b/gdb/amd64-nat.h
@@ -49,9 +49,4 @@ extern void amd64_supply_native_gregset (struct regcache *regcache,
 extern void amd64_collect_native_gregset (const struct regcache *regcache,
 					  void *gregs, int regnum);
 
-/* Create a prototype *BSD/amd64 target.  The client can override it
-   with local methods.  */
-
-extern struct target_ops *amd64bsd_target (void);
-
 #endif /* amd64-nat.h */
diff --git a/gdb/amd64-nbsd-nat.c b/gdb/amd64-nbsd-nat.c
index cd84783..e1c07df 100644
--- a/gdb/amd64-nbsd-nat.c
+++ b/gdb/amd64-nbsd-nat.c
@@ -22,6 +22,7 @@
 
 #include "nbsd-nat.h"
 #include "amd64-tdep.h"
+#include "amd64-bsd-nat.h"
 #include "amd64-nat.h"
 
 /* Mapping between the general-purpose registers in NetBSD/amd64
@@ -53,17 +54,14 @@ static int amd64nbsd32_r_reg_offset[] =
   15 * 8			/* %gs */
 };
 
+static amd64_bsd_nat_target<nbsd_nat_target> the_amd64_nbsd_nat_target;
+
 void
 _initialize_amd64nbsd_nat (void)
 {
-  struct target_ops *t;
-
   amd64_native_gregset32_reg_offset = amd64nbsd32_r_reg_offset;
   amd64_native_gregset32_num_regs = ARRAY_SIZE (amd64nbsd32_r_reg_offset);
   amd64_native_gregset64_reg_offset = amd64nbsd_r_reg_offset;
 
-  /* Add some extra features to the common *BSD/amd64 target.  */
-  t = amd64bsd_target ();
-  t->to_pid_to_exec_file = nbsd_pid_to_exec_file;
-  add_target (t);
+  add_target (&the_amd64_nbsd_nat_target);
 }
diff --git a/gdb/amd64-obsd-nat.c b/gdb/amd64-obsd-nat.c
index 76ea480..d6756d9 100644
--- a/gdb/amd64-obsd-nat.c
+++ b/gdb/amd64-obsd-nat.c
@@ -23,6 +23,7 @@
 #include "target.h"
 
 #include "amd64-tdep.h"
+#include "amd64-bsd-nat.h"
 #include "amd64-nat.h"
 #include "obsd-nat.h"
 
@@ -125,6 +126,8 @@ amd64obsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
   return 1;
 }
 
+static amd64_bsd_nat_target<obsd_nat_target> the_amd64_obsd_nat_target;
+
 void
 _initialize_amd64obsd_nat (void)
 {
@@ -132,8 +135,7 @@ _initialize_amd64obsd_nat (void)
   amd64_native_gregset32_num_regs = ARRAY_SIZE (amd64obsd32_r_reg_offset);
   amd64_native_gregset64_reg_offset = amd64obsd_r_reg_offset;
 
-  /* Add some extra features to the common *BSD/amd64 target.  */
-  obsd_add_target (amd64bsd_target ());
+  add_target (&the_amd64_obsd_nat_target);
 
   /* Support debugging kernel virtual memory images.  */
   bsd_kvm_add_target (amd64obsd_supply_pcb);
diff --git a/gdb/arm-fbsd-nat.c b/gdb/arm-fbsd-nat.c
index 5b9fcc0..f31ee5f 100644
--- a/gdb/arm-fbsd-nat.c
+++ b/gdb/arm-fbsd-nat.c
@@ -29,6 +29,15 @@
 #include "arm-fbsd-tdep.h"
 #include "inf-ptrace.h"
 
+struct arm_fbsd_nat_target : public fbsd_nat_target
+{
+  void fetch_registers (struct regcache *, int) override;
+  void store_registers (struct regcache *, int) override;
+  const struct target_desc *read_description () override;
+};
+
+static arm_fbsd_nat_target the_arm_fbsd_nat_target;
+
 /* Determine if PT_GETREGS fetches REGNUM.  */
 
 static bool
@@ -52,9 +61,8 @@ getvfpregs_supplies (struct gdbarch *gdbarch, int regnum)
 /* Fetch register REGNUM from the inferior.  If REGNUM is -1, do this
    for all registers.  */
 
-static void
-arm_fbsd_fetch_inferior_registers (struct target_ops *ops,
-				    struct regcache *regcache, int regnum)
+void
+arm_fbsd_nat_target::fetch_registers (struct regcache *regcache, int regnum)
 {
   pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache));
 
@@ -87,9 +95,8 @@ arm_fbsd_fetch_inferior_registers (struct target_ops *ops,
 /* Store register REGNUM back into the inferior.  If REGNUM is -1, do
    this for all registers.  */
 
-static void
-arm_fbsd_store_inferior_registers (struct target_ops *ops,
-				    struct regcache *regcache, int regnum)
+void
+arm_fbsd_nat_target::store_registers (struct regcache *regcache, int regnum)
 {
   pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache));
 
@@ -127,25 +134,19 @@ arm_fbsd_store_inferior_registers (struct target_ops *ops,
 
 /* Implement the to_read_description method.  */
 
-static const struct target_desc *
-arm_fbsd_read_description (struct target_ops *ops)
+const struct target_desc *
+arm_fbsd_nat_target::read_description ()
 {
   const struct target_desc *desc;
 
-  desc = arm_fbsd_read_description_auxv (ops);
+  desc = arm_fbsd_read_description_auxv (this);
   if (desc == NULL)
-    desc = ops->beneath->to_read_description (ops->beneath);
+    desc = this->beneath->read_description ();
   return desc;
 }
 
 void
 _initialize_arm_fbsd_nat (void)
 {
-  struct target_ops *t;
-
-  t = inf_ptrace_target ();
-  t->to_fetch_registers = arm_fbsd_fetch_inferior_registers;
-  t->to_store_registers = arm_fbsd_store_inferior_registers;
-  t->to_read_description = arm_fbsd_read_description;
-  fbsd_nat_add_target (t);
+  add_target (&the_arm_fbsd_nat_target);
 }
diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c
index d41ef72..4b528d7 100644
--- a/gdb/arm-linux-nat.c
+++ b/gdb/arm-linux-nat.c
@@ -66,6 +66,38 @@
 
 extern int arm_apcs_32;
 
+class arm_linux_nat_target final : public linux_nat_target
+{
+public:
+  /* Add our register access methods.  */
+  void fetch_registers (struct regcache *, int) override;
+  void store_registers (struct regcache *, int) override;
+
+  /* Add our hardware breakpoint and watchpoint implementation.  */
+  int can_use_hw_breakpoint (enum bptype, int, int) override;
+
+  int insert_hw_breakpoint (struct gdbarch *, struct bp_target_info *) override;
+
+  int remove_hw_breakpoint (struct gdbarch *, struct bp_target_info *) override;
+
+  int region_ok_for_hw_watchpoint (CORE_ADDR, int) override;
+
+  int insert_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
+			 struct expression *) override;
+
+  int remove_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
+			 struct expression *) override;
+  int stopped_by_watchpoint () override;
+
+  int stopped_data_address (CORE_ADDR *) override;
+
+  int watchpoint_addr_within_range (CORE_ADDR, CORE_ADDR, int) override;
+
+  const struct target_desc *read_description () override;
+};
+
+static arm_linux_nat_target the_arm_linux_nat_target;
+
 /* Get the whole floating point state of the process and store it
    into regcache.  */
 
@@ -374,9 +406,8 @@ store_vfp_regs (const struct regcache *regcache)
    regno == -1, otherwise fetch all general registers or all floating
    point registers depending upon the value of regno.  */
 
-static void
-arm_linux_fetch_inferior_registers (struct target_ops *ops,
-				    struct regcache *regcache, int regno)
+void
+arm_linux_nat_target::fetch_registers (struct regcache *regcache, int regno)
 {
   struct gdbarch *gdbarch = regcache->arch ();
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
@@ -412,9 +443,8 @@ arm_linux_fetch_inferior_registers (struct target_ops *ops,
    regno == -1, otherwise store all general registers or all floating
    point registers depending upon the value of regno.  */
 
-static void
-arm_linux_store_inferior_registers (struct target_ops *ops,
-				    struct regcache *regcache, int regno)
+void
+arm_linux_nat_target::store_registers (struct regcache *regcache, int regno)
 {
   struct gdbarch *gdbarch = regcache->arch ();
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
@@ -495,8 +525,8 @@ ps_get_thread_area (struct ps_prochandle *ph,
   return PS_OK;
 }
 
-static const struct target_desc *
-arm_linux_read_description (struct target_ops *ops)
+const struct target_desc *
+arm_linux_nat_target::read_description ()
 {
   CORE_ADDR arm_hwcap = 0;
 
@@ -516,9 +546,9 @@ arm_linux_read_description (struct target_ops *ops)
 	have_ptrace_getregset = TRIBOOL_TRUE;
     }
 
-  if (target_auxv_search (ops, AT_HWCAP, &arm_hwcap) != 1)
+  if (target_auxv_search (this, AT_HWCAP, &arm_hwcap) != 1)
     {
-      return ops->beneath->to_read_description (ops->beneath);
+      return this->beneath->read_description ();
     }
 
   if (arm_hwcap & HWCAP_IWMMXT)
@@ -551,7 +581,7 @@ arm_linux_read_description (struct target_ops *ops)
       return result;
     }
 
-  return ops->beneath->to_read_description (ops->beneath);
+  return this->beneath->read_description ();
 }
 
 /* Information describing the hardware breakpoint capabilities.  */
@@ -635,10 +665,9 @@ arm_linux_get_hw_watchpoint_count (void)
 
 /* Have we got a free break-/watch-point available for use?  Returns -1 if
    there is not an appropriate resource available, otherwise returns 1.  */
-static int
-arm_linux_can_use_hw_breakpoint (struct target_ops *self,
-				 enum bptype type,
-				 int cnt, int ot)
+int
+arm_linux_nat_target::can_use_hw_break[...]

[diff truncated at 100000 bytes]


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