/* Generic static probe support for GDB.
- Copyright (C) 2012-2015 Free Software Foundation, Inc.
+ Copyright (C) 2012-2016 Free Software Foundation, Inc.
This file is part of GDB.
#include "ax-gdb.h"
#include "location.h"
#include <ctype.h>
+#include <algorithm>
typedef struct bound_probe bound_probe_s;
DEF_VEC_O (bound_probe_s);
\f
+/* A helper for parse_probes that decodes a probe specification in
+ SEARCH_PSPACE. It appends matching SALs to RESULT. */
+
+static void
+parse_probes_in_pspace (const struct probe_ops *probe_ops,
+ struct program_space *search_pspace,
+ const char *objfile_namestr,
+ const char *provider,
+ const char *name,
+ struct symtabs_and_lines *result)
+{
+ struct objfile *objfile;
+
+ ALL_PSPACE_OBJFILES (search_pspace, objfile)
+ {
+ VEC (probe_p) *probes;
+ struct probe *probe;
+ int ix;
+
+ if (!objfile->sf || !objfile->sf->sym_probe_fns)
+ continue;
+
+ if (objfile_namestr
+ && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0
+ && FILENAME_CMP (lbasename (objfile_name (objfile)),
+ objfile_namestr) != 0)
+ continue;
+
+ probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
+
+ for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
+ {
+ struct symtab_and_line *sal;
+
+ if (probe_ops != &probe_ops_any && probe->pops != probe_ops)
+ continue;
+
+ if (provider && strcmp (probe->provider, provider) != 0)
+ continue;
+
+ if (strcmp (probe->name, name) != 0)
+ continue;
+
+ ++result->nelts;
+ result->sals = XRESIZEVEC (struct symtab_and_line, result->sals,
+ result->nelts);
+ sal = &result->sals[result->nelts - 1];
+
+ init_sal (sal);
+
+ sal->pc = get_probe_address (probe, objfile);
+ sal->explicit_pc = 1;
+ sal->section = find_pc_overlay (sal->pc);
+ sal->pspace = search_pspace;
+ sal->probe = probe;
+ sal->objfile = objfile;
+ }
+ }
+}
+
/* See definition in probe.h. */
struct symtabs_and_lines
parse_probes (const struct event_location *location,
+ struct program_space *search_pspace,
struct linespec_result *canonical)
{
char *arg_end, *arg;
char *objfile_namestr = NULL, *provider = NULL, *name, *p;
struct cleanup *cleanup;
struct symtabs_and_lines result;
- struct objfile *objfile;
- struct program_space *pspace;
const struct probe_ops *probe_ops;
const char *arg_start, *cs;
if (objfile_namestr && *objfile_namestr == '\0')
error (_("invalid objfile name"));
- ALL_PSPACES (pspace)
- ALL_PSPACE_OBJFILES (pspace, objfile)
- {
- VEC (probe_p) *probes;
- struct probe *probe;
- int ix;
-
- if (!objfile->sf || !objfile->sf->sym_probe_fns)
- continue;
-
- if (objfile_namestr
- && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0
- && FILENAME_CMP (lbasename (objfile_name (objfile)),
- objfile_namestr) != 0)
- continue;
-
- probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
-
- for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
- {
- struct symtab_and_line *sal;
-
- if (probe_ops != &probe_ops_any && probe->pops != probe_ops)
- continue;
-
- if (provider && strcmp (probe->provider, provider) != 0)
- continue;
-
- if (strcmp (probe->name, name) != 0)
- continue;
-
- ++result.nelts;
- result.sals = XRESIZEVEC (struct symtab_and_line, result.sals,
- result.nelts);
- sal = &result.sals[result.nelts - 1];
-
- init_sal (sal);
+ if (search_pspace != NULL)
+ {
+ parse_probes_in_pspace (probe_ops, search_pspace, objfile_namestr,
+ provider, name, &result);
+ }
+ else
+ {
+ struct program_space *pspace;
- sal->pc = get_probe_address (probe, objfile);
- sal->explicit_pc = 1;
- sal->section = find_pc_overlay (sal->pc);
- sal->pspace = pspace;
- sal->probe = probe;
- sal->objfile = objfile;
- }
- }
+ ALL_PSPACES (pspace)
+ parse_probes_in_pspace (probe_ops, pspace, objfile_namestr,
+ provider, name, &result);
+ }
if (result.nelts == 0)
{
if (val == NULL)
continue;
- size_max = max (strlen (val), size_max);
+ size_max = std::max (strlen (val), size_max);
}
do_cleanups (c2);
}
{
const char *probe_type = probe->probe->pops->type_name (probe->probe);
- size_type = max (strlen (probe_type), size_type);
- size_name = max (strlen (probe->probe->name), size_name);
- size_provider = max (strlen (probe->probe->provider), size_provider);
- size_objname = max (strlen (objfile_name (probe->objfile)), size_objname);
+ size_type = std::max (strlen (probe_type), size_type);
+ size_name = std::max (strlen (probe->probe->name), size_name);
+ size_provider = std::max (strlen (probe->probe->provider), size_provider);
+ size_objname = std::max (strlen (objfile_name (probe->objfile)),
+ size_objname);
}
ui_out_table_header (current_uiout, size_type, ui_left, "type", _("Type"));
do_cleanups (cleanup);
if (!any_found)
- ui_out_message (current_uiout, 0, _("No probes matched.\n"));
+ ui_out_message (current_uiout, _("No probes matched.\n"));
}
/* Implementation of the `info probes' command. */
probes = collect_probes (objname, provider, probe_name, NULL);
if (VEC_empty (bound_probe_s, probes))
{
- ui_out_message (current_uiout, 0, _("No probes matched.\n"));
+ ui_out_message (current_uiout, _("No probes matched.\n"));
do_cleanups (cleanup);
return;
}
if (pops->enable_probe != NULL)
{
pops->enable_probe (probe->probe);
- ui_out_message (current_uiout, 0,
+ ui_out_message (current_uiout,
_("Probe %s:%s enabled.\n"),
probe->probe->provider, probe->probe->name);
}
else
- ui_out_message (current_uiout, 0,
+ ui_out_message (current_uiout,
_("Probe %s:%s cannot be enabled.\n"),
probe->probe->provider, probe->probe->name);
}
probes = collect_probes (objname, provider, probe_name, NULL /* pops */);
if (VEC_empty (bound_probe_s, probes))
{
- ui_out_message (current_uiout, 0, _("No probes matched.\n"));
+ ui_out_message (current_uiout, _("No probes matched.\n"));
do_cleanups (cleanup);
return;
}
if (pops->disable_probe != NULL)
{
pops->disable_probe (probe->probe);
- ui_out_message (current_uiout, 0,
+ ui_out_message (current_uiout,
_("Probe %s:%s disabled.\n"),
probe->probe->provider, probe->probe->name);
}
else
- ui_out_message (current_uiout, 0,
+ ui_out_message (current_uiout,
_("Probe %s:%s cannot be disabled.\n"),
probe->probe->provider, probe->probe->name);
}