1 /* Generic static probe support for GDB.
3 Copyright (C) 2012-2016 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"
30 #include "gdb_regex.h"
32 #include "arch-utils.h"
39 typedef struct bound_probe bound_probe_s;
40 DEF_VEC_O (bound_probe_s);
44 /* A helper for parse_probes that decodes a probe specification in
45 SEARCH_PSPACE. It appends matching SALs to RESULT. */
48 parse_probes_in_pspace (const struct probe_ops *probe_ops,
49 struct program_space *search_pspace,
50 const char *objfile_namestr,
53 struct symtabs_and_lines *result)
55 struct objfile *objfile;
57 ALL_PSPACE_OBJFILES (search_pspace, objfile)
59 VEC (probe_p) *probes;
63 if (!objfile->sf || !objfile->sf->sym_probe_fns)
67 && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0
68 && FILENAME_CMP (lbasename (objfile_name (objfile)),
69 objfile_namestr) != 0)
72 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
74 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
76 struct symtab_and_line *sal;
78 if (probe_ops != &probe_ops_any && probe->pops != probe_ops)
81 if (provider && strcmp (probe->provider, provider) != 0)
84 if (strcmp (probe->name, name) != 0)
88 result->sals = XRESIZEVEC (struct symtab_and_line, result->sals,
90 sal = &result->sals[result->nelts - 1];
94 sal->pc = get_probe_address (probe, objfile);
96 sal->section = find_pc_overlay (sal->pc);
97 sal->pspace = search_pspace;
99 sal->objfile = objfile;
104 /* See definition in probe.h. */
106 struct symtabs_and_lines
107 parse_probes (const struct event_location *location,
108 struct program_space *search_pspace,
109 struct linespec_result *canonical)
112 char *objfile_namestr = NULL, *provider = NULL, *name, *p;
113 struct cleanup *cleanup;
114 struct symtabs_and_lines result;
115 const struct probe_ops *probe_ops;
116 const char *arg_start, *cs;
121 gdb_assert (event_location_type (location) == PROBE_LOCATION);
122 arg_start = get_probe_location (location);
125 probe_ops = probe_linespec_to_ops (&cs);
126 if (probe_ops == NULL)
127 error (_("'%s' is not a probe linespec"), arg_start);
130 arg = skip_spaces (arg);
132 error (_("argument to `%s' missing"), arg_start);
134 arg_end = skip_to_space (arg);
136 /* We make a copy here so we can write over parts with impunity. */
137 arg = savestring (arg, arg_end - arg);
138 cleanup = make_cleanup (xfree, arg);
140 /* Extract each word from the argument, separated by ":"s. */
141 p = strchr (arg, ':');
144 /* This is `-p name'. */
152 p = strchr (hold, ':');
155 /* This is `-p provider:name'. */
161 /* This is `-p objfile:provider:name'. */
163 objfile_namestr = arg;
170 error (_("no probe name specified"));
171 if (provider && *provider == '\0')
172 error (_("invalid provider name"));
173 if (objfile_namestr && *objfile_namestr == '\0')
174 error (_("invalid objfile name"));
176 if (search_pspace != NULL)
178 parse_probes_in_pspace (probe_ops, search_pspace, objfile_namestr,
179 provider, name, &result);
183 struct program_space *pspace;
186 parse_probes_in_pspace (probe_ops, pspace, objfile_namestr,
187 provider, name, &result);
190 if (result.nelts == 0)
192 throw_error (NOT_FOUND_ERROR,
193 _("No probe matching objfile=`%s', provider=`%s', name=`%s'"),
194 objfile_namestr ? objfile_namestr : _("<any>"),
195 provider ? provider : _("<any>"),
203 canon = savestring (arg_start, arg_end - arg_start);
204 make_cleanup (xfree, canon);
205 canonical->special_display = 1;
206 canonical->pre_expanded = 1;
207 canonical->location = new_probe_location (canon);
210 do_cleanups (cleanup);
215 /* See definition in probe.h. */
218 find_probes_in_objfile (struct objfile *objfile, const char *provider,
221 VEC (probe_p) *probes, *result = NULL;
225 if (!objfile->sf || !objfile->sf->sym_probe_fns)
228 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
229 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
231 if (strcmp (probe->provider, provider) != 0)
234 if (strcmp (probe->name, name) != 0)
237 VEC_safe_push (probe_p, result, probe);
243 /* See definition in probe.h. */
246 find_probe_by_pc (CORE_ADDR pc)
248 struct objfile *objfile;
249 struct bound_probe result;
251 result.objfile = NULL;
254 ALL_OBJFILES (objfile)
256 VEC (probe_p) *probes;
260 if (!objfile->sf || !objfile->sf->sym_probe_fns
261 || objfile->sect_index_text == -1)
264 /* If this proves too inefficient, we can replace with a hash. */
265 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
266 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
267 if (get_probe_address (probe, objfile) == pc)
269 result.objfile = objfile;
270 result.probe = probe;
280 /* Make a vector of probes matching OBJNAME, PROVIDER, and PROBE_NAME.
281 If POPS is not NULL, only probes of this certain probe_ops will match.
282 Each argument is a regexp, or NULL, which matches anything. */
284 static VEC (bound_probe_s) *
285 collect_probes (char *objname, char *provider, char *probe_name,
286 const struct probe_ops *pops)
288 struct objfile *objfile;
289 VEC (bound_probe_s) *result = NULL;
290 struct cleanup *cleanup, *cleanup_temps;
291 regex_t obj_pat, prov_pat, probe_pat;
293 cleanup = make_cleanup (VEC_cleanup (bound_probe_s), &result);
295 cleanup_temps = make_cleanup (null_cleanup, NULL);
296 if (provider != NULL)
297 compile_rx_or_error (&prov_pat, provider, _("Invalid provider regexp"));
298 if (probe_name != NULL)
299 compile_rx_or_error (&probe_pat, probe_name, _("Invalid probe regexp"));
301 compile_rx_or_error (&obj_pat, objname, _("Invalid object file regexp"));
303 ALL_OBJFILES (objfile)
305 VEC (probe_p) *probes;
309 if (! objfile->sf || ! objfile->sf->sym_probe_fns)
314 if (regexec (&obj_pat, objfile_name (objfile), 0, NULL, 0) != 0)
318 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
320 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
322 struct bound_probe bound;
324 if (pops != NULL && probe->pops != pops)
328 && regexec (&prov_pat, probe->provider, 0, NULL, 0) != 0)
332 && regexec (&probe_pat, probe->name, 0, NULL, 0) != 0)
335 bound.objfile = objfile;
337 VEC_safe_push (bound_probe_s, result, &bound);
341 do_cleanups (cleanup_temps);
342 discard_cleanups (cleanup);
346 /* A qsort comparison function for bound_probe_s objects. */
349 compare_probes (const void *a, const void *b)
351 const struct bound_probe *pa = (const struct bound_probe *) a;
352 const struct bound_probe *pb = (const struct bound_probe *) b;
355 v = strcmp (pa->probe->provider, pb->probe->provider);
359 v = strcmp (pa->probe->name, pb->probe->name);
363 if (pa->probe->address < pb->probe->address)
365 if (pa->probe->address > pb->probe->address)
368 return strcmp (objfile_name (pa->objfile), objfile_name (pb->objfile));
371 /* Helper function that generate entries in the ui_out table being
372 crafted by `info_probes_for_ops'. */
375 gen_ui_out_table_header_info (VEC (bound_probe_s) *probes,
376 const struct probe_ops *p)
378 /* `headings' refers to the names of the columns when printing `info
380 VEC (info_probe_column_s) *headings = NULL;
382 info_probe_column_s *column;
383 size_t headings_size;
386 gdb_assert (p != NULL);
388 if (p->gen_info_probes_table_header == NULL
389 && p->gen_info_probes_table_values == NULL)
392 gdb_assert (p->gen_info_probes_table_header != NULL
393 && p->gen_info_probes_table_values != NULL);
395 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
396 p->gen_info_probes_table_header (&headings);
398 headings_size = VEC_length (info_probe_column_s, headings);
401 VEC_iterate (info_probe_column_s, headings, ix, column);
404 struct bound_probe *probe;
406 size_t size_max = strlen (column->print_name);
408 for (jx = 0; VEC_iterate (bound_probe_s, probes, jx, probe); ++jx)
410 /* `probe_fields' refers to the values of each new field that this
411 probe will display. */
412 VEC (const_char_ptr) *probe_fields = NULL;
417 if (probe->probe->pops != p)
420 c2 = make_cleanup (VEC_cleanup (const_char_ptr), &probe_fields);
421 p->gen_info_probes_table_values (probe->probe, &probe_fields);
423 gdb_assert (VEC_length (const_char_ptr, probe_fields)
426 for (kx = 0; VEC_iterate (const_char_ptr, probe_fields, kx, val);
429 /* It is valid to have a NULL value here, which means that the
430 backend does not have something to write and this particular
431 field should be skipped. */
435 size_max = max (strlen (val), size_max);
440 ui_out_table_header (current_uiout, size_max, ui_left,
441 column->field_name, column->print_name);
447 /* Helper function to print not-applicable strings for all the extra
448 columns defined in a probe_ops. */
451 print_ui_out_not_applicables (const struct probe_ops *pops)
454 VEC (info_probe_column_s) *headings = NULL;
455 info_probe_column_s *column;
458 if (pops->gen_info_probes_table_header == NULL)
461 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
462 pops->gen_info_probes_table_header (&headings);
465 VEC_iterate (info_probe_column_s, headings, ix, column);
467 ui_out_field_string (current_uiout, column->field_name, _("n/a"));
472 /* Helper function to print extra information about a probe and an objfile
473 represented by PROBE. */
476 print_ui_out_info (struct probe *probe)
480 /* `values' refers to the actual values of each new field in the output
481 of `info probe'. `headings' refers to the names of each new field. */
482 VEC (const_char_ptr) *values = NULL;
483 VEC (info_probe_column_s) *headings = NULL;
484 info_probe_column_s *column;
487 gdb_assert (probe != NULL);
488 gdb_assert (probe->pops != NULL);
490 if (probe->pops->gen_info_probes_table_header == NULL
491 && probe->pops->gen_info_probes_table_values == NULL)
494 gdb_assert (probe->pops->gen_info_probes_table_header != NULL
495 && probe->pops->gen_info_probes_table_values != NULL);
497 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
498 make_cleanup (VEC_cleanup (const_char_ptr), &values);
500 probe->pops->gen_info_probes_table_header (&headings);
501 probe->pops->gen_info_probes_table_values (probe, &values);
503 gdb_assert (VEC_length (info_probe_column_s, headings)
504 == VEC_length (const_char_ptr, values));
507 VEC_iterate (info_probe_column_s, headings, ix, column);
510 const char *val = VEC_index (const_char_ptr, values, j++);
513 ui_out_field_skip (current_uiout, column->field_name);
515 ui_out_field_string (current_uiout, column->field_name, val);
521 /* Helper function that returns the number of extra fields which POPS will
525 get_number_extra_fields (const struct probe_ops *pops)
527 VEC (info_probe_column_s) *headings = NULL;
531 if (pops->gen_info_probes_table_header == NULL)
534 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
535 pops->gen_info_probes_table_header (&headings);
537 n = VEC_length (info_probe_column_s, headings);
544 /* Helper function that returns 1 if there is a probe in PROBES
545 featuring the given POPS. It returns 0 otherwise. */
548 exists_probe_with_pops (VEC (bound_probe_s) *probes,
549 const struct probe_ops *pops)
551 struct bound_probe *probe;
554 for (ix = 0; VEC_iterate (bound_probe_s, probes, ix, probe); ++ix)
555 if (probe->probe->pops == pops)
561 /* Helper function that parses a probe linespec of the form [PROVIDER
562 [PROBE [OBJNAME]]] from the provided string STR. */
565 parse_probe_linespec (const char *str, char **provider,
566 char **probe_name, char **objname)
568 *probe_name = *objname = NULL;
570 *provider = extract_arg_const (&str);
571 if (*provider != NULL)
573 *probe_name = extract_arg_const (&str);
574 if (*probe_name != NULL)
575 *objname = extract_arg_const (&str);
579 /* See comment in probe.h. */
582 info_probes_for_ops (const char *arg, int from_tty,
583 const struct probe_ops *pops)
585 char *provider, *probe_name = NULL, *objname = NULL;
586 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
587 VEC (bound_probe_s) *probes;
589 int ui_out_extra_fields = 0;
591 size_t size_name = strlen ("Name");
592 size_t size_objname = strlen ("Object");
593 size_t size_provider = strlen ("Provider");
594 size_t size_type = strlen ("Type");
595 struct bound_probe *probe;
596 struct gdbarch *gdbarch = get_current_arch ();
598 parse_probe_linespec (arg, &provider, &probe_name, &objname);
599 make_cleanup (xfree, provider);
600 make_cleanup (xfree, probe_name);
601 make_cleanup (xfree, objname);
603 probes = collect_probes (objname, provider, probe_name, pops);
604 make_cleanup (VEC_cleanup (probe_p), &probes);
608 const struct probe_ops *po;
611 /* If the probe_ops is NULL, it means the user has requested a "simple"
612 `info probes', i.e., she wants to print all information about all
613 probes. For that, we have to identify how many extra fields we will
614 need to add in the ui_out table.
616 To do that, we iterate over all probe_ops, querying each one about
617 its extra fields, and incrementing `ui_out_extra_fields' to reflect
618 that number. But note that we ignore the probe_ops for which no probes
619 are defined with the given search criteria. */
621 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
622 if (exists_probe_with_pops (probes, po))
623 ui_out_extra_fields += get_number_extra_fields (po);
626 ui_out_extra_fields = get_number_extra_fields (pops);
628 make_cleanup_ui_out_table_begin_end (current_uiout,
629 5 + ui_out_extra_fields,
630 VEC_length (bound_probe_s, probes),
633 if (!VEC_empty (bound_probe_s, probes))
634 qsort (VEC_address (bound_probe_s, probes),
635 VEC_length (bound_probe_s, probes),
636 sizeof (bound_probe_s), compare_probes);
638 /* What's the size of an address in our architecture? */
639 size_addr = gdbarch_addr_bit (gdbarch) == 64 ? 18 : 10;
641 /* Determining the maximum size of each field (`type', `provider',
642 `name' and `objname'). */
643 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
645 const char *probe_type = probe->probe->pops->type_name (probe->probe);
647 size_type = max (strlen (probe_type), size_type);
648 size_name = max (strlen (probe->probe->name), size_name);
649 size_provider = max (strlen (probe->probe->provider), size_provider);
650 size_objname = max (strlen (objfile_name (probe->objfile)), size_objname);
653 ui_out_table_header (current_uiout, size_type, ui_left, "type", _("Type"));
654 ui_out_table_header (current_uiout, size_provider, ui_left, "provider",
656 ui_out_table_header (current_uiout, size_name, ui_left, "name", _("Name"));
657 ui_out_table_header (current_uiout, size_addr, ui_left, "addr", _("Where"));
661 const struct probe_ops *po;
664 /* We have to generate the table header for each new probe type
665 that we will print. Note that this excludes probe types not
666 having any defined probe with the search criteria. */
667 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
668 if (exists_probe_with_pops (probes, po))
669 gen_ui_out_table_header_info (probes, po);
672 gen_ui_out_table_header_info (probes, pops);
674 ui_out_table_header (current_uiout, size_objname, ui_left, "object",
676 ui_out_table_body (current_uiout);
678 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
680 struct cleanup *inner;
681 const char *probe_type = probe->probe->pops->type_name (probe->probe);
683 inner = make_cleanup_ui_out_tuple_begin_end (current_uiout, "probe");
685 ui_out_field_string (current_uiout, "type",probe_type);
686 ui_out_field_string (current_uiout, "provider", probe->probe->provider);
687 ui_out_field_string (current_uiout, "name", probe->probe->name);
688 ui_out_field_core_addr (current_uiout, "addr",
690 get_probe_address (probe->probe, probe->objfile));
694 const struct probe_ops *po;
697 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po);
699 if (probe->probe->pops == po)
700 print_ui_out_info (probe->probe);
701 else if (exists_probe_with_pops (probes, po))
702 print_ui_out_not_applicables (po);
705 print_ui_out_info (probe->probe);
707 ui_out_field_string (current_uiout, "object",
708 objfile_name (probe->objfile));
709 ui_out_text (current_uiout, "\n");
714 any_found = !VEC_empty (bound_probe_s, probes);
715 do_cleanups (cleanup);
718 ui_out_message (current_uiout, 0, _("No probes matched.\n"));
721 /* Implementation of the `info probes' command. */
724 info_probes_command (char *arg, int from_tty)
726 info_probes_for_ops (arg, from_tty, NULL);
729 /* Implementation of the `enable probes' command. */
732 enable_probes_command (char *arg, int from_tty)
734 char *provider, *probe_name = NULL, *objname = NULL;
735 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
736 VEC (bound_probe_s) *probes;
737 struct bound_probe *probe;
740 parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
741 make_cleanup (xfree, provider);
742 make_cleanup (xfree, probe_name);
743 make_cleanup (xfree, objname);
745 probes = collect_probes (objname, provider, probe_name, NULL);
746 if (VEC_empty (bound_probe_s, probes))
748 ui_out_message (current_uiout, 0, _("No probes matched.\n"));
749 do_cleanups (cleanup);
753 /* Enable the selected probes, provided their backends support the
754 notion of enabling a probe. */
755 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
757 const struct probe_ops *pops = probe->probe->pops;
759 if (pops->enable_probe != NULL)
761 pops->enable_probe (probe->probe);
762 ui_out_message (current_uiout, 0,
763 _("Probe %s:%s enabled.\n"),
764 probe->probe->provider, probe->probe->name);
767 ui_out_message (current_uiout, 0,
768 _("Probe %s:%s cannot be enabled.\n"),
769 probe->probe->provider, probe->probe->name);
772 do_cleanups (cleanup);
775 /* Implementation of the `disable probes' command. */
778 disable_probes_command (char *arg, int from_tty)
780 char *provider, *probe_name = NULL, *objname = NULL;
781 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
782 VEC (bound_probe_s) *probes;
783 struct bound_probe *probe;
786 parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
787 make_cleanup (xfree, provider);
788 make_cleanup (xfree, probe_name);
789 make_cleanup (xfree, objname);
791 probes = collect_probes (objname, provider, probe_name, NULL /* pops */);
792 if (VEC_empty (bound_probe_s, probes))
794 ui_out_message (current_uiout, 0, _("No probes matched.\n"));
795 do_cleanups (cleanup);
799 /* Disable the selected probes, provided their backends support the
800 notion of enabling a probe. */
801 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
803 const struct probe_ops *pops = probe->probe->pops;
805 if (pops->disable_probe != NULL)
807 pops->disable_probe (probe->probe);
808 ui_out_message (current_uiout, 0,
809 _("Probe %s:%s disabled.\n"),
810 probe->probe->provider, probe->probe->name);
813 ui_out_message (current_uiout, 0,
814 _("Probe %s:%s cannot be disabled.\n"),
815 probe->probe->provider, probe->probe->name);
818 do_cleanups (cleanup);
821 /* See comments in probe.h. */
824 get_probe_address (struct probe *probe, struct objfile *objfile)
826 return probe->pops->get_probe_address (probe, objfile);
829 /* See comments in probe.h. */
832 get_probe_argument_count (struct probe *probe, struct frame_info *frame)
834 return probe->pops->get_probe_argument_count (probe, frame);
837 /* See comments in probe.h. */
840 can_evaluate_probe_arguments (struct probe *probe)
842 return probe->pops->can_evaluate_probe_arguments (probe);
845 /* See comments in probe.h. */
848 evaluate_probe_argument (struct probe *probe, unsigned n,
849 struct frame_info *frame)
851 return probe->pops->evaluate_probe_argument (probe, n, frame);
854 /* See comments in probe.h. */
857 probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n)
859 struct bound_probe probe;
862 probe = find_probe_by_pc (get_frame_pc (frame));
866 n_args = get_probe_argument_count (probe.probe, frame);
870 return evaluate_probe_argument (probe.probe, n, frame);
873 /* See comment in probe.h. */
875 const struct probe_ops *
876 probe_linespec_to_ops (const char **linespecp)
879 const struct probe_ops *probe_ops;
881 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, probe_ops); ix++)
882 if (probe_ops->is_linespec (linespecp))
888 /* See comment in probe.h. */
891 probe_is_linespec_by_keyword (const char **linespecp, const char *const *keywords)
893 const char *s = *linespecp;
894 const char *const *csp;
896 for (csp = keywords; *csp; csp++)
898 const char *keyword = *csp;
899 size_t len = strlen (keyword);
901 if (strncmp (s, keyword, len) == 0 && isspace (s[len]))
903 *linespecp += len + 1;
911 /* Implementation of `is_linespec' method for `struct probe_ops'. */
914 probe_any_is_linespec (const char **linespecp)
916 static const char *const keywords[] = { "-p", "-probe", NULL };
918 return probe_is_linespec_by_keyword (linespecp, keywords);
921 /* Dummy method used for `probe_ops_any'. */
924 probe_any_get_probes (VEC (probe_p) **probesp, struct objfile *objfile)
926 /* No probes can be provided by this dummy backend. */
929 /* Operations associated with a generic probe. */
931 const struct probe_ops probe_ops_any =
933 probe_any_is_linespec,
934 probe_any_get_probes,
937 /* See comments in probe.h. */
939 struct cmd_list_element **
940 info_probes_cmdlist_get (void)
942 static struct cmd_list_element *info_probes_cmdlist;
944 if (info_probes_cmdlist == NULL)
945 add_prefix_cmd ("probes", class_info, info_probes_command,
947 Show available static probes.\n\
948 Usage: info probes [all|TYPE [ARGS]]\n\
949 TYPE specifies the type of the probe, and can be one of the following:\n\
951 If you specify TYPE, there may be additional arguments needed by the\n\
953 If you do not specify any argument, or specify `all', then the command\n\
954 will show information about all types of probes."),
955 &info_probes_cmdlist, "info probes ",
956 0/*allow-unknown*/, &infolist);
958 return &info_probes_cmdlist;
963 /* This is called to compute the value of one of the $_probe_arg*
964 convenience variables. */
966 static struct value *
967 compute_probe_arg (struct gdbarch *arch, struct internalvar *ivar,
970 struct frame_info *frame = get_selected_frame (_("No frame selected"));
971 CORE_ADDR pc = get_frame_pc (frame);
972 int sel = (int) (uintptr_t) data;
973 struct bound_probe pc_probe;
974 const struct sym_probe_fns *pc_probe_fns;
977 /* SEL == -1 means "_probe_argc". */
978 gdb_assert (sel >= -1);
980 pc_probe = find_probe_by_pc (pc);
981 if (pc_probe.probe == NULL)
982 error (_("No probe at PC %s"), core_addr_to_string (pc));
984 n_args = get_probe_argument_count (pc_probe.probe, frame);
986 return value_from_longest (builtin_type (arch)->builtin_int, n_args);
989 error (_("Invalid probe argument %d -- probe has %u arguments available"),
992 return evaluate_probe_argument (pc_probe.probe, sel, frame);
995 /* This is called to compile one of the $_probe_arg* convenience
996 variables into an agent expression. */
999 compile_probe_arg (struct internalvar *ivar, struct agent_expr *expr,
1000 struct axs_value *value, void *data)
1002 CORE_ADDR pc = expr->scope;
1003 int sel = (int) (uintptr_t) data;
1004 struct bound_probe pc_probe;
1005 const struct sym_probe_fns *pc_probe_fns;
1007 struct frame_info *frame = get_selected_frame (NULL);
1009 /* SEL == -1 means "_probe_argc". */
1010 gdb_assert (sel >= -1);
1012 pc_probe = find_probe_by_pc (pc);
1013 if (pc_probe.probe == NULL)
1014 error (_("No probe at PC %s"), core_addr_to_string (pc));
1016 n_args = get_probe_argument_count (pc_probe.probe, frame);
1020 value->kind = axs_rvalue;
1021 value->type = builtin_type (expr->gdbarch)->builtin_int;
1022 ax_const_l (expr, n_args);
1026 gdb_assert (sel >= 0);
1028 error (_("Invalid probe argument %d -- probe has %d arguments available"),
1031 pc_probe.probe->pops->compile_to_ax (pc_probe.probe, expr, value, sel);
1034 static const struct internalvar_funcs probe_funcs =
1042 VEC (probe_ops_cp) *all_probe_ops;
1044 void _initialize_probe (void);
1047 _initialize_probe (void)
1049 VEC_safe_push (probe_ops_cp, all_probe_ops, &probe_ops_any);
1051 create_internalvar_type_lazy ("_probe_argc", &probe_funcs,
1052 (void *) (uintptr_t) -1);
1053 create_internalvar_type_lazy ("_probe_arg0", &probe_funcs,
1054 (void *) (uintptr_t) 0);
1055 create_internalvar_type_lazy ("_probe_arg1", &probe_funcs,
1056 (void *) (uintptr_t) 1);
1057 create_internalvar_type_lazy ("_probe_arg2", &probe_funcs,
1058 (void *) (uintptr_t) 2);
1059 create_internalvar_type_lazy ("_probe_arg3", &probe_funcs,
1060 (void *) (uintptr_t) 3);
1061 create_internalvar_type_lazy ("_probe_arg4", &probe_funcs,
1062 (void *) (uintptr_t) 4);
1063 create_internalvar_type_lazy ("_probe_arg5", &probe_funcs,
1064 (void *) (uintptr_t) 5);
1065 create_internalvar_type_lazy ("_probe_arg6", &probe_funcs,
1066 (void *) (uintptr_t) 6);
1067 create_internalvar_type_lazy ("_probe_arg7", &probe_funcs,
1068 (void *) (uintptr_t) 7);
1069 create_internalvar_type_lazy ("_probe_arg8", &probe_funcs,
1070 (void *) (uintptr_t) 8);
1071 create_internalvar_type_lazy ("_probe_arg9", &probe_funcs,
1072 (void *) (uintptr_t) 9);
1073 create_internalvar_type_lazy ("_probe_arg10", &probe_funcs,
1074 (void *) (uintptr_t) 10);
1075 create_internalvar_type_lazy ("_probe_arg11", &probe_funcs,
1076 (void *) (uintptr_t) 11);
1078 add_cmd ("all", class_info, info_probes_command,
1080 Show information about all type of probes."),
1081 info_probes_cmdlist_get ());
1083 add_cmd ("probes", class_breakpoint, enable_probes_command, _("\
1085 Usage: enable probes [PROVIDER [NAME [OBJECT]]]\n\
1086 Each argument is a regular expression, used to select probes.\n\
1087 PROVIDER matches probe provider names.\n\
1088 NAME matches the probe names.\n\
1089 OBJECT matches the executable or shared library name.\n\
1090 If you do not specify any argument then the command will enable\n\
1091 all defined probes."),
1094 add_cmd ("probes", class_breakpoint, disable_probes_command, _("\
1096 Usage: disable probes [PROVIDER [NAME [OBJECT]]]\n\
1097 Each argument is a regular expression, used to select probes.\n\
1098 PROVIDER matches probe provider names.\n\
1099 NAME matches the probe names.\n\
1100 OBJECT matches the executable or shared library name.\n\
1101 If you do not specify any argument then the command will disable\n\
1102 all defined probes."),