X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fprobe.c;h=e3bc915ba7d7a784ae32dc07d4db112ba9f42cfd;hb=112e8700a6fd2fed65ca70132c9cbed4132e8bd4;hp=dce2b25967de09b3b74127ae41ef003356db1b32;hpb=9aca2ff83e4299875343cb07add9c0ef7e5f3188;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/probe.c b/gdb/probe.c index dce2b25967..e3bc915ba7 100644 --- a/gdb/probe.c +++ b/gdb/probe.c @@ -1,6 +1,6 @@ /* 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. @@ -33,33 +33,96 @@ #include "value.h" #include "ax.h" #include "ax-gdb.h" +#include "location.h" #include +#include typedef struct bound_probe bound_probe_s; DEF_VEC_O (bound_probe_s); +/* 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 (char **argptr, struct linespec_result *canonical) +parse_probes (const struct event_location *location, + struct program_space *search_pspace, + struct linespec_result *canonical) { - char *arg_start, *arg_end, *arg; + 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 *cs; + const char *arg_start, *cs; result.sals = NULL; result.nelts = 0; - arg_start = *argptr; + gdb_assert (event_location_type (location) == PROBE_LOCATION); + arg_start = get_probe_location (location); - cs = *argptr; + cs = arg_start; probe_ops = probe_linespec_to_ops (&cs); if (probe_ops == NULL) error (_("'%s' is not a probe linespec"), arg_start); @@ -111,53 +174,19 @@ parse_probes (char **argptr, struct linespec_result *canonical) 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 = xrealloc (result.sals, - result.nelts - * sizeof (struct symtab_and_line)); - 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) { @@ -170,12 +199,15 @@ parse_probes (char **argptr, struct linespec_result *canonical) if (canonical) { + char *canon; + + canon = savestring (arg_start, arg_end - arg_start); + make_cleanup (xfree, canon); canonical->special_display = 1; canonical->pre_expanded = 1; - canonical->addr_string = savestring (*argptr, arg_end - *argptr); + canonical->location = new_probe_location (canon); } - *argptr = arg_end; do_cleanups (cleanup); return result; @@ -401,13 +433,13 @@ gen_ui_out_table_header_info (VEC (bound_probe_s) *probes, if (val == NULL) continue; - size_max = max (strlen (val), size_max); + size_max = std::max (strlen (val), size_max); } do_cleanups (c2); } - ui_out_table_header (current_uiout, size_max, ui_left, - column->field_name, column->print_name); + current_uiout->table_header (size_max, ui_left, + column->field_name, column->print_name); } do_cleanups (c); @@ -433,7 +465,7 @@ print_ui_out_not_applicables (const struct probe_ops *pops) for (ix = 0; VEC_iterate (info_probe_column_s, headings, ix, column); ++ix) - ui_out_field_string (current_uiout, column->field_name, _("n/a")); + current_uiout->field_string (column->field_name, _("n/a")); do_cleanups (c); } @@ -479,9 +511,9 @@ print_ui_out_info (struct probe *probe) const char *val = VEC_index (const_char_ptr, values, j++); if (val == NULL) - ui_out_field_skip (current_uiout, column->field_name); + current_uiout->field_skip (column->field_name); else - ui_out_field_string (current_uiout, column->field_name, val); + current_uiout->field_string (column->field_name, val); } do_cleanups (c); @@ -613,17 +645,18 @@ info_probes_for_ops (const char *arg, int from_tty, { 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")); - ui_out_table_header (current_uiout, size_provider, ui_left, "provider", - _("Provider")); - ui_out_table_header (current_uiout, size_name, ui_left, "name", _("Name")); - ui_out_table_header (current_uiout, size_addr, ui_left, "addr", _("Where")); + current_uiout->table_header (size_type, ui_left, "type", _("Type")); + current_uiout->table_header (size_provider, ui_left, "provider", + _("Provider")); + current_uiout->table_header (size_name, ui_left, "name", _("Name")); + current_uiout->table_header (size_addr, ui_left, "addr", _("Where")); if (pops == NULL) { @@ -640,9 +673,8 @@ info_probes_for_ops (const char *arg, int from_tty, else gen_ui_out_table_header_info (probes, pops); - ui_out_table_header (current_uiout, size_objname, ui_left, "object", - _("Object")); - ui_out_table_body (current_uiout); + current_uiout->table_header (size_objname, ui_left, "object", _("Object")); + current_uiout->table_body (); for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i) { @@ -651,12 +683,12 @@ info_probes_for_ops (const char *arg, int from_tty, inner = make_cleanup_ui_out_tuple_begin_end (current_uiout, "probe"); - ui_out_field_string (current_uiout, "type",probe_type); - ui_out_field_string (current_uiout, "provider", probe->probe->provider); - ui_out_field_string (current_uiout, "name", probe->probe->name); - ui_out_field_core_addr (current_uiout, "addr", - probe->probe->arch, - get_probe_address (probe->probe, probe->objfile)); + current_uiout->field_string ("type",probe_type); + current_uiout->field_string ("provider", probe->probe->provider); + current_uiout->field_string ("name", probe->probe->name); + current_uiout->field_core_addr ( + "addr", probe->probe->arch, + get_probe_address (probe->probe, probe->objfile)); if (pops == NULL) { @@ -673,9 +705,9 @@ info_probes_for_ops (const char *arg, int from_tty, else print_ui_out_info (probe->probe); - ui_out_field_string (current_uiout, "object", + current_uiout->field_string ("object", objfile_name (probe->objfile)); - ui_out_text (current_uiout, "\n"); + current_uiout->text ("\n"); do_cleanups (inner); } @@ -684,7 +716,7 @@ info_probes_for_ops (const char *arg, int from_tty, do_cleanups (cleanup); if (!any_found) - ui_out_message (current_uiout, 0, _("No probes matched.\n")); + current_uiout->message (_("No probes matched.\n")); } /* Implementation of the `info probes' command. */ @@ -714,7 +746,7 @@ enable_probes_command (char *arg, int from_tty) 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")); + current_uiout->message (_("No probes matched.\n")); do_cleanups (cleanup); return; } @@ -728,14 +760,12 @@ enable_probes_command (char *arg, int from_tty) if (pops->enable_probe != NULL) { pops->enable_probe (probe->probe); - ui_out_message (current_uiout, 0, - _("Probe %s:%s enabled.\n"), - probe->probe->provider, probe->probe->name); + current_uiout->message (_("Probe %s:%s enabled.\n"), + probe->probe->provider, probe->probe->name); } else - ui_out_message (current_uiout, 0, - _("Probe %s:%s cannot be enabled.\n"), - probe->probe->provider, probe->probe->name); + current_uiout->message (_("Probe %s:%s cannot be enabled.\n"), + probe->probe->provider, probe->probe->name); } do_cleanups (cleanup); @@ -760,7 +790,7 @@ disable_probes_command (char *arg, int from_tty) 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")); + current_uiout->message (_("No probes matched.\n")); do_cleanups (cleanup); return; } @@ -774,14 +804,12 @@ disable_probes_command (char *arg, int from_tty) if (pops->disable_probe != NULL) { pops->disable_probe (probe->probe); - ui_out_message (current_uiout, 0, - _("Probe %s:%s disabled.\n"), - probe->probe->provider, probe->probe->name); + current_uiout->message (_("Probe %s:%s disabled.\n"), + probe->probe->provider, probe->probe->name); } else - ui_out_message (current_uiout, 0, - _("Probe %s:%s cannot be disabled.\n"), - probe->probe->provider, probe->probe->name); + current_uiout->message (_("Probe %s:%s cannot be disabled.\n"), + probe->probe->provider, probe->probe->name); } do_cleanups (cleanup);