1 /* Generic static probe support for GDB.
3 Copyright (C) 2012-2014 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 #include "cli/cli-cmds.h"
24 #include "cli/cli-utils.h"
27 #include "progspace.h"
28 #include "filenames.h"
29 #include "exceptions.h"
31 #include "gdb_regex.h"
33 #include "arch-utils.h"
36 typedef struct bound_probe bound_probe_s;
37 DEF_VEC_O (bound_probe_s);
41 /* See definition in probe.h. */
43 struct symtabs_and_lines
44 parse_probes (char **argptr, struct linespec_result *canonical)
46 char *arg_start, *arg_end, *arg;
47 char *objfile_namestr = NULL, *provider = NULL, *name, *p;
48 struct cleanup *cleanup;
49 struct symtabs_and_lines result;
50 struct objfile *objfile;
51 struct program_space *pspace;
52 const struct probe_ops *probe_ops;
61 probe_ops = probe_linespec_to_ops (&cs);
62 if (probe_ops == NULL)
63 error (_("'%s' is not a probe linespec"), arg_start);
66 arg = skip_spaces (arg);
68 error (_("argument to `%s' missing"), arg_start);
70 arg_end = skip_to_space (arg);
72 /* We make a copy here so we can write over parts with impunity. */
73 arg = savestring (arg, arg_end - arg);
74 cleanup = make_cleanup (xfree, arg);
76 /* Extract each word from the argument, separated by ":"s. */
77 p = strchr (arg, ':');
80 /* This is `-p name'. */
88 p = strchr (hold, ':');
91 /* This is `-p provider:name'. */
97 /* This is `-p objfile:provider:name'. */
99 objfile_namestr = arg;
106 error (_("no probe name specified"));
107 if (provider && *provider == '\0')
108 error (_("invalid provider name"));
109 if (objfile_namestr && *objfile_namestr == '\0')
110 error (_("invalid objfile name"));
113 ALL_PSPACE_OBJFILES (pspace, objfile)
115 VEC (probe_p) *probes;
119 if (!objfile->sf || !objfile->sf->sym_probe_fns)
123 && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0
124 && FILENAME_CMP (lbasename (objfile_name (objfile)),
125 objfile_namestr) != 0)
128 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
130 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
132 struct symtab_and_line *sal;
134 if (probe_ops != &probe_ops_any && probe->pops != probe_ops)
137 if (provider && strcmp (probe->provider, provider) != 0)
140 if (strcmp (probe->name, name) != 0)
144 result.sals = xrealloc (result.sals,
146 * sizeof (struct symtab_and_line));
147 sal = &result.sals[result.nelts - 1];
151 sal->pc = get_probe_address (probe, objfile);
152 sal->explicit_pc = 1;
153 sal->section = find_pc_overlay (sal->pc);
154 sal->pspace = pspace;
156 sal->objfile = objfile;
160 if (result.nelts == 0)
162 throw_error (NOT_FOUND_ERROR,
163 _("No probe matching objfile=`%s', provider=`%s', name=`%s'"),
164 objfile_namestr ? objfile_namestr : _("<any>"),
165 provider ? provider : _("<any>"),
171 canonical->special_display = 1;
172 canonical->pre_expanded = 1;
173 canonical->addr_string = savestring (*argptr, arg_end - *argptr);
177 do_cleanups (cleanup);
182 /* See definition in probe.h. */
185 find_probes_in_objfile (struct objfile *objfile, const char *provider,
188 VEC (probe_p) *probes, *result = NULL;
192 if (!objfile->sf || !objfile->sf->sym_probe_fns)
195 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
196 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
198 if (strcmp (probe->provider, provider) != 0)
201 if (strcmp (probe->name, name) != 0)
204 VEC_safe_push (probe_p, result, probe);
210 /* See definition in probe.h. */
213 find_probe_by_pc (CORE_ADDR pc)
215 struct objfile *objfile;
216 struct bound_probe result;
218 result.objfile = NULL;
221 ALL_OBJFILES (objfile)
223 VEC (probe_p) *probes;
227 if (!objfile->sf || !objfile->sf->sym_probe_fns
228 || objfile->sect_index_text == -1)
231 /* If this proves too inefficient, we can replace with a hash. */
232 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
233 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
234 if (get_probe_address (probe, objfile) == pc)
236 result.objfile = objfile;
237 result.probe = probe;
247 /* Make a vector of probes matching OBJNAME, PROVIDER, and PROBE_NAME.
248 If POPS is not NULL, only probes of this certain probe_ops will match.
249 Each argument is a regexp, or NULL, which matches anything. */
251 static VEC (bound_probe_s) *
252 collect_probes (char *objname, char *provider, char *probe_name,
253 const struct probe_ops *pops)
255 struct objfile *objfile;
256 VEC (bound_probe_s) *result = NULL;
257 struct cleanup *cleanup, *cleanup_temps;
258 regex_t obj_pat, prov_pat, probe_pat;
260 cleanup = make_cleanup (VEC_cleanup (bound_probe_s), &result);
262 cleanup_temps = make_cleanup (null_cleanup, NULL);
263 if (provider != NULL)
264 compile_rx_or_error (&prov_pat, provider, _("Invalid provider regexp"));
265 if (probe_name != NULL)
266 compile_rx_or_error (&probe_pat, probe_name, _("Invalid probe regexp"));
268 compile_rx_or_error (&obj_pat, objname, _("Invalid object file regexp"));
270 ALL_OBJFILES (objfile)
272 VEC (probe_p) *probes;
276 if (! objfile->sf || ! objfile->sf->sym_probe_fns)
281 if (regexec (&obj_pat, objfile_name (objfile), 0, NULL, 0) != 0)
285 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
287 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
289 struct bound_probe bound;
291 if (pops != NULL && probe->pops != pops)
295 && regexec (&prov_pat, probe->provider, 0, NULL, 0) != 0)
299 && regexec (&probe_pat, probe->name, 0, NULL, 0) != 0)
302 bound.objfile = objfile;
304 VEC_safe_push (bound_probe_s, result, &bound);
308 do_cleanups (cleanup_temps);
309 discard_cleanups (cleanup);
313 /* A qsort comparison function for bound_probe_s objects. */
316 compare_probes (const void *a, const void *b)
318 const struct bound_probe *pa = (const struct bound_probe *) a;
319 const struct bound_probe *pb = (const struct bound_probe *) b;
322 v = strcmp (pa->probe->provider, pb->probe->provider);
326 v = strcmp (pa->probe->name, pb->probe->name);
330 if (pa->probe->address < pb->probe->address)
332 if (pa->probe->address > pb->probe->address)
335 return strcmp (objfile_name (pa->objfile), objfile_name (pb->objfile));
338 /* Helper function that generate entries in the ui_out table being
339 crafted by `info_probes_for_ops'. */
342 gen_ui_out_table_header_info (VEC (bound_probe_s) *probes,
343 const struct probe_ops *p)
345 /* `headings' refers to the names of the columns when printing `info
347 VEC (info_probe_column_s) *headings = NULL;
349 info_probe_column_s *column;
350 size_t headings_size;
353 gdb_assert (p != NULL);
355 if (p->gen_info_probes_table_header == NULL
356 && p->gen_info_probes_table_values == NULL)
359 gdb_assert (p->gen_info_probes_table_header != NULL
360 && p->gen_info_probes_table_values != NULL);
362 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
363 p->gen_info_probes_table_header (&headings);
365 headings_size = VEC_length (info_probe_column_s, headings);
368 VEC_iterate (info_probe_column_s, headings, ix, column);
371 struct bound_probe *probe;
373 size_t size_max = strlen (column->print_name);
375 for (jx = 0; VEC_iterate (bound_probe_s, probes, jx, probe); ++jx)
377 /* `probe_fields' refers to the values of each new field that this
378 probe will display. */
379 VEC (const_char_ptr) *probe_fields = NULL;
384 if (probe->probe->pops != p)
387 c2 = make_cleanup (VEC_cleanup (const_char_ptr), &probe_fields);
388 p->gen_info_probes_table_values (probe->probe, &probe_fields);
390 gdb_assert (VEC_length (const_char_ptr, probe_fields)
393 for (kx = 0; VEC_iterate (const_char_ptr, probe_fields, kx, val);
396 /* It is valid to have a NULL value here, which means that the
397 backend does not have something to write and this particular
398 field should be skipped. */
402 size_max = max (strlen (val), size_max);
407 ui_out_table_header (current_uiout, size_max, ui_left,
408 column->field_name, column->print_name);
414 /* Helper function to print extra information about a probe and an objfile
415 represented by PROBE. */
418 print_ui_out_info (struct probe *probe)
422 /* `values' refers to the actual values of each new field in the output
423 of `info probe'. `headings' refers to the names of each new field. */
424 VEC (const_char_ptr) *values = NULL;
425 VEC (info_probe_column_s) *headings = NULL;
426 info_probe_column_s *column;
429 gdb_assert (probe != NULL);
430 gdb_assert (probe->pops != NULL);
432 if (probe->pops->gen_info_probes_table_header == NULL
433 && probe->pops->gen_info_probes_table_values == NULL)
436 gdb_assert (probe->pops->gen_info_probes_table_header != NULL
437 && probe->pops->gen_info_probes_table_values != NULL);
439 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
440 make_cleanup (VEC_cleanup (const_char_ptr), &values);
442 probe->pops->gen_info_probes_table_header (&headings);
443 probe->pops->gen_info_probes_table_values (probe, &values);
445 gdb_assert (VEC_length (info_probe_column_s, headings)
446 == VEC_length (const_char_ptr, values));
449 VEC_iterate (info_probe_column_s, headings, ix, column);
452 const char *val = VEC_index (const_char_ptr, values, j++);
455 ui_out_field_skip (current_uiout, column->field_name);
457 ui_out_field_string (current_uiout, column->field_name, val);
463 /* Helper function that returns the number of extra fields which POPS will
467 get_number_extra_fields (const struct probe_ops *pops)
469 VEC (info_probe_column_s) *headings = NULL;
473 if (pops->gen_info_probes_table_header == NULL)
476 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
477 pops->gen_info_probes_table_header (&headings);
479 n = VEC_length (info_probe_column_s, headings);
486 /* See comment in probe.h. */
489 info_probes_for_ops (const char *arg, int from_tty,
490 const struct probe_ops *pops)
492 char *provider, *probe_name = NULL, *objname = NULL;
493 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
494 VEC (bound_probe_s) *probes;
496 int ui_out_extra_fields = 0;
498 size_t size_name = strlen ("Name");
499 size_t size_objname = strlen ("Object");
500 size_t size_provider = strlen ("Provider");
501 struct bound_probe *probe;
502 struct gdbarch *gdbarch = get_current_arch ();
504 /* Do we have a `provider:probe:objfile' style of linespec? */
505 provider = extract_arg_const (&arg);
508 make_cleanup (xfree, provider);
510 probe_name = extract_arg_const (&arg);
513 make_cleanup (xfree, probe_name);
515 objname = extract_arg_const (&arg);
517 make_cleanup (xfree, objname);
523 const struct probe_ops *po;
526 /* If the probe_ops is NULL, it means the user has requested a "simple"
527 `info probes', i.e., she wants to print all information about all
528 probes. For that, we have to identify how many extra fields we will
529 need to add in the ui_out table.
531 To do that, we iterate over all probe_ops, querying each one about
532 its extra fields, and incrementing `ui_out_extra_fields' to reflect
535 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
536 ui_out_extra_fields += get_number_extra_fields (po);
539 ui_out_extra_fields = get_number_extra_fields (pops);
541 probes = collect_probes (objname, provider, probe_name, pops);
542 make_cleanup (VEC_cleanup (probe_p), &probes);
543 make_cleanup_ui_out_table_begin_end (current_uiout,
544 4 + ui_out_extra_fields,
545 VEC_length (bound_probe_s, probes),
548 if (!VEC_empty (bound_probe_s, probes))
549 qsort (VEC_address (bound_probe_s, probes),
550 VEC_length (bound_probe_s, probes),
551 sizeof (bound_probe_s), compare_probes);
553 /* What's the size of an address in our architecture? */
554 size_addr = gdbarch_addr_bit (gdbarch) == 64 ? 18 : 10;
556 /* Determining the maximum size of each field (`provider', `name' and
558 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
560 size_name = max (strlen (probe->probe->name), size_name);
561 size_provider = max (strlen (probe->probe->provider), size_provider);
562 size_objname = max (strlen (objfile_name (probe->objfile)), size_objname);
565 ui_out_table_header (current_uiout, size_provider, ui_left, "provider",
567 ui_out_table_header (current_uiout, size_name, ui_left, "name", _("Name"));
568 ui_out_table_header (current_uiout, size_addr, ui_left, "addr", _("Where"));
572 const struct probe_ops *po;
575 /* We have to generate the table header for each new probe type that we
577 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
578 gen_ui_out_table_header_info (probes, po);
581 gen_ui_out_table_header_info (probes, pops);
583 ui_out_table_header (current_uiout, size_objname, ui_left, "object",
585 ui_out_table_body (current_uiout);
587 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
589 struct cleanup *inner;
591 inner = make_cleanup_ui_out_tuple_begin_end (current_uiout, "probe");
593 ui_out_field_string (current_uiout, "provider", probe->probe->provider);
594 ui_out_field_string (current_uiout, "name", probe->probe->name);
595 ui_out_field_core_addr (current_uiout, "addr",
597 get_probe_address (probe->probe, probe->objfile));
601 const struct probe_ops *po;
604 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po);
606 if (probe->probe->pops == po)
607 print_ui_out_info (probe->probe);
610 print_ui_out_info (probe->probe);
612 ui_out_field_string (current_uiout, "object",
613 objfile_name (probe->objfile));
614 ui_out_text (current_uiout, "\n");
619 any_found = !VEC_empty (bound_probe_s, probes);
620 do_cleanups (cleanup);
623 ui_out_message (current_uiout, 0, _("No probes matched.\n"));
626 /* Implementation of the `info probes' command. */
629 info_probes_command (char *arg, int from_tty)
631 info_probes_for_ops (arg, from_tty, NULL);
634 /* See comments in probe.h. */
637 get_probe_address (struct probe *probe, struct objfile *objfile)
639 return probe->pops->get_probe_address (probe, objfile);
642 /* See comments in probe.h. */
645 get_probe_argument_count (struct probe *probe, struct frame_info *frame)
647 return probe->pops->get_probe_argument_count (probe, frame);
650 /* See comments in probe.h. */
653 can_evaluate_probe_arguments (struct probe *probe)
655 return probe->pops->can_evaluate_probe_arguments (probe);
658 /* See comments in probe.h. */
661 evaluate_probe_argument (struct probe *probe, unsigned n,
662 struct frame_info *frame)
664 return probe->pops->evaluate_probe_argument (probe, n, frame);
667 /* See comments in probe.h. */
670 probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n)
672 struct bound_probe probe;
675 probe = find_probe_by_pc (get_frame_pc (frame));
679 n_args = get_probe_argument_count (probe.probe, frame);
683 return evaluate_probe_argument (probe.probe, n, frame);
686 /* See comment in probe.h. */
688 const struct probe_ops *
689 probe_linespec_to_ops (const char **linespecp)
692 const struct probe_ops *probe_ops;
694 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, probe_ops); ix++)
695 if (probe_ops->is_linespec (linespecp))
701 /* See comment in probe.h. */
704 probe_is_linespec_by_keyword (const char **linespecp, const char *const *keywords)
706 const char *s = *linespecp;
707 const char *const *csp;
709 for (csp = keywords; *csp; csp++)
711 const char *keyword = *csp;
712 size_t len = strlen (keyword);
714 if (strncmp (s, keyword, len) == 0 && isspace (s[len]))
716 *linespecp += len + 1;
724 /* Implementation of `is_linespec' method for `struct probe_ops'. */
727 probe_any_is_linespec (const char **linespecp)
729 static const char *const keywords[] = { "-p", "-probe", NULL };
731 return probe_is_linespec_by_keyword (linespecp, keywords);
734 /* Dummy method used for `probe_ops_any'. */
737 probe_any_get_probes (VEC (probe_p) **probesp, struct objfile *objfile)
739 /* No probes can be provided by this dummy backend. */
742 /* Operations associated with a generic probe. */
744 const struct probe_ops probe_ops_any =
746 probe_any_is_linespec,
747 probe_any_get_probes,
750 /* See comments in probe.h. */
752 struct cmd_list_element **
753 info_probes_cmdlist_get (void)
755 static struct cmd_list_element *info_probes_cmdlist;
757 if (info_probes_cmdlist == NULL)
758 add_prefix_cmd ("probes", class_info, info_probes_command,
760 Show available static probes.\n\
761 Usage: info probes [all|TYPE [ARGS]]\n\
762 TYPE specifies the type of the probe, and can be one of the following:\n\
764 If you specify TYPE, there may be additional arguments needed by the\n\
766 If you do not specify any argument, or specify `all', then the command\n\
767 will show information about all types of probes."),
768 &info_probes_cmdlist, "info probes ",
769 0/*allow-unknown*/, &infolist);
771 return &info_probes_cmdlist;
774 VEC (probe_ops_cp) *all_probe_ops;
776 void _initialize_probe (void);
779 _initialize_probe (void)
781 VEC_safe_push (probe_ops_cp, all_probe_ops, &probe_ops_any);
783 add_cmd ("all", class_info, info_probes_command,
785 Show information about all type of probes."),
786 info_probes_cmdlist_get ());