diff options
Diffstat (limited to 'gdb/dtrace-probe.c')
-rw-r--r-- | gdb/dtrace-probe.c | 215 |
1 files changed, 107 insertions, 108 deletions
diff --git a/gdb/dtrace-probe.c b/gdb/dtrace-probe.c index 9805b8a..9cbfe63 100644 --- a/gdb/dtrace-probe.c +++ b/gdb/dtrace-probe.c @@ -38,7 +38,7 @@ with information about probes. */ #ifndef SHT_SUNW_dof -# define SHT_SUNW_dof 0x6ffffff4 +#define SHT_SUNW_dof 0x6ffffff4 #endif /* The following structure represents a single argument for the @@ -48,9 +48,11 @@ struct dtrace_probe_arg { dtrace_probe_arg (struct type *type_, std::string &&type_str_, expression_up &&expr_) - : type (type_), type_str (std::move (type_str_)), + : type (type_), + type_str (std::move (type_str_)), expr (std::move (expr_)) - {} + { + } /* The type of the probe argument. */ struct type *type; @@ -77,6 +79,7 @@ struct dtrace_probe_enabler class dtrace_static_probe_ops : public static_probe_ops { public: + /* See probe.h. */ bool is_linespec (const char **linespecp) const override; @@ -88,14 +91,11 @@ public: const char *type_name () const override; /* See probe.h. */ - bool can_enable () const override - { - return true; - } + bool can_enable () const override { return true; } /* See probe.h. */ - std::vector<struct info_probe_column> gen_info_probes_table_header - () const override; + std::vector<struct info_probe_column> + gen_info_probes_table_header () const override; }; /* DTrace static_probe_ops. */ @@ -107,16 +107,18 @@ const dtrace_static_probe_ops dtrace_static_probe_ops {}; class dtrace_probe : public probe { public: + /* Constructor for dtrace_probe. */ - dtrace_probe (std::string &&name_, std::string &&provider_, CORE_ADDR address_, - struct gdbarch *arch_, + dtrace_probe (std::string &&name_, std::string &&provider_, + CORE_ADDR address_, struct gdbarch *arch_, std::vector<struct dtrace_probe_arg> &&args_, std::vector<struct dtrace_probe_enabler> &&enablers_) : probe (std::move (name_), std::move (provider_), address_, arch_), m_args (std::move (args_)), m_enablers (std::move (enablers_)), m_args_expr_built (false) - {} + { + } /* See probe.h. */ CORE_ADDR get_relocated_address (struct objfile *objfile) override; @@ -128,12 +130,10 @@ public: bool can_evaluate_arguments () const override; /* See probe.h. */ - struct value *evaluate_argument (unsigned n, - frame_info_ptr frame) override; + struct value *evaluate_argument (unsigned n, frame_info_ptr frame) override; /* See probe.h. */ - void compile_to_ax (struct agent_expr *aexpr, - struct axs_value *axs_value, + void compile_to_ax (struct agent_expr *aexpr, struct axs_value *axs_value, unsigned n) override; /* See probe.h. */ @@ -162,6 +162,7 @@ public: bool is_enabled () const; private: + /* A probe can have zero or more arguments. */ std::vector<struct dtrace_probe_arg> m_args; @@ -241,21 +242,21 @@ struct dtrace_dof_hdr /* Identification bytes (see above). */ uint8_t dofh_ident[16]; /* File attribute flags (if any). */ - uint32_t dofh_flags; + uint32_t dofh_flags; /* Size of file header in bytes. */ - uint32_t dofh_hdrsize; + uint32_t dofh_hdrsize; /* Size of section header in bytes. */ - uint32_t dofh_secsize; + uint32_t dofh_secsize; /* Number of section headers. */ - uint32_t dofh_secnum; + uint32_t dofh_secnum; /* File offset of section headers. */ - uint64_t dofh_secoff; + uint64_t dofh_secoff; /* File size of loadable portion. */ - uint64_t dofh_loadsz; + uint64_t dofh_loadsz; /* File size of entire DOF file. */ - uint64_t dofh_filesz; + uint64_t dofh_filesz; /* Reserved for future use. */ - uint64_t dofh_pad; + uint64_t dofh_pad; }; /* A DOF section, whose contents depend on its type. The several @@ -267,15 +268,15 @@ struct dtrace_dof_sect /* Section type (see the define above). */ uint32_t dofs_type; /* Section data memory alignment. */ - uint32_t dofs_align; + uint32_t dofs_align; /* Section flags (if any). */ - uint32_t dofs_flags; + 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; + uint64_t dofs_size; }; /* A DOF provider, which is the provider of a probe. */ @@ -283,19 +284,19 @@ struct dtrace_dof_sect struct dtrace_dof_provider { /* Link to a DTRACE_DOF_SECT_TYPE_STRTAB section. */ - uint32_t dofpv_strtab; + uint32_t dofpv_strtab; /* Link to a DTRACE_DOF_SECT_TYPE_PROBES section. */ - uint32_t dofpv_probes; + uint32_t dofpv_probes; /* Link to a DTRACE_DOF_SECT_TYPE_PRARGS section. */ - uint32_t dofpv_prargs; + uint32_t dofpv_prargs; /* Link to a DTRACE_DOF_SECT_TYPE_PROFFS section. */ - uint32_t dofpv_proffs; + uint32_t dofpv_proffs; /* Provider name string. */ - uint32_t dofpv_name; + uint32_t dofpv_name; /* Provider attributes. */ uint32_t dofpv_provattr; /* Module attributes. */ - uint32_t dofpv_modattr; + uint32_t dofpv_modattr; /* Function attributes. */ uint32_t dofpv_funcattr; /* Name attributes. */ @@ -315,33 +316,33 @@ struct dtrace_dof_provider struct dtrace_dof_probe { /* Probe base address or offset. */ - uint64_t dofpr_addr; + uint64_t dofpr_addr; /* Probe function string. */ - uint32_t dofpr_func; + uint32_t dofpr_func; /* Probe name string. */ - uint32_t dofpr_name; + uint32_t dofpr_name; /* Native argument type strings. */ - uint32_t dofpr_nargv; + uint32_t dofpr_nargv; /* Translated argument type strings. */ - uint32_t dofpr_xargv; + uint32_t dofpr_xargv; /* Index of first argument mapping. */ - uint32_t dofpr_argidx; + uint32_t dofpr_argidx; /* Index of first offset entry. */ - uint32_t dofpr_offidx; + uint32_t dofpr_offidx; /* Native argument count. */ - uint8_t dofpr_nargc; + uint8_t dofpr_nargc; /* Translated argument count. */ - uint8_t dofpr_xargc; + uint8_t dofpr_xargc; /* Number of offset entries for probe. */ - uint16_t dofpr_noffs; + 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; + uint16_t dofpr_pad1; /* Reserved for future use. */ - uint32_t dofpr_pad2; + uint32_t dofpr_pad2; }; /* DOF supports two different encodings: MSB (big-endian) and LSB @@ -349,12 +350,12 @@ struct dtrace_dof_probe The following function returns an unsigned value in the host endianness. */ -#define DOF_UINT(dof, field) \ - extract_unsigned_integer ((gdb_byte *) &(field), \ - sizeof ((field)), \ +#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)) + == 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 @@ -366,11 +367,10 @@ struct dtrace_dof_probe 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)))) +#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. @@ -378,14 +378,13 @@ struct dtrace_dof_probe DOF program containing the attributes for the probe. */ static void -dtrace_process_dof_probe (struct objfile *objfile, - struct gdbarch *gdbarch, +dtrace_process_dof_probe (struct objfile *objfile, struct gdbarch *gdbarch, std::vector<std::unique_ptr<probe>> *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) + struct dtrace_dof_provider *provider, char *strtab, + char *offtab, char *eofftab, char *argtab, + uint64_t strtab_size) { int i, j, num_probes, num_enablers; char *p; @@ -440,8 +439,8 @@ dtrace_process_dof_probe (struct objfile *objfile, 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); + enabler.address + = DOF_UINT (dof, probe->dofpr_addr) + DOF_UINT (dof, enabler_offset); enablers.push_back (enabler); } @@ -500,11 +499,10 @@ dtrace_process_dof_probe (struct objfile *objfile, } std::vector<struct dtrace_probe_enabler> enablers_copy = enablers; - dtrace_probe *ret = new dtrace_probe (std::string (name), - std::string (probe_provider), - address, gdbarch, - std::move (args), - std::move (enablers_copy)); + dtrace_probe *ret + = new dtrace_probe (std::string (name), std::string (probe_provider), + address, gdbarch, std::move (args), + std::move (enablers_copy)); /* Successfully created probe. */ probesp->emplace_back (ret); @@ -542,8 +540,8 @@ dtrace_process_dof (asection *sect, struct objfile *objfile, /* 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)); + 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; @@ -551,8 +549,8 @@ dtrace_process_dof (asection *sect, struct objfile *objfile, /* 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)); + 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) { @@ -568,10 +566,14 @@ dtrace_process_dof (asection *sect, struct objfile *objfile, = 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)); + 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; @@ -592,23 +594,24 @@ dtrace_process_dof (asection *sect, struct objfile *objfile, 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, + 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 (_("skipping section '%s' which does not contain valid DOF data."), - sect->name); + +invalid_dof_data: + complaint ( + _ ("skipping section '%s' which does not contain valid DOF data."), + sect->name); } /* Implementation of 'build_arg_exprs' method. */ @@ -630,8 +633,8 @@ dtrace_probe::build_arg_exprs (struct gdbarch *gdbarch) /* The argument value, which is ABI dependent and casted to `long int'. */ - expr::operation_up op = gdbarch_dtrace_parse_probe_argument (gdbarch, - argc); + expr::operation_up op + = gdbarch_dtrace_parse_probe_argument (gdbarch, argc); /* Casting to the expected type, but only if the type was recognized at probe load time. Otherwise the argument will @@ -655,11 +658,10 @@ dtrace_probe::get_arg_by_number (unsigned n, struct gdbarch *gdbarch) this->build_arg_exprs (gdbarch); if (n > m_args.size ()) - internal_error (_("Probe '%s' has %d arguments, but GDB is requesting\n" - "argument %u. This should not happen. Please\n" - "report this bug."), - this->get_name ().c_str (), - (int) m_args.size (), n); + internal_error (_ ("Probe '%s' has %d arguments, but GDB is requesting\n" + "argument %u. This should not happen. Please\n" + "report this bug."), + this->get_name ().c_str (), (int) m_args.size (), n); return &m_args[n]; } @@ -707,8 +709,7 @@ dtrace_probe::can_evaluate_arguments () const /* Implementation of the evaluate_argument method. */ struct value * -dtrace_probe::evaluate_argument (unsigned n, - frame_info_ptr frame) +dtrace_probe::evaluate_argument (unsigned n, frame_info_ptr frame) { struct gdbarch *gdbarch = this->get_gdbarch (); struct dtrace_probe_arg *arg; @@ -769,7 +770,7 @@ dtrace_probe::enable () /* Enabling a dtrace probe implies patching the text section of the running process, so make sure the inferior is indeed running. */ if (inferior_ptid == null_ptid) - error (_("No inferior running")); + error (_ ("No inferior running")); /* Fast path. */ if (this->is_enabled ()) @@ -782,7 +783,6 @@ dtrace_probe::enable () gdbarch_dtrace_enable_probe (gdbarch, enabler.address); } - /* Implementation of the disable_probe method. */ void @@ -793,7 +793,7 @@ dtrace_probe::disable () /* Disabling a dtrace probe implies patching the text section of the running process, so make sure the inferior is indeed running. */ if (inferior_ptid == null_ptid) - error (_("No inferior running")); + error (_ ("No inferior running")); /* Fast path. */ if (!this->is_enabled ()) @@ -802,7 +802,7 @@ dtrace_probe::disable () /* Are we trying to disable a probe that does not have any enabler associated? */ if (m_enablers.empty ()) - error (_("Probe %s:%s cannot be disabled: no enablers."), + error (_ ("Probe %s:%s cannot be disabled: no enablers."), this->get_provider ().c_str (), this->get_name ().c_str ()); /* Iterate over all defined enabler in the given probe and disable @@ -825,9 +825,8 @@ dtrace_static_probe_ops::is_linespec (const char **linespecp) const /* Implementation of the get_probes method. */ void -dtrace_static_probe_ops::get_probes - (std::vector<std::unique_ptr<probe>> *probesp, - struct objfile *objfile) const +dtrace_static_probe_ops::get_probes ( + std::vector<std::unique_ptr<probe>> *probesp, struct objfile *objfile) const { bfd *abfd = objfile->obfd.get (); asection *sect = NULL; @@ -851,8 +850,8 @@ dtrace_static_probe_ops::get_probes dtrace_process_dof (sect, objfile, probesp, (struct dtrace_dof_hdr *) dof); else - complaint (_("could not obtain the contents of" - "section '%s' in objfile `%s'."), + complaint (_ ("could not obtain the contents of" + "section '%s' in objfile `%s'."), bfd_section_name (sect), bfd_get_filename (abfd)); xfree (dof); @@ -876,7 +875,7 @@ dtrace_static_probe_ops::gen_info_probes_table_header () const struct info_probe_column dtrace_probe_column; dtrace_probe_column.field_name = "enabled"; - dtrace_probe_column.print_name = _("Enabled"); + dtrace_probe_column.print_name = _ ("Enabled"); return std::vector<struct info_probe_column> { dtrace_probe_column }; } @@ -890,13 +889,13 @@ info_probes_dtrace_command (const char *arg, int from_tty) } void _initialize_dtrace_probe (); + void _initialize_dtrace_probe () { all_static_probe_ops.push_back (&dtrace_static_probe_ops); - add_cmd ("dtrace", class_info, info_probes_dtrace_command, - _("\ + 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\ |