mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-15 04:31:49 +08:00
481695ed5f
These prototypes were required when compiling GDB as C but are not required for C++. gdb/ChangeLog: * aarch64-linux-nat.c: Remove _initialize_aarch64_linux_nat prototype. * aarch64-linux-tdep.c: Remove _initialize_aarch64_linux_tdep prototype. * aarch64-newlib-tdep.c: Remove _initialize_aarch64_newlib_tdep prototype. * aarch64-tdep.c: Remove _initialize_aarch64_tdep prototype. * ada-exp.y: Remove _initialize_ada_exp prototype. * ada-lang.c: Remove _initialize_ada_language prototype. * ada-tasks.c: Remove _initialize_tasks prototype. * addrmap.c: Remove _initialize_addrmap prototype. * agent.c: Remove _initialize_agent prototype. * aix-thread.c: Remove _initialize_aix_thread prototype. * alpha-bsd-nat.c: Remove _initialize_alphabsd_nat prototype. * alpha-linux-nat.c: Remove _initialize_alpha_linux_nat prototype. * alpha-linux-tdep.c: Remove _initialize_alpha_linux_tdep prototype. * alpha-nbsd-tdep.c: Remove _initialize_alphanbsd_tdep prototype. * alpha-obsd-tdep.c: Remove _initialize_alphaobsd_tdep prototype. * alpha-tdep.c: Remove _initialize_alpha_tdep prototype. * amd64-darwin-tdep.c: Remove _initialize_amd64_darwin_tdep prototype. * amd64-dicos-tdep.c: Remove _initialize_amd64_dicos_tdep prototype. * amd64-fbsd-nat.c: Remove _initialize_amd64fbsd_nat prototype. * amd64-fbsd-tdep.c: Remove _initialize_amd64fbsd_tdep prototype. * amd64-linux-nat.c: Remove _initialize_amd64_linux_nat prototype. * amd64-linux-tdep.c: Remove _initialize_amd64_linux_tdep prototype. * amd64-nbsd-nat.c: Remove _initialize_amd64nbsd_nat prototype. * amd64-nbsd-tdep.c: Remove _initialize_amd64nbsd_tdep prototype. * amd64-obsd-nat.c: Remove _initialize_amd64obsd_nat prototype. * amd64-obsd-tdep.c: Remove _initialize_amd64obsd_tdep prototype. * amd64-sol2-tdep.c: Remove _initialize_amd64_sol2_tdep prototype. * amd64-tdep.c: Remove _initialize_amd64_tdep prototype. * amd64-windows-nat.c: Remove _initialize_amd64_windows_nat prototype. * amd64-windows-tdep.c: Remove _initialize_amd64_windows_tdep prototype. * annotate.c: Remove _initialize_annotate prototype. * arc-newlib-tdep.c: Remove _initialize_arc_newlib_tdep prototype. * arc-tdep.c: Remove _initialize_arc_tdep prototype. * arch-utils.c: Remove _initialize_gdbarch_utils prototype. * arm-linux-nat.c: Remove _initialize_arm_linux_nat prototype. * arm-linux-tdep.c: Remove _initialize_arm_linux_tdep prototype. * arm-nbsd-tdep.c: Remove _initialize_arm_netbsd_tdep prototype. * arm-obsd-tdep.c: Remove _initialize_armobsd_tdep prototype. * arm-symbian-tdep.c: Remove _initialize_arm_symbian_tdep prototype. * arm-tdep.c: Remove _initialize_arm_tdep prototype. * arm-wince-tdep.c: Remove _initialize_arm_wince_tdep prototype. * auto-load.c: Remove _initialize_auto_load prototype. * auxv.c: Remove _initialize_auxv prototype. * avr-tdep.c: Remove _initialize_avr_tdep prototype. * ax-gdb.c: Remove _initialize_ax_gdb prototype. * bfin-linux-tdep.c: Remove _initialize_bfin_linux_tdep prototype. * bfin-tdep.c: Remove _initialize_bfin_tdep prototype. * break-catch-sig.c: Remove _initialize_break_catch_sig prototype. * break-catch-syscall.c: Remove _initialize_break_catch_syscall prototype. * break-catch-throw.c: Remove _initialize_break_catch_throw prototype. * breakpoint.c: Remove _initialize_breakpoint prototype. * bsd-uthread.c: Remove _initialize_bsd_uthread prototype. * btrace.c: Remove _initialize_btrace prototype. * charset.c: Remove _initialize_charset prototype. * cli/cli-cmds.c: Remove _initialize_cli_cmds prototype. * cli/cli-dump.c: Remove _initialize_cli_dump prototype. * cli/cli-interp.c: Remove _initialize_cli_interp prototype. * cli/cli-logging.c: Remove _initialize_cli_logging prototype. * cli/cli-script.c: Remove _initialize_cli_script prototype. * coff-pe-read.c: Remove _initialize_coff_pe_read prototype. * coffread.c: Remove _initialize_coffread prototype. * compile/compile.c: Remove _initialize_compile prototype. * complaints.c: Remove _initialize_complaints prototype. * completer.c: Remove _initialize_completer prototype. * copying.awk: Remove _initialize_copying prototype. * copying.c: Regenerate. * core-regset.c: Remove _initialize_core_regset prototype. * corefile.c: Remove _initialize_core prototype. * corelow.c: Remove _initialize_corelow prototype. * cp-abi.c: Remove _initialize_cp_abi prototype. * cp-namespace.c: Remove _initialize_cp_namespace prototype. * cp-support.c: Remove _initialize_cp_support prototype. * cp-valprint.c: Remove _initialize_cp_valprint prototype. * cris-linux-tdep.c: Remove _initialize_cris_linux_tdep prototype. * cris-tdep.c: Remove _initialize_cris_tdep prototype. * ctf.c: Remove _initialize_ctf prototype. * d-lang.c: Remove _initialize_d_language prototype. * darwin-nat-info.c: Remove _initialize_darwin_info_commands prototype. * darwin-nat.c: Remove _initialize_darwin_inferior prototype. * dbxread.c: Remove _initialize_dbxread prototype. * dcache.c: Remove _initialize_dcache prototype. * demangle.c: Remove _initialize_demangler prototype. * disasm-selftests.c: Remove _initialize_disasm_selftests prototype. * disasm.c: Remove _initialize_disasm prototype. * dtrace-probe.c: Remove _initialize_dtrace_probe prototype. * dummy-frame.c: Remove _initialize_dummy_frame prototype. * dwarf2-frame-tailcall.c: Remove _initialize_tailcall_frame prototype. * dwarf2-frame.c: Remove _initialize_dwarf2_frame prototype. * dwarf2expr.c: Remove _initialize_dwarf2expr prototype. * dwarf2loc.c: Remove _initialize_dwarf2loc prototype. * dwarf2read.c: Remove _initialize_dwarf2_read prototype. * elfread.c: Remove _initialize_elfread prototype. * exec.c: Remove _initialize_exec prototype. * extension.c: Remove _initialize_extension prototype. * f-lang.c: Remove _initialize_f_language prototype. * f-valprint.c: Remove _initialize_f_valprint prototype. * fbsd-nat.c: Remove _initialize_fbsd_nat prototype. * fbsd-tdep.c: Remove _initialize_fbsd_tdep prototype. * filesystem.c: Remove _initialize_filesystem prototype. * findcmd.c: Remove _initialize_mem_search prototype. * fork-child.c: Remove _initialize_fork_child prototype. * frame-base.c: Remove _initialize_frame_base prototype. * frame-unwind.c: Remove _initialize_frame_unwind prototype. * frame.c: Remove _initialize_frame prototype. * frv-linux-tdep.c: Remove _initialize_frv_linux_tdep prototype. * frv-tdep.c: Remove _initialize_frv_tdep prototype. * ft32-tdep.c: Remove _initialize_ft32_tdep prototype. * gcore.c: Remove _initialize_gcore prototype. * gdb_bfd.c: Remove _initialize_gdb_bfd prototype. * gdbarch.c: Regenerate. * gdbarch.sh: Remove _initialize_gdbarch prototype. * gdbtypes.c: Remove _initialize_gdbtypes prototype. * gnu-nat.c: Remove _initialize_gnu_nat prototype. * gnu-v2-abi.c: Remove _initialize_gnu_v2_abi prototype. * gnu-v3-abi.c: Remove _initialize_gnu_v3_abi prototype. * go-lang.c: Remove _initialize_go_language prototype. * go32-nat.c: Remove _initialize_go32_nat prototype. * guile/guile.c: Remove _initialize_guile prototype. * h8300-tdep.c: Remove _initialize_h8300_tdep prototype. * hppa-linux-nat.c: Remove _initialize_hppa_linux_nat prototype. * hppa-linux-tdep.c: Remove _initialize_hppa_linux_tdep prototype. * hppa-nbsd-nat.c: Remove _initialize_hppanbsd_nat prototype. * hppa-nbsd-tdep.c: Remove _initialize_hppanbsd_tdep prototype. * hppa-obsd-nat.c: Remove _initialize_hppaobsd_nat prototype. * hppa-obsd-tdep.c: Remove _initialize_hppaobsd_tdep prototype. * hppa-tdep.c: Remove _initialize_hppa_tdep prototype. * i386-bsd-nat.c: Remove _initialize_i386bsd_nat prototype. * i386-cygwin-tdep.c: Remove _initialize_i386_cygwin_tdep prototype. * i386-darwin-tdep.c: Remove _initialize_i386_darwin_tdep prototype. * i386-dicos-tdep.c: Remove _initialize_i386_dicos_tdep prototype. * i386-fbsd-nat.c: Remove _initialize_i386fbsd_nat prototype. * i386-fbsd-tdep.c: Remove _initialize_i386fbsd_tdep prototype. * i386-gnu-nat.c: Remove _initialize_i386gnu_nat prototype. * i386-gnu-tdep.c: Remove _initialize_i386gnu_tdep prototype. * i386-linux-nat.c: Remove _initialize_i386_linux_nat prototype. * i386-linux-tdep.c: Remove _initialize_i386_linux_tdep prototype. * i386-nbsd-nat.c: Remove _initialize_i386nbsd_nat prototype. * i386-nbsd-tdep.c: Remove _initialize_i386nbsd_tdep prototype. * i386-nto-tdep.c: Remove _initialize_i386nto_tdep prototype. * i386-obsd-nat.c: Remove _initialize_i386obsd_nat prototype. * i386-obsd-tdep.c: Remove _initialize_i386obsd_tdep prototype. * i386-sol2-nat.c: Remove _initialize_amd64_sol2_nat prototype. * i386-sol2-tdep.c: Remove _initialize_amd64_sol2_tdep prototype. * i386-tdep.c: Remove _initialize_i386_tdep prototype. * i386-windows-nat.c: Remove _initialize_i386_windows_nat prototype. * ia64-libunwind-tdep.c: Remove _initialize_libunwind_frame prototype. * ia64-linux-nat.c: Remove _initialize_ia64_linux_nat prototype. * ia64-linux-tdep.c: Remove _initialize_ia64_linux_tdep prototype. * ia64-tdep.c: Remove _initialize_ia64_tdep prototype. * ia64-vms-tdep.c: Remove _initialize_ia64_vms_tdep prototype. * infcall.c: Remove _initialize_infcall prototype. * infcmd.c: Remove _initialize_infcmd prototype. * inferior.c: Remove _initialize_inferiors prototype. * inflow.c: Remove _initialize_inflow prototype. * infrun.c: Remove _initialize_infrun prototype. * interps.c: Remove _initialize_interpreter prototype. * iq2000-tdep.c: Remove _initialize_iq2000_tdep prototype. * jit.c: Remove _initialize_jit prototype. * language.c: Remove _initialize_language prototype. * linux-fork.c: Remove _initialize_linux_fork prototype. * linux-nat.c: Remove _initialize_linux_nat prototype. * linux-tdep.c: Remove _initialize_linux_tdep prototype. * linux-thread-db.c: Remove _initialize_thread_db prototype. * lm32-tdep.c: Remove _initialize_lm32_tdep prototype. * m2-lang.c: Remove _initialize_m2_language prototype. * m32c-tdep.c: Remove _initialize_m32c_tdep prototype. * m32r-linux-nat.c: Remove _initialize_m32r_linux_nat prototype. * m32r-linux-tdep.c: Remove _initialize_m32r_linux_tdep prototype. * m32r-tdep.c: Remove _initialize_m32r_tdep prototype. * m68hc11-tdep.c: Remove _initialize_m68hc11_tdep prototype. * m68k-bsd-nat.c: Remove _initialize_m68kbsd_nat prototype. * m68k-bsd-tdep.c: Remove _initialize_m68kbsd_tdep prototype. * m68k-linux-nat.c: Remove _initialize_m68k_linux_tdep prototype. * m68k-linux-tdep.c: Remove _initialize_m68k_linux_tdep prototype. * m68k-tdep.c: Remove _initialize_m68k_tdep prototype. * m88k-bsd-nat.c: Remove _initialize_m68kbsd_nat prototype. * m88k-tdep.c: Remove _initialize_m68kbsd_tdep prototype. * machoread.c: Remove _initialize_machoread prototype. * macrocmd.c: Remove _initialize_macrocmd prototype. * macroscope.c: Remove _initialize_macroscope prototype. * maint.c: Remove _initialize_maint_cmds prototype. * mdebugread.c: Remove _initialize_mdebugread prototype. * memattr.c: Remove _initialize_mem prototype. * mep-tdep.c: Remove _initialize_mep_tdep prototype. * mi/mi-cmd-env.c: Remove _initialize_mi_cmd_env prototype. * mi/mi-cmds.c: Remove _initialize_mi_cmds prototype. * mi/mi-interp.c: Remove _initialize_mi_interp prototype. * mi/mi-main.c: Remove _initialize_mi_main prototype. * microblaze-linux-tdep.c: Remove _initialize_microblaze_linux_tdep prototype. * microblaze-tdep.c: Remove _initialize_microblaze_tdep prototype. * mips-fbsd-nat.c: Remove _initialize_mips_fbsd_nat prototype. * mips-fbsd-tdep.c: Remove _initialize_mips_fbsd_tdep prototype. * mips-linux-nat.c: Remove _initialize_mips_linux_nat prototype. * mips-linux-tdep.c: Remove _initialize_mips_linux_tdep prototype. * mips-nbsd-nat.c: Remove _initialize_mipsnbsd_nat prototype. * mips-nbsd-tdep.c: Remove _initialize_mipsnbsd_tdep prototype. * mips-sde-tdep.c: Remove _initialize_mips_sde_tdep prototype. * mips-tdep.c: Remove _initialize_mips_tdep prototype. * mips64-obsd-nat.c: Remove _initialize_mips64obsd_nat prototype. * mips64-obsd-tdep.c: Remove _initialize_mips64obsd_tdep prototype. * mipsread.c: Remove _initialize_mipsread prototype. * mn10300-linux-tdep.c: Remove _initialize_mn10300_linux_tdep prototype. * mn10300-tdep.c: Remove _initialize_mn10300_tdep prototype. * moxie-tdep.c: Remove _initialize_moxie_tdep prototype. * msp430-tdep.c: Remove _initialize_msp430_tdep prototype. * mt-tdep.c: Remove _initialize_mt_tdep prototype. * nds32-tdep.c: Remove _initialize_nds32_tdep prototype. * nios2-linux-tdep.c: Remove _initialize_nios2_linux_tdep prototype. * nios2-tdep.c: Remove _initialize_nios2_tdep prototype. * nto-procfs.c: Remove _initialize_procfs prototype. * nto-tdep.c: Remove _initialize_nto_tdep prototype. * objc-lang.c: Remove _initialize_objc_language prototype. * objfiles.c: Remove _initialize_objfiles prototype. * observer.c: Remove observer_test_first_notification_function, observer_test_second_notification_function, observer_test_third_notification_function, and _initialize_observer prototypes. * opencl-lang.c: Remove _initialize_opencl_language prototypes. * osabi.c: Remove _initialize_gdb_osabi prototype. * osdata.c: Remove _initialize_osdata prototype. * p-valprint.c: Remove _initialize_pascal_valprint prototype. * parse.c: Remove _initialize_parse prototype. * ppc-fbsd-nat.c: Remove _initialize_ppcfbsd_nat prototype. * ppc-fbsd-tdep.c: Remove _initialize_ppcfbsd_tdep prototype. * ppc-linux-nat.c: Remove _initialize_ppc_linux_nat prototype. * ppc-linux-tdep.c: Remove _initialize_ppc_linux_tdep prototype. * ppc-nbsd-nat.c: Remove _initialize_ppcnbsd_nat prototype. * ppc-nbsd-tdep.c: Remove _initialize_ppcnbsd_tdep prototype. * ppc-obsd-nat.c: Remove _initialize_ppcobsd_nat prototype. * ppc-obsd-tdep.c: Remove _initialize_ppcobsd_tdep prototype. * printcmd.c: Remove _initialize_printcmd prototype. * probe.c: Remove _initialize_probe prototype. * proc-api.c: Remove _initialize_proc_api prototype. * proc-events.c: Remove _initialize_proc_events prototype. * proc-service.c: Remove _initialize_proc_service prototype. * procfs.c: Remove _initialize_procfs prototype. * psymtab.c: Remove _initialize_psymtab prototype. * python/python.c: Remove _initialize_python prototype. * ravenscar-thread.c: Remove _initialize_ravenscar prototype. * record-btrace.c: Remove _initialize_record_btrace prototype. * record-full.c: Remove _initialize_record_full prototype. * record.c: Remove _initialize_record prototype. * regcache.c: Remove _initialize_regcache prototype. * reggroups.c: Remove _initialize_reggroup prototype. * remote-notif.c: Remove _initialize_notif prototype. * remote-sim.c: Remove _initialize_remote_sim prototype. * remote.c: Remove _initialize_remote prototype. * reverse.c: Remove _initialize_reverse prototype. * rl78-tdep.c: Remove _initialize_rl78_tdep prototype. * rs6000-aix-tdep.c: Remove _initialize_rs6000_aix_tdep prototype. * rs6000-lynx178-tdep.c: Remove _initialize_rs6000_lynx178_tdep prototype. * rs6000-nat.c: Remove _initialize_rs6000_nat prototype. * rs6000-tdep.c: Remove _initialize_rs6000_tdep prototype. * rust-exp.y: Remove _initialize_rust_exp prototype. * rx-tdep.c: Remove _initialize_rx_tdep prototype. * s390-linux-nat.c: Remove _initialize_s390_nat prototype. * s390-linux-tdep.c: Remove _initialize_s390_tdep prototype. * score-tdep.c: Remove _initialize_score_tdep prototype. * selftest-arch.c: Remove _initialize_selftests_foreach_arch prototype. * ser-go32.c: Remove _initialize_ser_dos prototype. * ser-mingw.c: Remove _initialize_ser_windows prototype. * ser-pipe.c: Remove _initialize_ser_pipe prototype. * ser-tcp.c: Remove _initialize_ser_tcp prototype. * ser-unix.c: Remove _initialize_ser_hardwire prototype. * serial.c: Remove _initialize_serial prototype. * sh-linux-tdep.c: Remove _initialize_sh_linux_tdep prototype. * sh-nbsd-nat.c: Remove _initialize_shnbsd_nat prototype. * sh-nbsd-tdep.c: Remove _initialize_shnbsd_tdep prototype. * sh-tdep.c: Remove _initialize_sh_tdep prototype. * skip.c: Remove _initialize_step_skip prototype. * sol-thread.c: Remove _initialize_sol_thread prototype. * solib-aix.c: Remove _initialize_solib_aix prototype. * solib-darwin.c: Remove _initialize_darwin_solib prototype. * solib-dsbt.c: Remove _initialize_dsbt_solib prototype. * solib-frv.c: Remove _initialize_frv_solib prototype. * solib-spu.c: Remove _initialize_spu_solib prototype. * solib-svr4.c: Remove _initialize_svr4_solib prototype. * solib-target.c: Remove _initialize_solib_target prototype. * solib.c: Remove _initialize_solib prototype. * source.c: Remove _initialize_source prototype. * sparc-linux-nat.c: Remove _initialize_sparc_linux_nat prototype. * sparc-linux-tdep.c: Remove _initialize_sparc_linux_tdep prototype. * sparc-nat.c: Remove _initialize_sparc_nat prototype. * sparc-nbsd-nat.c: Remove _initialize_sparcnbsd_nat prototype. * sparc-nbsd-tdep.c: Remove _initialize_sparcnbsd_tdep prototype. * sparc-obsd-tdep.c: Remove _initialize_sparc32obsd_tdep prototype. * sparc-sol2-nat.c: Remove _initialize_sparc_sol2_nat prototype. * sparc-sol2-tdep.c: Remove _initialize_sparc_sol2_tdep prototype. * sparc-tdep.c: Remove _initialize_sparc_tdep prototype. * sparc64-fbsd-nat.c: Remove _initialize_sparc64fbsd_nat prototype. * sparc64-fbsd-tdep.c: Remove _initialize_sparc64fbsd_tdep prototype. * sparc64-linux-nat.c: Remove _initialize_sparc64_linux_nat prototype. * sparc64-linux-tdep.c: Remove _initialize_sparc64_linux_tdep prototype. * sparc64-nat.c: Remove _initialize_sparc64_nat prototype. * sparc64-nbsd-nat.c: Remove _initialize_sparc64nbsd_nat prototype. * sparc64-nbsd-tdep.c: Remove _initialize_sparc64nbsd_tdep prototype. * sparc64-obsd-nat.c: Remove _initialize_sparc64obsd_nat prototype. * sparc64-obsd-tdep.c: Remove _initialize_sparc64obsd_tdep prototype. * sparc64-sol2-tdep.c: Remove _initialize_sparc64_sol2_tdep prototype. * spu-linux-nat.c: Remove _initialize_spu_nat prototype. * spu-multiarch.c: Remove _initialize_spu_multiarch prototype. * spu-tdep.c: Remove _initialize_spu_tdep prototype. * stabsread.c: Remove _initialize_stabsread prototype. * stack.c: Remove _initialize_stack prototype. * stap-probe.c: Remove _initialize_stap_probe prototype. * std-regs.c: Remove _initialize_frame_reg prototype. * symfile-debug.c: Remove _initialize_symfile_debug prototype. * symfile-mem.c: Remove _initialize_symfile_mem prototype. * symfile.c: Remove _initialize_symfile prototype. * symmisc.c: Remove _initialize_symmisc prototype. * symtab.c: Remove _initialize_symtab prototype. * target-dcache.c: Remove _initialize_target_dcache prototype. * target-descriptions.c: Remove _initialize_target_descriptions prototype. * thread.c: Remove _initialize_thread prototype. * tic6x-linux-tdep.c: Remove _initialize_tic6x_linux_tdep prototype. * tic6x-tdep.c: Remove _initialize_tic6x_tdep prototype. * tilegx-linux-nat.c: Remove _initialize_tile_linux_nat prototype. * tilegx-linux-tdep.c: Remove _initialize_tilegx_linux_tdep prototype. * tilegx-tdep.c: Remove _initialize_tilegx_tdep prototype. * tracefile-tfile.c: Remove _initialize_tracefile_tfile prototype. * tracefile.c: Remove _initialize_tracefile prototype. * tracepoint.c: Remove _initialize_tracepoint prototype. * tui/tui-hooks.c: Remove _initialize_tui_hooks prototype. * tui/tui-interp.c: Remove _initialize_tui_interp prototype. * tui/tui-layout.c: Remove _initialize_tui_layout prototype. * tui/tui-regs.c: Remove _initialize_tui_regs prototype. * tui/tui-stack.c: Remove _initialize_tui_stack prototype. * tui/tui-win.c: Remove _initialize_tui_win prototype. * tui/tui.c: Remove _initialize_tui prototype. * typeprint.c: Remove _initialize_typeprint prototype. * user-regs.c: Remove _initialize_user_regs prototype. * utils.c: Remove _initialize_utils prototype. * v850-tdep.c: Remove _initialize_v850_tdep prototype. * valarith.c: Remove _initialize_valarith prototype. * valops.c: Remove _initialize_valops prototype. * valprint.c: Remove _initialize_valprint prototype. * value.c: Remove _initialize_values prototype. * varobj.c: Remove _initialize_varobj prototype. * vax-bsd-nat.c: Remove _initialize_vaxbsd_nat prototype. * vax-nbsd-tdep.c: Remove _initialize_vaxnbsd_tdep prototype. * vax-tdep.c: Remove _initialize_vax_tdep prototype. * windows-nat.c: Remove _initialize_windows_nat, _initialize_check_for_gdb_ini, and _initialize_loadable prototypes. * windows-tdep.c: Remove _initialize_windows_tdep prototype. * xcoffread.c: Remove _initialize_xcoffread prototype. * xml-support.c: Remove _initialize_xml_support prototype. * xstormy16-tdep.c: Remove _initialize_xstormy16_tdep prototype. * xtensa-linux-nat.c: Remove _initialize_xtensa_linux_nat prototype. * xtensa-linux-tdep.c: Remove _initialize_xtensa_linux_tdep prototype. * xtensa-tdep.c: Remove _initialize_xtensa_tdep prototype.
926 lines
28 KiB
C
926 lines
28 KiB
C
/* DTrace probe support for GDB.
|
|
|
|
Copyright (C) 2014-2017 Free Software Foundation, Inc.
|
|
|
|
Contributed by Oracle, 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/>. */
|
|
|
|
#include "defs.h"
|
|
#include "probe.h"
|
|
#include "vec.h"
|
|
#include "elf-bfd.h"
|
|
#include "gdbtypes.h"
|
|
#include "obstack.h"
|
|
#include "objfiles.h"
|
|
#include "complaints.h"
|
|
#include "value.h"
|
|
#include "ax.h"
|
|
#include "ax-gdb.h"
|
|
#include "language.h"
|
|
#include "parser-defs.h"
|
|
#include "inferior.h"
|
|
|
|
/* The type of the ELF sections where we will find the DOF programs
|
|
with information about probes. */
|
|
|
|
#ifndef SHT_SUNW_dof
|
|
# define SHT_SUNW_dof 0x6ffffff4
|
|
#endif
|
|
|
|
/* Forward declaration. */
|
|
|
|
extern const struct probe_ops dtrace_probe_ops;
|
|
|
|
/* The following structure represents a single argument for the
|
|
probe. */
|
|
|
|
struct dtrace_probe_arg
|
|
{
|
|
/* The type of the probe argument. */
|
|
struct type *type;
|
|
|
|
/* A string describing the type. */
|
|
char *type_str;
|
|
|
|
/* The argument converted to an internal GDB expression. */
|
|
struct expression *expr;
|
|
};
|
|
|
|
typedef struct dtrace_probe_arg dtrace_probe_arg_s;
|
|
DEF_VEC_O (dtrace_probe_arg_s);
|
|
|
|
/* The following structure represents an enabler for a probe. */
|
|
|
|
struct dtrace_probe_enabler
|
|
{
|
|
/* Program counter where the is-enabled probe is installed. The
|
|
contents (nops, whatever...) stored at this address are
|
|
architecture dependent. */
|
|
CORE_ADDR address;
|
|
};
|
|
|
|
typedef struct dtrace_probe_enabler dtrace_probe_enabler_s;
|
|
DEF_VEC_O (dtrace_probe_enabler_s);
|
|
|
|
/* The following structure represents a dtrace probe. */
|
|
|
|
struct dtrace_probe
|
|
{
|
|
/* Generic information about the probe. This must be the first
|
|
element of this struct, in order to maintain binary compatibility
|
|
with the `struct probe' and be able to fully abstract it. */
|
|
struct probe p;
|
|
|
|
/* A probe can have zero or more arguments. */
|
|
int probe_argc;
|
|
VEC (dtrace_probe_arg_s) *args;
|
|
|
|
/* A probe can have zero or more "enablers" associated with it. */
|
|
VEC (dtrace_probe_enabler_s) *enablers;
|
|
|
|
/* Whether the expressions for the arguments have been built. */
|
|
unsigned int args_expr_built : 1;
|
|
};
|
|
|
|
/* Implementation of the probe_is_linespec method. */
|
|
|
|
static int
|
|
dtrace_probe_is_linespec (const char **linespecp)
|
|
{
|
|
static const char *const keywords[] = { "-pdtrace", "-probe-dtrace", NULL };
|
|
|
|
return probe_is_linespec_by_keyword (linespecp, keywords);
|
|
}
|
|
|
|
/* DOF programs can contain an arbitrary number of sections of 26
|
|
different types. In order to support DTrace USDT probes we only
|
|
need to handle a subset of these section types, fortunately. These
|
|
section types are defined in the following enumeration.
|
|
|
|
See linux/dtrace/dof_defines.h for a complete list of section types
|
|
along with their values. */
|
|
|
|
enum dtrace_dof_sect_type
|
|
{
|
|
/* Null section. */
|
|
DTRACE_DOF_SECT_TYPE_NONE = 0,
|
|
/* A dof_ecbdesc_t. */
|
|
DTRACE_DOF_SECT_TYPE_ECBDESC = 3,
|
|
/* A string table. */
|
|
DTRACE_DOF_SECT_TYPE_STRTAB = 8,
|
|
/* A dof_provider_t */
|
|
DTRACE_DOF_SECT_TYPE_PROVIDER = 15,
|
|
/* Array of dof_probe_t */
|
|
DTRACE_DOF_SECT_TYPE_PROBES = 16,
|
|
/* An array of probe arg mappings. */
|
|
DTRACE_DOF_SECT_TYPE_PRARGS = 17,
|
|
/* An array of probe arg offsets. */
|
|
DTRACE_DOF_SECT_TYPE_PROFFS = 18,
|
|
/* An array of probe is-enabled offsets. */
|
|
DTRACE_DOF_SECT_TYPE_PRENOFFS = 26
|
|
};
|
|
|
|
/* The following collection of data structures map the structure of
|
|
DOF entities. Again, we only cover the subset of DOF used to
|
|
implement USDT probes.
|
|
|
|
See linux/dtrace/dof.h header for a complete list of data
|
|
structures. */
|
|
|
|
/* Offsets to index the dofh_ident[] array defined below. */
|
|
|
|
enum dtrace_dof_ident
|
|
{
|
|
/* First byte of the magic number. */
|
|
DTRACE_DOF_ID_MAG0 = 0,
|
|
/* Second byte of the magic number. */
|
|
DTRACE_DOF_ID_MAG1 = 1,
|
|
/* Third byte of the magic number. */
|
|
DTRACE_DOF_ID_MAG2 = 2,
|
|
/* Fourth byte of the magic number. */
|
|
DTRACE_DOF_ID_MAG3 = 3,
|
|
/* An enum_dof_encoding value. */
|
|
DTRACE_DOF_ID_ENCODING = 5
|
|
};
|
|
|
|
/* Possible values for dofh_ident[DOF_ID_ENCODING]. */
|
|
|
|
enum dtrace_dof_encoding
|
|
{
|
|
/* The DOF program is little-endian. */
|
|
DTRACE_DOF_ENCODE_LSB = 1,
|
|
/* The DOF program is big-endian. */
|
|
DTRACE_DOF_ENCODE_MSB = 2
|
|
};
|
|
|
|
/* A DOF header, which describes the contents of a DOF program: number
|
|
of sections, size, etc. */
|
|
|
|
struct dtrace_dof_hdr
|
|
{
|
|
/* Identification bytes (see above). */
|
|
uint8_t dofh_ident[16];
|
|
/* File attribute flags (if any). */
|
|
uint32_t dofh_flags;
|
|
/* Size of file header in bytes. */
|
|
uint32_t dofh_hdrsize;
|
|
/* Size of section header in bytes. */
|
|
uint32_t dofh_secsize;
|
|
/* Number of section headers. */
|
|
uint32_t dofh_secnum;
|
|
/* File offset of section headers. */
|
|
uint64_t dofh_secoff;
|
|
/* File size of loadable portion. */
|
|
uint64_t dofh_loadsz;
|
|
/* File size of entire DOF file. */
|
|
uint64_t dofh_filesz;
|
|
/* Reserved for future use. */
|
|
uint64_t dofh_pad;
|
|
};
|
|
|
|
/* A DOF section, whose contents depend on its type. The several
|
|
supported section types are described in the enum
|
|
dtrace_dof_sect_type above. */
|
|
|
|
struct dtrace_dof_sect
|
|
{
|
|
/* Section type (see the define above). */
|
|
uint32_t dofs_type;
|
|
/* Section data memory alignment. */
|
|
uint32_t dofs_align;
|
|
/* Section flags (if any). */
|
|
uint32_t dofs_flags;
|
|
/* Size of section entry (if table). */
|
|
uint32_t dofs_entsize;
|
|
/* DOF + offset points to the section data. */
|
|
uint64_t dofs_offset;
|
|
/* Size of section data in bytes. */
|
|
uint64_t dofs_size;
|
|
};
|
|
|
|
/* A DOF provider, which is the provider of a probe. */
|
|
|
|
struct dtrace_dof_provider
|
|
{
|
|
/* Link to a DTRACE_DOF_SECT_TYPE_STRTAB section. */
|
|
uint32_t dofpv_strtab;
|
|
/* Link to a DTRACE_DOF_SECT_TYPE_PROBES section. */
|
|
uint32_t dofpv_probes;
|
|
/* Link to a DTRACE_DOF_SECT_TYPE_PRARGS section. */
|
|
uint32_t dofpv_prargs;
|
|
/* Link to a DTRACE_DOF_SECT_TYPE_PROFFS section. */
|
|
uint32_t dofpv_proffs;
|
|
/* Provider name string. */
|
|
uint32_t dofpv_name;
|
|
/* Provider attributes. */
|
|
uint32_t dofpv_provattr;
|
|
/* Module attributes. */
|
|
uint32_t dofpv_modattr;
|
|
/* Function attributes. */
|
|
uint32_t dofpv_funcattr;
|
|
/* Name attributes. */
|
|
uint32_t dofpv_nameattr;
|
|
/* Args attributes. */
|
|
uint32_t dofpv_argsattr;
|
|
/* Link to a DTRACE_DOF_SECT_PRENOFFS section. */
|
|
uint32_t dofpv_prenoffs;
|
|
};
|
|
|
|
/* A set of DOF probes and is-enabled probes sharing a base address
|
|
and several attributes. The particular locations and attributes of
|
|
each probe are maintained in arrays in several other DOF sections.
|
|
See the comment in dtrace_process_dof_probe for details on how
|
|
these attributes are stored. */
|
|
|
|
struct dtrace_dof_probe
|
|
{
|
|
/* Probe base address or offset. */
|
|
uint64_t dofpr_addr;
|
|
/* Probe function string. */
|
|
uint32_t dofpr_func;
|
|
/* Probe name string. */
|
|
uint32_t dofpr_name;
|
|
/* Native argument type strings. */
|
|
uint32_t dofpr_nargv;
|
|
/* Translated argument type strings. */
|
|
uint32_t dofpr_xargv;
|
|
/* Index of first argument mapping. */
|
|
uint32_t dofpr_argidx;
|
|
/* Index of first offset entry. */
|
|
uint32_t dofpr_offidx;
|
|
/* Native argument count. */
|
|
uint8_t dofpr_nargc;
|
|
/* Translated argument count. */
|
|
uint8_t dofpr_xargc;
|
|
/* Number of offset entries for probe. */
|
|
uint16_t dofpr_noffs;
|
|
/* Index of first is-enabled offset. */
|
|
uint32_t dofpr_enoffidx;
|
|
/* Number of is-enabled offsets. */
|
|
uint16_t dofpr_nenoffs;
|
|
/* Reserved for future use. */
|
|
uint16_t dofpr_pad1;
|
|
/* Reserved for future use. */
|
|
uint32_t dofpr_pad2;
|
|
};
|
|
|
|
/* DOF supports two different encodings: MSB (big-endian) and LSB
|
|
(little-endian). The encoding is itself encoded in the DOF header.
|
|
The following function returns an unsigned value in the host
|
|
endianness. */
|
|
|
|
#define DOF_UINT(dof, field) \
|
|
extract_unsigned_integer ((gdb_byte *) &(field), \
|
|
sizeof ((field)), \
|
|
(((dof)->dofh_ident[DTRACE_DOF_ID_ENCODING] \
|
|
== DTRACE_DOF_ENCODE_MSB) \
|
|
? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE))
|
|
|
|
/* The following macro applies a given byte offset to a DOF (a pointer
|
|
to a dtrace_dof_hdr structure) and returns the resulting
|
|
address. */
|
|
|
|
#define DTRACE_DOF_PTR(dof, offset) (&((char *) (dof))[(offset)])
|
|
|
|
/* The following macro returns a pointer to the beginning of a given
|
|
section in a DOF object. The section is referred to by its index
|
|
in the sections array. */
|
|
|
|
#define DTRACE_DOF_SECT(dof, idx) \
|
|
((struct dtrace_dof_sect *) \
|
|
DTRACE_DOF_PTR ((dof), \
|
|
DOF_UINT ((dof), (dof)->dofh_secoff) \
|
|
+ ((idx) * DOF_UINT ((dof), (dof)->dofh_secsize))))
|
|
|
|
/* Helper function to examine the probe described by the given PROBE
|
|
and PROVIDER data structures and add it to the PROBESP vector.
|
|
STRTAB, OFFTAB, EOFFTAB and ARGTAB are pointers to tables in the
|
|
DOF program containing the attributes for the probe. */
|
|
|
|
static void
|
|
dtrace_process_dof_probe (struct objfile *objfile,
|
|
struct gdbarch *gdbarch, VEC (probe_p) **probesp,
|
|
struct dtrace_dof_hdr *dof,
|
|
struct dtrace_dof_probe *probe,
|
|
struct dtrace_dof_provider *provider,
|
|
char *strtab, char *offtab, char *eofftab,
|
|
char *argtab, uint64_t strtab_size)
|
|
{
|
|
int i, j, num_probes, num_enablers;
|
|
struct cleanup *cleanup;
|
|
VEC (dtrace_probe_enabler_s) *enablers;
|
|
char *p;
|
|
|
|
/* Each probe section can define zero or more probes of two
|
|
different types:
|
|
|
|
- probe->dofpr_noffs regular probes whose program counters are
|
|
stored in 32bit words starting at probe->dofpr_addr +
|
|
offtab[probe->dofpr_offidx].
|
|
|
|
- probe->dofpr_nenoffs is-enabled probes whose program counters
|
|
are stored in 32bit words starting at probe->dofpr_addr +
|
|
eofftab[probe->dofpr_enoffidx].
|
|
|
|
However is-enabled probes are not probes per-se, but an
|
|
optimization hack that is implemented in the kernel in a very
|
|
similar way than normal probes. This is how we support
|
|
is-enabled probes on GDB:
|
|
|
|
- Our probes are always DTrace regular probes.
|
|
|
|
- Our probes can be associated with zero or more "enablers". The
|
|
list of enablers is built from the is-enabled probes defined in
|
|
the Probe section.
|
|
|
|
- Probes having a non-empty list of enablers can be enabled or
|
|
disabled using the `enable probe' and `disable probe' commands
|
|
respectively. The `Enabled' column in the output of `info
|
|
probes' will read `yes' if the enablers are activated, `no'
|
|
otherwise.
|
|
|
|
- Probes having an empty list of enablers are always enabled.
|
|
The `Enabled' column in the output of `info probes' will
|
|
read `always'.
|
|
|
|
It follows that if there are DTrace is-enabled probes defined for
|
|
some provider/name but no DTrace regular probes defined then the
|
|
GDB user wont be able to enable/disable these conditionals. */
|
|
|
|
num_probes = DOF_UINT (dof, probe->dofpr_noffs);
|
|
if (num_probes == 0)
|
|
return;
|
|
|
|
/* Build the list of enablers for the probes defined in this Probe
|
|
DOF section. */
|
|
enablers = NULL;
|
|
cleanup
|
|
= make_cleanup (VEC_cleanup (dtrace_probe_enabler_s), &enablers);
|
|
num_enablers = DOF_UINT (dof, probe->dofpr_nenoffs);
|
|
for (i = 0; i < num_enablers; i++)
|
|
{
|
|
struct dtrace_probe_enabler enabler;
|
|
uint32_t enabler_offset
|
|
= ((uint32_t *) eofftab)[DOF_UINT (dof, probe->dofpr_enoffidx) + i];
|
|
|
|
enabler.address = DOF_UINT (dof, probe->dofpr_addr)
|
|
+ DOF_UINT (dof, enabler_offset);
|
|
VEC_safe_push (dtrace_probe_enabler_s, enablers, &enabler);
|
|
}
|
|
|
|
for (i = 0; i < num_probes; i++)
|
|
{
|
|
uint32_t probe_offset
|
|
= ((uint32_t *) offtab)[DOF_UINT (dof, probe->dofpr_offidx) + i];
|
|
struct dtrace_probe *ret =
|
|
XOBNEW (&objfile->per_bfd->storage_obstack, struct dtrace_probe);
|
|
|
|
ret->p.pops = &dtrace_probe_ops;
|
|
ret->p.arch = gdbarch;
|
|
ret->args_expr_built = 0;
|
|
|
|
/* Set the provider and the name of the probe. */
|
|
ret->p.provider
|
|
= xstrdup (strtab + DOF_UINT (dof, provider->dofpv_name));
|
|
ret->p.name = xstrdup (strtab + DOF_UINT (dof, probe->dofpr_name));
|
|
|
|
/* The probe address. */
|
|
ret->p.address
|
|
= DOF_UINT (dof, probe->dofpr_addr) + DOF_UINT (dof, probe_offset);
|
|
|
|
/* Number of arguments in the probe. */
|
|
ret->probe_argc = DOF_UINT (dof, probe->dofpr_nargc);
|
|
|
|
/* Store argument type descriptions. A description of the type
|
|
of the argument is in the (J+1)th null-terminated string
|
|
starting at 'strtab' + 'probe->dofpr_nargv'. */
|
|
ret->args = NULL;
|
|
p = strtab + DOF_UINT (dof, probe->dofpr_nargv);
|
|
for (j = 0; j < ret->probe_argc; j++)
|
|
{
|
|
struct dtrace_probe_arg arg;
|
|
expression_up expr;
|
|
|
|
/* Set arg.expr to ensure all fields in expr are initialized and
|
|
the compiler will not warn when arg is used. */
|
|
arg.expr = NULL;
|
|
arg.type_str = xstrdup (p);
|
|
|
|
/* Use strtab_size as a sentinel. */
|
|
while (*p++ != '\0' && p - strtab < strtab_size)
|
|
;
|
|
|
|
/* Try to parse a type expression from the type string. If
|
|
this does not work then we set the type to `long
|
|
int'. */
|
|
arg.type = builtin_type (gdbarch)->builtin_long;
|
|
|
|
TRY
|
|
{
|
|
expr = parse_expression_with_language (arg.type_str, language_c);
|
|
}
|
|
CATCH (ex, RETURN_MASK_ERROR)
|
|
{
|
|
}
|
|
END_CATCH
|
|
|
|
if (expr != NULL && expr->elts[0].opcode == OP_TYPE)
|
|
arg.type = expr->elts[1].type;
|
|
|
|
VEC_safe_push (dtrace_probe_arg_s, ret->args, &arg);
|
|
}
|
|
|
|
/* Add the vector of enablers to this probe, if any. */
|
|
ret->enablers = VEC_copy (dtrace_probe_enabler_s, enablers);
|
|
|
|
/* Successfully created probe. */
|
|
VEC_safe_push (probe_p, *probesp, (struct probe *) ret);
|
|
}
|
|
|
|
do_cleanups (cleanup);
|
|
}
|
|
|
|
/* Helper function to collect the probes described in the DOF program
|
|
whose header is pointed by DOF and add them to the PROBESP vector.
|
|
SECT is the ELF section containing the DOF program and OBJFILE is
|
|
its containing object file. */
|
|
|
|
static void
|
|
dtrace_process_dof (asection *sect, struct objfile *objfile,
|
|
VEC (probe_p) **probesp, struct dtrace_dof_hdr *dof)
|
|
{
|
|
struct gdbarch *gdbarch = get_objfile_arch (objfile);
|
|
struct dtrace_dof_sect *section;
|
|
int i;
|
|
|
|
/* The first step is to check for the DOF magic number. If no valid
|
|
DOF data is found in the section then a complaint is issued to
|
|
the user and the section skipped. */
|
|
if (dof->dofh_ident[DTRACE_DOF_ID_MAG0] != 0x7F
|
|
|| dof->dofh_ident[DTRACE_DOF_ID_MAG1] != 'D'
|
|
|| dof->dofh_ident[DTRACE_DOF_ID_MAG2] != 'O'
|
|
|| dof->dofh_ident[DTRACE_DOF_ID_MAG3] != 'F')
|
|
goto invalid_dof_data;
|
|
|
|
/* Make sure the encoding mark is either DTRACE_DOF_ENCODE_LSB or
|
|
DTRACE_DOF_ENCODE_MSB. */
|
|
if (dof->dofh_ident[DTRACE_DOF_ID_ENCODING] != DTRACE_DOF_ENCODE_LSB
|
|
&& dof->dofh_ident[DTRACE_DOF_ID_ENCODING] != DTRACE_DOF_ENCODE_MSB)
|
|
goto invalid_dof_data;
|
|
|
|
/* Make sure this DOF is not an enabling DOF, i.e. there are no ECB
|
|
Description sections. */
|
|
section = (struct dtrace_dof_sect *) DTRACE_DOF_PTR (dof,
|
|
DOF_UINT (dof, dof->dofh_secoff));
|
|
for (i = 0; i < DOF_UINT (dof, dof->dofh_secnum); i++, section++)
|
|
if (section->dofs_type == DTRACE_DOF_SECT_TYPE_ECBDESC)
|
|
return;
|
|
|
|
/* Iterate over any section of type Provider and extract the probe
|
|
information from them. If there are no "provider" sections on
|
|
the DOF then we just return. */
|
|
section = (struct dtrace_dof_sect *) DTRACE_DOF_PTR (dof,
|
|
DOF_UINT (dof, dof->dofh_secoff));
|
|
for (i = 0; i < DOF_UINT (dof, dof->dofh_secnum); i++, section++)
|
|
if (DOF_UINT (dof, section->dofs_type) == DTRACE_DOF_SECT_TYPE_PROVIDER)
|
|
{
|
|
struct dtrace_dof_provider *provider = (struct dtrace_dof_provider *)
|
|
DTRACE_DOF_PTR (dof, DOF_UINT (dof, section->dofs_offset));
|
|
struct dtrace_dof_sect *strtab_s
|
|
= DTRACE_DOF_SECT (dof, DOF_UINT (dof, provider->dofpv_strtab));
|
|
struct dtrace_dof_sect *probes_s
|
|
= DTRACE_DOF_SECT (dof, DOF_UINT (dof, provider->dofpv_probes));
|
|
struct dtrace_dof_sect *args_s
|
|
= DTRACE_DOF_SECT (dof, DOF_UINT (dof, provider->dofpv_prargs));
|
|
struct dtrace_dof_sect *offsets_s
|
|
= DTRACE_DOF_SECT (dof, DOF_UINT (dof, provider->dofpv_proffs));
|
|
struct dtrace_dof_sect *eoffsets_s
|
|
= DTRACE_DOF_SECT (dof, DOF_UINT (dof, provider->dofpv_prenoffs));
|
|
char *strtab = DTRACE_DOF_PTR (dof, DOF_UINT (dof, strtab_s->dofs_offset));
|
|
char *offtab = DTRACE_DOF_PTR (dof, DOF_UINT (dof, offsets_s->dofs_offset));
|
|
char *eofftab = DTRACE_DOF_PTR (dof, DOF_UINT (dof, eoffsets_s->dofs_offset));
|
|
char *argtab = DTRACE_DOF_PTR (dof, DOF_UINT (dof, args_s->dofs_offset));
|
|
unsigned int entsize = DOF_UINT (dof, probes_s->dofs_entsize);
|
|
int num_probes;
|
|
|
|
if (DOF_UINT (dof, section->dofs_size)
|
|
< sizeof (struct dtrace_dof_provider))
|
|
{
|
|
/* The section is smaller than expected, so do not use it.
|
|
This has been observed on x86-solaris 10. */
|
|
goto invalid_dof_data;
|
|
}
|
|
|
|
/* Very, unlikely, but could crash gdb if not handled
|
|
properly. */
|
|
if (entsize == 0)
|
|
goto invalid_dof_data;
|
|
|
|
num_probes = DOF_UINT (dof, probes_s->dofs_size) / entsize;
|
|
|
|
for (i = 0; i < num_probes; i++)
|
|
{
|
|
struct dtrace_dof_probe *probe = (struct dtrace_dof_probe *)
|
|
DTRACE_DOF_PTR (dof, DOF_UINT (dof, probes_s->dofs_offset)
|
|
+ (i * DOF_UINT (dof, probes_s->dofs_entsize)));
|
|
|
|
dtrace_process_dof_probe (objfile,
|
|
gdbarch, probesp,
|
|
dof, probe,
|
|
provider, strtab, offtab, eofftab, argtab,
|
|
DOF_UINT (dof, strtab_s->dofs_size));
|
|
}
|
|
}
|
|
|
|
return;
|
|
|
|
invalid_dof_data:
|
|
complaint (&symfile_complaints,
|
|
_("skipping section '%s' which does not contain valid DOF data."),
|
|
sect->name);
|
|
}
|
|
|
|
/* Helper function to build the GDB internal expressiosn that, once
|
|
evaluated, will calculate the values of the arguments of a given
|
|
PROBE. */
|
|
|
|
static void
|
|
dtrace_build_arg_exprs (struct dtrace_probe *probe,
|
|
struct gdbarch *gdbarch)
|
|
{
|
|
struct parser_state pstate;
|
|
struct dtrace_probe_arg *arg;
|
|
int i;
|
|
|
|
probe->args_expr_built = 1;
|
|
|
|
/* Iterate over the arguments in the probe and build the
|
|
corresponding GDB internal expression that will generate the
|
|
value of the argument when executed at the PC of the probe. */
|
|
for (i = 0; i < probe->probe_argc; i++)
|
|
{
|
|
struct cleanup *back_to;
|
|
|
|
arg = VEC_index (dtrace_probe_arg_s, probe->args, i);
|
|
|
|
/* Initialize the expression buffer in the parser state. The
|
|
language does not matter, since we are using our own
|
|
parser. */
|
|
initialize_expout (&pstate, 10, current_language, gdbarch);
|
|
back_to = make_cleanup (free_current_contents, &pstate.expout);
|
|
|
|
/* The argument value, which is ABI dependent and casted to
|
|
`long int'. */
|
|
gdbarch_dtrace_parse_probe_argument (gdbarch, &pstate, i);
|
|
|
|
discard_cleanups (back_to);
|
|
|
|
/* Casting to the expected type, but only if the type was
|
|
recognized at probe load time. Otherwise the argument will
|
|
be evaluated as the long integer passed to the probe. */
|
|
if (arg->type != NULL)
|
|
{
|
|
write_exp_elt_opcode (&pstate, UNOP_CAST);
|
|
write_exp_elt_type (&pstate, arg->type);
|
|
write_exp_elt_opcode (&pstate, UNOP_CAST);
|
|
}
|
|
|
|
reallocate_expout (&pstate);
|
|
arg->expr = pstate.expout;
|
|
prefixify_expression (arg->expr);
|
|
}
|
|
}
|
|
|
|
/* Helper function to return the Nth argument of a given PROBE. */
|
|
|
|
static struct dtrace_probe_arg *
|
|
dtrace_get_arg (struct dtrace_probe *probe, unsigned n,
|
|
struct gdbarch *gdbarch)
|
|
{
|
|
if (!probe->args_expr_built)
|
|
dtrace_build_arg_exprs (probe, gdbarch);
|
|
|
|
return VEC_index (dtrace_probe_arg_s, probe->args, n);
|
|
}
|
|
|
|
/* Implementation of the get_probes method. */
|
|
|
|
static void
|
|
dtrace_get_probes (VEC (probe_p) **probesp, struct objfile *objfile)
|
|
{
|
|
bfd *abfd = objfile->obfd;
|
|
asection *sect = NULL;
|
|
|
|
/* Do nothing in case this is a .debug file, instead of the objfile
|
|
itself. */
|
|
if (objfile->separate_debug_objfile_backlink != NULL)
|
|
return;
|
|
|
|
/* Iterate over the sections in OBJFILE looking for DTrace
|
|
information. */
|
|
for (sect = abfd->sections; sect != NULL; sect = sect->next)
|
|
{
|
|
if (elf_section_data (sect)->this_hdr.sh_type == SHT_SUNW_dof)
|
|
{
|
|
bfd_byte *dof;
|
|
|
|
/* Read the contents of the DOF section and then process it to
|
|
extract the information of any probe defined into it. */
|
|
if (!bfd_malloc_and_get_section (abfd, sect, &dof))
|
|
complaint (&symfile_complaints,
|
|
_("could not obtain the contents of"
|
|
"section '%s' in objfile `%s'."),
|
|
sect->name, abfd->filename);
|
|
|
|
dtrace_process_dof (sect, objfile, probesp,
|
|
(struct dtrace_dof_hdr *) dof);
|
|
xfree (dof);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Helper function to determine whether a given probe is "enabled" or
|
|
"disabled". A disabled probe is a probe in which one or more
|
|
enablers are disabled. */
|
|
|
|
static int
|
|
dtrace_probe_is_enabled (struct dtrace_probe *probe)
|
|
{
|
|
int i;
|
|
struct gdbarch *gdbarch = probe->p.arch;
|
|
struct dtrace_probe_enabler *enabler;
|
|
|
|
for (i = 0;
|
|
VEC_iterate (dtrace_probe_enabler_s, probe->enablers, i, enabler);
|
|
i++)
|
|
if (!gdbarch_dtrace_probe_is_enabled (gdbarch, enabler->address))
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* Implementation of the get_probe_address method. */
|
|
|
|
static CORE_ADDR
|
|
dtrace_get_probe_address (struct probe *probe, struct objfile *objfile)
|
|
{
|
|
gdb_assert (probe->pops == &dtrace_probe_ops);
|
|
return probe->address + ANOFFSET (objfile->section_offsets,
|
|
SECT_OFF_DATA (objfile));
|
|
}
|
|
|
|
/* Implementation of the get_probe_argument_count method. */
|
|
|
|
static unsigned
|
|
dtrace_get_probe_argument_count (struct probe *probe_generic,
|
|
struct frame_info *frame)
|
|
{
|
|
struct dtrace_probe *dtrace_probe = (struct dtrace_probe *) probe_generic;
|
|
|
|
gdb_assert (probe_generic->pops == &dtrace_probe_ops);
|
|
|
|
return dtrace_probe->probe_argc;
|
|
}
|
|
|
|
/* Implementation of the can_evaluate_probe_arguments method. */
|
|
|
|
static int
|
|
dtrace_can_evaluate_probe_arguments (struct probe *probe_generic)
|
|
{
|
|
struct gdbarch *gdbarch = probe_generic->arch;
|
|
|
|
gdb_assert (probe_generic->pops == &dtrace_probe_ops);
|
|
return gdbarch_dtrace_parse_probe_argument_p (gdbarch);
|
|
}
|
|
|
|
/* Implementation of the evaluate_probe_argument method. */
|
|
|
|
static struct value *
|
|
dtrace_evaluate_probe_argument (struct probe *probe_generic, unsigned n,
|
|
struct frame_info *frame)
|
|
{
|
|
struct gdbarch *gdbarch = probe_generic->arch;
|
|
struct dtrace_probe *dtrace_probe = (struct dtrace_probe *) probe_generic;
|
|
struct dtrace_probe_arg *arg;
|
|
int pos = 0;
|
|
|
|
gdb_assert (probe_generic->pops == &dtrace_probe_ops);
|
|
|
|
arg = dtrace_get_arg (dtrace_probe, n, gdbarch);
|
|
return evaluate_subexp_standard (arg->type, arg->expr, &pos, EVAL_NORMAL);
|
|
}
|
|
|
|
/* Implementation of the compile_to_ax method. */
|
|
|
|
static void
|
|
dtrace_compile_to_ax (struct probe *probe_generic, struct agent_expr *expr,
|
|
struct axs_value *value, unsigned n)
|
|
{
|
|
struct dtrace_probe *dtrace_probe = (struct dtrace_probe *) probe_generic;
|
|
struct dtrace_probe_arg *arg;
|
|
union exp_element *pc;
|
|
|
|
gdb_assert (probe_generic->pops == &dtrace_probe_ops);
|
|
|
|
arg = dtrace_get_arg (dtrace_probe, n, expr->gdbarch);
|
|
|
|
pc = arg->expr->elts;
|
|
gen_expr (arg->expr, &pc, expr, value);
|
|
|
|
require_rvalue (expr, value);
|
|
value->type = arg->type;
|
|
}
|
|
|
|
/* Implementation of the probe_destroy method. */
|
|
|
|
static void
|
|
dtrace_probe_destroy (struct probe *probe_generic)
|
|
{
|
|
struct dtrace_probe *probe = (struct dtrace_probe *) probe_generic;
|
|
struct dtrace_probe_arg *arg;
|
|
int i;
|
|
|
|
gdb_assert (probe_generic->pops == &dtrace_probe_ops);
|
|
|
|
for (i = 0; VEC_iterate (dtrace_probe_arg_s, probe->args, i, arg); i++)
|
|
{
|
|
xfree (arg->type_str);
|
|
xfree (arg->expr);
|
|
}
|
|
|
|
VEC_free (dtrace_probe_enabler_s, probe->enablers);
|
|
VEC_free (dtrace_probe_arg_s, probe->args);
|
|
}
|
|
|
|
/* Implementation of the type_name method. */
|
|
|
|
static const char *
|
|
dtrace_type_name (struct probe *probe_generic)
|
|
{
|
|
gdb_assert (probe_generic->pops == &dtrace_probe_ops);
|
|
return "dtrace";
|
|
}
|
|
|
|
/* Implementation of the gen_info_probes_table_header method. */
|
|
|
|
static void
|
|
dtrace_gen_info_probes_table_header (VEC (info_probe_column_s) **heads)
|
|
{
|
|
info_probe_column_s dtrace_probe_column;
|
|
|
|
dtrace_probe_column.field_name = "enabled";
|
|
dtrace_probe_column.print_name = _("Enabled");
|
|
|
|
VEC_safe_push (info_probe_column_s, *heads, &dtrace_probe_column);
|
|
}
|
|
|
|
/* Implementation of the gen_info_probes_table_values method. */
|
|
|
|
static void
|
|
dtrace_gen_info_probes_table_values (struct probe *probe_generic,
|
|
VEC (const_char_ptr) **ret)
|
|
{
|
|
struct dtrace_probe *probe = (struct dtrace_probe *) probe_generic;
|
|
const char *val = NULL;
|
|
|
|
gdb_assert (probe_generic->pops == &dtrace_probe_ops);
|
|
|
|
if (VEC_empty (dtrace_probe_enabler_s, probe->enablers))
|
|
val = "always";
|
|
else if (!gdbarch_dtrace_probe_is_enabled_p (probe_generic->arch))
|
|
val = "unknown";
|
|
else if (dtrace_probe_is_enabled (probe))
|
|
val = "yes";
|
|
else
|
|
val = "no";
|
|
|
|
VEC_safe_push (const_char_ptr, *ret, val);
|
|
}
|
|
|
|
/* Implementation of the enable_probe method. */
|
|
|
|
static void
|
|
dtrace_enable_probe (struct probe *probe)
|
|
{
|
|
struct gdbarch *gdbarch = probe->arch;
|
|
struct dtrace_probe *dtrace_probe = (struct dtrace_probe *) probe;
|
|
struct dtrace_probe_enabler *enabler;
|
|
int i;
|
|
|
|
gdb_assert (probe->pops == &dtrace_probe_ops);
|
|
|
|
/* Enabling a dtrace probe implies patching the text section of the
|
|
running process, so make sure the inferior is indeed running. */
|
|
if (ptid_equal (inferior_ptid, null_ptid))
|
|
error (_("No inferior running"));
|
|
|
|
/* Fast path. */
|
|
if (dtrace_probe_is_enabled (dtrace_probe))
|
|
return;
|
|
|
|
/* Iterate over all defined enabler in the given probe and enable
|
|
them all using the corresponding gdbarch hook. */
|
|
|
|
for (i = 0;
|
|
VEC_iterate (dtrace_probe_enabler_s, dtrace_probe->enablers, i, enabler);
|
|
i++)
|
|
if (gdbarch_dtrace_enable_probe_p (gdbarch))
|
|
gdbarch_dtrace_enable_probe (gdbarch, enabler->address);
|
|
}
|
|
|
|
|
|
/* Implementation of the disable_probe method. */
|
|
|
|
static void
|
|
dtrace_disable_probe (struct probe *probe)
|
|
{
|
|
struct gdbarch *gdbarch = probe->arch;
|
|
struct dtrace_probe *dtrace_probe = (struct dtrace_probe *) probe;
|
|
struct dtrace_probe_enabler *enabler;
|
|
int i;
|
|
|
|
gdb_assert (probe->pops == &dtrace_probe_ops);
|
|
|
|
/* Disabling a dtrace probe implies patching the text section of the
|
|
running process, so make sure the inferior is indeed running. */
|
|
if (ptid_equal (inferior_ptid, null_ptid))
|
|
error (_("No inferior running"));
|
|
|
|
/* Fast path. */
|
|
if (!dtrace_probe_is_enabled (dtrace_probe))
|
|
return;
|
|
|
|
/* Are we trying to disable a probe that does not have any enabler
|
|
associated? */
|
|
if (VEC_empty (dtrace_probe_enabler_s, dtrace_probe->enablers))
|
|
error (_("Probe %s:%s cannot be disabled: no enablers."), probe->provider, probe->name);
|
|
|
|
/* Iterate over all defined enabler in the given probe and disable
|
|
them all using the corresponding gdbarch hook. */
|
|
|
|
for (i = 0;
|
|
VEC_iterate (dtrace_probe_enabler_s, dtrace_probe->enablers, i, enabler);
|
|
i++)
|
|
if (gdbarch_dtrace_disable_probe_p (gdbarch))
|
|
gdbarch_dtrace_disable_probe (gdbarch, enabler->address);
|
|
}
|
|
|
|
/* DTrace probe_ops. */
|
|
|
|
const struct probe_ops dtrace_probe_ops =
|
|
{
|
|
dtrace_probe_is_linespec,
|
|
dtrace_get_probes,
|
|
dtrace_get_probe_address,
|
|
dtrace_get_probe_argument_count,
|
|
dtrace_can_evaluate_probe_arguments,
|
|
dtrace_evaluate_probe_argument,
|
|
dtrace_compile_to_ax,
|
|
NULL, /* set_semaphore */
|
|
NULL, /* clear_semaphore */
|
|
dtrace_probe_destroy,
|
|
dtrace_type_name,
|
|
dtrace_gen_info_probes_table_header,
|
|
dtrace_gen_info_probes_table_values,
|
|
dtrace_enable_probe,
|
|
dtrace_disable_probe
|
|
};
|
|
|
|
/* Implementation of the `info probes dtrace' command. */
|
|
|
|
static void
|
|
info_probes_dtrace_command (char *arg, int from_tty)
|
|
{
|
|
info_probes_for_ops (arg, from_tty, &dtrace_probe_ops);
|
|
}
|
|
|
|
void
|
|
_initialize_dtrace_probe (void)
|
|
{
|
|
VEC_safe_push (probe_ops_cp, all_probe_ops, &dtrace_probe_ops);
|
|
|
|
add_cmd ("dtrace", class_info, info_probes_dtrace_command,
|
|
_("\
|
|
Show information about DTrace static probes.\n\
|
|
Usage: info probes dtrace [PROVIDER [NAME [OBJECT]]]\n\
|
|
Each argument is a regular expression, used to select probes.\n\
|
|
PROVIDER matches probe provider names.\n\
|
|
NAME matches the probe names.\n\
|
|
OBJECT matches the executable or shared library name."),
|
|
info_probes_cmdlist_get ());
|
|
}
|