aboutsummaryrefslogtreecommitdiff
path: root/gdb/dtrace-probe.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/dtrace-probe.c')
-rw-r--r--gdb/dtrace-probe.c215
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\