1 /* Generic static probe support for GDB.
3 Copyright (C) 2012-2017 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 #include "common/gdb_optional.h"
41 typedef struct bound_probe bound_probe_s;
42 DEF_VEC_O (bound_probe_s);
46 /* A helper for parse_probes that decodes a probe specification in
47 SEARCH_PSPACE. It appends matching SALs to RESULT. */
50 parse_probes_in_pspace (const struct probe_ops *probe_ops,
51 struct program_space *search_pspace,
52 const char *objfile_namestr,
55 std::vector<symtab_and_line> *result)
57 struct objfile *objfile;
59 ALL_PSPACE_OBJFILES (search_pspace, objfile)
61 VEC (probe_p) *probes;
65 if (!objfile->sf || !objfile->sf->sym_probe_fns)
69 && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0
70 && FILENAME_CMP (lbasename (objfile_name (objfile)),
71 objfile_namestr) != 0)
74 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
76 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
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)
91 sal.pc = get_probe_address (probe, objfile);
93 sal.section = find_pc_overlay (sal.pc);
94 sal.pspace = search_pspace;
96 sal.objfile = objfile;
98 result->push_back (std::move (sal));
103 /* See definition in probe.h. */
105 std::vector<symtab_and_line>
106 parse_probes (const struct event_location *location,
107 struct program_space *search_pspace,
108 struct linespec_result *canonical)
111 char *objfile_namestr = NULL, *provider = NULL, *name, *p;
112 struct cleanup *cleanup;
113 const struct probe_ops *probe_ops;
114 const char *arg_start, *cs;
116 gdb_assert (event_location_type (location) == PROBE_LOCATION);
117 arg_start = get_probe_location (location);
120 probe_ops = probe_linespec_to_ops (&cs);
121 if (probe_ops == NULL)
122 error (_("'%s' is not a probe linespec"), arg_start);
125 arg = skip_spaces (arg);
127 error (_("argument to `%s' missing"), arg_start);
129 arg_end = skip_to_space (arg);
131 /* We make a copy here so we can write over parts with impunity. */
132 arg = savestring (arg, arg_end - arg);
133 cleanup = make_cleanup (xfree, arg);
135 /* Extract each word from the argument, separated by ":"s. */
136 p = strchr (arg, ':');
139 /* This is `-p name'. */
147 p = strchr (hold, ':');
150 /* This is `-p provider:name'. */
156 /* This is `-p objfile:provider:name'. */
158 objfile_namestr = arg;
165 error (_("no probe name specified"));
166 if (provider && *provider == '\0')
167 error (_("invalid provider name"));
168 if (objfile_namestr && *objfile_namestr == '\0')
169 error (_("invalid objfile name"));
171 std::vector<symtab_and_line> result;
172 if (search_pspace != NULL)
174 parse_probes_in_pspace (probe_ops, search_pspace, objfile_namestr,
175 provider, name, &result);
179 struct program_space *pspace;
182 parse_probes_in_pspace (probe_ops, pspace, objfile_namestr,
183 provider, name, &result);
188 throw_error (NOT_FOUND_ERROR,
189 _("No probe matching objfile=`%s', provider=`%s', name=`%s'"),
190 objfile_namestr ? objfile_namestr : _("<any>"),
191 provider ? provider : _("<any>"),
199 canon = savestring (arg_start, arg_end - arg_start);
200 make_cleanup (xfree, canon);
201 canonical->special_display = 1;
202 canonical->pre_expanded = 1;
203 canonical->location = new_probe_location (canon);
206 do_cleanups (cleanup);
211 /* See definition in probe.h. */
214 find_probes_in_objfile (struct objfile *objfile, const char *provider,
217 VEC (probe_p) *probes, *result = NULL;
221 if (!objfile->sf || !objfile->sf->sym_probe_fns)
224 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
225 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
227 if (strcmp (probe->provider, provider) != 0)
230 if (strcmp (probe->name, name) != 0)
233 VEC_safe_push (probe_p, result, probe);
239 /* See definition in probe.h. */
242 find_probe_by_pc (CORE_ADDR pc)
244 struct objfile *objfile;
245 struct bound_probe result;
247 result.objfile = NULL;
250 ALL_OBJFILES (objfile)
252 VEC (probe_p) *probes;
256 if (!objfile->sf || !objfile->sf->sym_probe_fns
257 || objfile->sect_index_text == -1)
260 /* If this proves too inefficient, we can replace with a hash. */
261 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
262 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
263 if (get_probe_address (probe, objfile) == pc)
265 result.objfile = objfile;
266 result.probe = probe;
276 /* Make a vector of probes matching OBJNAME, PROVIDER, and PROBE_NAME.
277 If POPS is not NULL, only probes of this certain probe_ops will match.
278 Each argument is a regexp, or NULL, which matches anything. */
280 static VEC (bound_probe_s) *
281 collect_probes (char *objname, char *provider, char *probe_name,
282 const struct probe_ops *pops)
284 struct objfile *objfile;
285 VEC (bound_probe_s) *result = NULL;
286 struct cleanup *cleanup;
287 gdb::optional<compiled_regex> obj_pat, prov_pat, probe_pat;
289 cleanup = make_cleanup (VEC_cleanup (bound_probe_s), &result);
291 if (provider != NULL)
292 prov_pat.emplace (provider, REG_NOSUB, _("Invalid provider regexp"));
293 if (probe_name != NULL)
294 probe_pat.emplace (probe_name, REG_NOSUB, _("Invalid probe regexp"));
296 obj_pat.emplace (objname, REG_NOSUB, _("Invalid object file regexp"));
298 ALL_OBJFILES (objfile)
300 VEC (probe_p) *probes;
304 if (! objfile->sf || ! objfile->sf->sym_probe_fns)
309 if (obj_pat->exec (objfile_name (objfile), 0, NULL, 0) != 0)
313 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
315 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
317 struct bound_probe bound;
319 if (pops != NULL && probe->pops != pops)
323 && prov_pat->exec (probe->provider, 0, NULL, 0) != 0)
327 && probe_pat->exec (probe->name, 0, NULL, 0) != 0)
330 bound.objfile = objfile;
332 VEC_safe_push (bound_probe_s, result, &bound);
336 discard_cleanups (cleanup);
340 /* A qsort comparison function for bound_probe_s objects. */
343 compare_probes (const void *a, const void *b)
345 const struct bound_probe *pa = (const struct bound_probe *) a;
346 const struct bound_probe *pb = (const struct bound_probe *) b;
349 v = strcmp (pa->probe->provider, pb->probe->provider);
353 v = strcmp (pa->probe->name, pb->probe->name);
357 if (pa->probe->address < pb->probe->address)
359 if (pa->probe->address > pb->probe->address)
362 return strcmp (objfile_name (pa->objfile), objfile_name (pb->objfile));
365 /* Helper function that generate entries in the ui_out table being
366 crafted by `info_probes_for_ops'. */
369 gen_ui_out_table_header_info (VEC (bound_probe_s) *probes,
370 const struct probe_ops *p)
372 /* `headings' refers to the names of the columns when printing `info
374 VEC (info_probe_column_s) *headings = NULL;
376 info_probe_column_s *column;
377 size_t headings_size;
380 gdb_assert (p != NULL);
382 if (p->gen_info_probes_table_header == NULL
383 && p->gen_info_probes_table_values == NULL)
386 gdb_assert (p->gen_info_probes_table_header != NULL
387 && p->gen_info_probes_table_values != NULL);
389 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
390 p->gen_info_probes_table_header (&headings);
392 headings_size = VEC_length (info_probe_column_s, headings);
395 VEC_iterate (info_probe_column_s, headings, ix, column);
398 struct bound_probe *probe;
400 size_t size_max = strlen (column->print_name);
402 for (jx = 0; VEC_iterate (bound_probe_s, probes, jx, probe); ++jx)
404 /* `probe_fields' refers to the values of each new field that this
405 probe will display. */
406 VEC (const_char_ptr) *probe_fields = NULL;
411 if (probe->probe->pops != p)
414 c2 = make_cleanup (VEC_cleanup (const_char_ptr), &probe_fields);
415 p->gen_info_probes_table_values (probe->probe, &probe_fields);
417 gdb_assert (VEC_length (const_char_ptr, probe_fields)
420 for (kx = 0; VEC_iterate (const_char_ptr, probe_fields, kx, val);
423 /* It is valid to have a NULL value here, which means that the
424 backend does not have something to write and this particular
425 field should be skipped. */
429 size_max = std::max (strlen (val), size_max);
434 current_uiout->table_header (size_max, ui_left,
435 column->field_name, column->print_name);
441 /* Helper function to print not-applicable strings for all the extra
442 columns defined in a probe_ops. */
445 print_ui_out_not_applicables (const struct probe_ops *pops)
448 VEC (info_probe_column_s) *headings = NULL;
449 info_probe_column_s *column;
452 if (pops->gen_info_probes_table_header == NULL)
455 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
456 pops->gen_info_probes_table_header (&headings);
459 VEC_iterate (info_probe_column_s, headings, ix, column);
461 current_uiout->field_string (column->field_name, _("n/a"));
466 /* Helper function to print extra information about a probe and an objfile
467 represented by PROBE. */
470 print_ui_out_info (struct probe *probe)
474 /* `values' refers to the actual values of each new field in the output
475 of `info probe'. `headings' refers to the names of each new field. */
476 VEC (const_char_ptr) *values = NULL;
477 VEC (info_probe_column_s) *headings = NULL;
478 info_probe_column_s *column;
481 gdb_assert (probe != NULL);
482 gdb_assert (probe->pops != NULL);
484 if (probe->pops->gen_info_probes_table_header == NULL
485 && probe->pops->gen_info_probes_table_values == NULL)
488 gdb_assert (probe->pops->gen_info_probes_table_header != NULL
489 && probe->pops->gen_info_probes_table_values != NULL);
491 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
492 make_cleanup (VEC_cleanup (const_char_ptr), &values);
494 probe->pops->gen_info_probes_table_header (&headings);
495 probe->pops->gen_info_probes_table_values (probe, &values);
497 gdb_assert (VEC_length (info_probe_column_s, headings)
498 == VEC_length (const_char_ptr, values));
501 VEC_iterate (info_probe_column_s, headings, ix, column);
504 const char *val = VEC_index (const_char_ptr, values, j++);
507 current_uiout->field_skip (column->field_name);
509 current_uiout->field_string (column->field_name, val);
515 /* Helper function that returns the number of extra fields which POPS will
519 get_number_extra_fields (const struct probe_ops *pops)
521 VEC (info_probe_column_s) *headings = NULL;
525 if (pops->gen_info_probes_table_header == NULL)
528 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
529 pops->gen_info_probes_table_header (&headings);
531 n = VEC_length (info_probe_column_s, headings);
538 /* Helper function that returns 1 if there is a probe in PROBES
539 featuring the given POPS. It returns 0 otherwise. */
542 exists_probe_with_pops (VEC (bound_probe_s) *probes,
543 const struct probe_ops *pops)
545 struct bound_probe *probe;
548 for (ix = 0; VEC_iterate (bound_probe_s, probes, ix, probe); ++ix)
549 if (probe->probe->pops == pops)
555 /* Helper function that parses a probe linespec of the form [PROVIDER
556 [PROBE [OBJNAME]]] from the provided string STR. */
559 parse_probe_linespec (const char *str, char **provider,
560 char **probe_name, char **objname)
562 *probe_name = *objname = NULL;
564 *provider = extract_arg_const (&str);
565 if (*provider != NULL)
567 *probe_name = extract_arg_const (&str);
568 if (*probe_name != NULL)
569 *objname = extract_arg_const (&str);
573 /* See comment in probe.h. */
576 info_probes_for_ops (const char *arg, int from_tty,
577 const struct probe_ops *pops)
579 char *provider, *probe_name = NULL, *objname = NULL;
580 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
581 VEC (bound_probe_s) *probes;
583 int ui_out_extra_fields = 0;
585 size_t size_name = strlen ("Name");
586 size_t size_objname = strlen ("Object");
587 size_t size_provider = strlen ("Provider");
588 size_t size_type = strlen ("Type");
589 struct bound_probe *probe;
590 struct gdbarch *gdbarch = get_current_arch ();
592 parse_probe_linespec (arg, &provider, &probe_name, &objname);
593 make_cleanup (xfree, provider);
594 make_cleanup (xfree, probe_name);
595 make_cleanup (xfree, objname);
597 probes = collect_probes (objname, provider, probe_name, pops);
598 make_cleanup (VEC_cleanup (probe_p), &probes);
602 const struct probe_ops *po;
605 /* If the probe_ops is NULL, it means the user has requested a "simple"
606 `info probes', i.e., she wants to print all information about all
607 probes. For that, we have to identify how many extra fields we will
608 need to add in the ui_out table.
610 To do that, we iterate over all probe_ops, querying each one about
611 its extra fields, and incrementing `ui_out_extra_fields' to reflect
612 that number. But note that we ignore the probe_ops for which no probes
613 are defined with the given search criteria. */
615 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
616 if (exists_probe_with_pops (probes, po))
617 ui_out_extra_fields += get_number_extra_fields (po);
620 ui_out_extra_fields = get_number_extra_fields (pops);
622 make_cleanup_ui_out_table_begin_end (current_uiout,
623 5 + ui_out_extra_fields,
624 VEC_length (bound_probe_s, probes),
627 if (!VEC_empty (bound_probe_s, probes))
628 qsort (VEC_address (bound_probe_s, probes),
629 VEC_length (bound_probe_s, probes),
630 sizeof (bound_probe_s), compare_probes);
632 /* What's the size of an address in our architecture? */
633 size_addr = gdbarch_addr_bit (gdbarch) == 64 ? 18 : 10;
635 /* Determining the maximum size of each field (`type', `provider',
636 `name' and `objname'). */
637 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
639 const char *probe_type = probe->probe->pops->type_name (probe->probe);
641 size_type = std::max (strlen (probe_type), size_type);
642 size_name = std::max (strlen (probe->probe->name), size_name);
643 size_provider = std::max (strlen (probe->probe->provider), size_provider);
644 size_objname = std::max (strlen (objfile_name (probe->objfile)),
648 current_uiout->table_header (size_type, ui_left, "type", _("Type"));
649 current_uiout->table_header (size_provider, ui_left, "provider",
651 current_uiout->table_header (size_name, ui_left, "name", _("Name"));
652 current_uiout->table_header (size_addr, ui_left, "addr", _("Where"));
656 const struct probe_ops *po;
659 /* We have to generate the table header for each new probe type
660 that we will print. Note that this excludes probe types not
661 having any defined probe with the search criteria. */
662 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
663 if (exists_probe_with_pops (probes, po))
664 gen_ui_out_table_header_info (probes, po);
667 gen_ui_out_table_header_info (probes, pops);
669 current_uiout->table_header (size_objname, ui_left, "object", _("Object"));
670 current_uiout->table_body ();
672 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
674 const char *probe_type = probe->probe->pops->type_name (probe->probe);
676 ui_out_emit_tuple tuple_emitter (current_uiout, "probe");
678 current_uiout->field_string ("type",probe_type);
679 current_uiout->field_string ("provider", probe->probe->provider);
680 current_uiout->field_string ("name", probe->probe->name);
681 current_uiout->field_core_addr (
682 "addr", probe->probe->arch,
683 get_probe_address (probe->probe, probe->objfile));
687 const struct probe_ops *po;
690 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po);
692 if (probe->probe->pops == po)
693 print_ui_out_info (probe->probe);
694 else if (exists_probe_with_pops (probes, po))
695 print_ui_out_not_applicables (po);
698 print_ui_out_info (probe->probe);
700 current_uiout->field_string ("object",
701 objfile_name (probe->objfile));
702 current_uiout->text ("\n");
705 any_found = !VEC_empty (bound_probe_s, probes);
706 do_cleanups (cleanup);
709 current_uiout->message (_("No probes matched.\n"));
712 /* Implementation of the `info probes' command. */
715 info_probes_command (char *arg, int from_tty)
717 info_probes_for_ops (arg, from_tty, NULL);
720 /* Implementation of the `enable probes' command. */
723 enable_probes_command (char *arg, int from_tty)
725 char *provider, *probe_name = NULL, *objname = NULL;
726 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
727 VEC (bound_probe_s) *probes;
728 struct bound_probe *probe;
731 parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
732 make_cleanup (xfree, provider);
733 make_cleanup (xfree, probe_name);
734 make_cleanup (xfree, objname);
736 probes = collect_probes (objname, provider, probe_name, NULL);
737 if (VEC_empty (bound_probe_s, probes))
739 current_uiout->message (_("No probes matched.\n"));
740 do_cleanups (cleanup);
744 /* Enable the selected probes, provided their backends support the
745 notion of enabling a probe. */
746 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
748 const struct probe_ops *pops = probe->probe->pops;
750 if (pops->enable_probe != NULL)
752 pops->enable_probe (probe->probe);
753 current_uiout->message (_("Probe %s:%s enabled.\n"),
754 probe->probe->provider, probe->probe->name);
757 current_uiout->message (_("Probe %s:%s cannot be enabled.\n"),
758 probe->probe->provider, probe->probe->name);
761 do_cleanups (cleanup);
764 /* Implementation of the `disable probes' command. */
767 disable_probes_command (char *arg, int from_tty)
769 char *provider, *probe_name = NULL, *objname = NULL;
770 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
771 VEC (bound_probe_s) *probes;
772 struct bound_probe *probe;
775 parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
776 make_cleanup (xfree, provider);
777 make_cleanup (xfree, probe_name);
778 make_cleanup (xfree, objname);
780 probes = collect_probes (objname, provider, probe_name, NULL /* pops */);
781 if (VEC_empty (bound_probe_s, probes))
783 current_uiout->message (_("No probes matched.\n"));
784 do_cleanups (cleanup);
788 /* Disable the selected probes, provided their backends support the
789 notion of enabling a probe. */
790 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
792 const struct probe_ops *pops = probe->probe->pops;
794 if (pops->disable_probe != NULL)
796 pops->disable_probe (probe->probe);
797 current_uiout->message (_("Probe %s:%s disabled.\n"),
798 probe->probe->provider, probe->probe->name);
801 current_uiout->message (_("Probe %s:%s cannot be disabled.\n"),
802 probe->probe->provider, probe->probe->name);
805 do_cleanups (cleanup);
808 /* See comments in probe.h. */
811 get_probe_address (struct probe *probe, struct objfile *objfile)
813 return probe->pops->get_probe_address (probe, objfile);
816 /* See comments in probe.h. */
819 get_probe_argument_count (struct probe *probe, struct frame_info *frame)
821 return probe->pops->get_probe_argument_count (probe, frame);
824 /* See comments in probe.h. */
827 can_evaluate_probe_arguments (struct probe *probe)
829 return probe->pops->can_evaluate_probe_arguments (probe);
832 /* See comments in probe.h. */
835 evaluate_probe_argument (struct probe *probe, unsigned n,
836 struct frame_info *frame)
838 return probe->pops->evaluate_probe_argument (probe, n, frame);
841 /* See comments in probe.h. */
844 probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n)
846 struct bound_probe probe;
849 probe = find_probe_by_pc (get_frame_pc (frame));
853 n_args = get_probe_argument_count (probe.probe, frame);
857 return evaluate_probe_argument (probe.probe, n, frame);
860 /* See comment in probe.h. */
862 const struct probe_ops *
863 probe_linespec_to_ops (const char **linespecp)
866 const struct probe_ops *probe_ops;
868 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, probe_ops); ix++)
869 if (probe_ops->is_linespec (linespecp))
875 /* See comment in probe.h. */
878 probe_is_linespec_by_keyword (const char **linespecp, const char *const *keywords)
880 const char *s = *linespecp;
881 const char *const *csp;
883 for (csp = keywords; *csp; csp++)
885 const char *keyword = *csp;
886 size_t len = strlen (keyword);
888 if (strncmp (s, keyword, len) == 0 && isspace (s[len]))
890 *linespecp += len + 1;
898 /* Implementation of `is_linespec' method for `struct probe_ops'. */
901 probe_any_is_linespec (const char **linespecp)
903 static const char *const keywords[] = { "-p", "-probe", NULL };
905 return probe_is_linespec_by_keyword (linespecp, keywords);
908 /* Dummy method used for `probe_ops_any'. */
911 probe_any_get_probes (VEC (probe_p) **probesp, struct objfile *objfile)
913 /* No probes can be provided by this dummy backend. */
916 /* Operations associated with a generic probe. */
918 const struct probe_ops probe_ops_any =
920 probe_any_is_linespec,
921 probe_any_get_probes,
924 /* See comments in probe.h. */
926 struct cmd_list_element **
927 info_probes_cmdlist_get (void)
929 static struct cmd_list_element *info_probes_cmdlist;
931 if (info_probes_cmdlist == NULL)
932 add_prefix_cmd ("probes", class_info, info_probes_command,
934 Show available static probes.\n\
935 Usage: info probes [all|TYPE [ARGS]]\n\
936 TYPE specifies the type of the probe, and can be one of the following:\n\
938 If you specify TYPE, there may be additional arguments needed by the\n\
940 If you do not specify any argument, or specify `all', then the command\n\
941 will show information about all types of probes."),
942 &info_probes_cmdlist, "info probes ",
943 0/*allow-unknown*/, &infolist);
945 return &info_probes_cmdlist;
950 /* This is called to compute the value of one of the $_probe_arg*
951 convenience variables. */
953 static struct value *
954 compute_probe_arg (struct gdbarch *arch, struct internalvar *ivar,
957 struct frame_info *frame = get_selected_frame (_("No frame selected"));
958 CORE_ADDR pc = get_frame_pc (frame);
959 int sel = (int) (uintptr_t) data;
960 struct bound_probe pc_probe;
961 const struct sym_probe_fns *pc_probe_fns;
964 /* SEL == -1 means "_probe_argc". */
965 gdb_assert (sel >= -1);
967 pc_probe = find_probe_by_pc (pc);
968 if (pc_probe.probe == NULL)
969 error (_("No probe at PC %s"), core_addr_to_string (pc));
971 n_args = get_probe_argument_count (pc_probe.probe, frame);
973 return value_from_longest (builtin_type (arch)->builtin_int, n_args);
976 error (_("Invalid probe argument %d -- probe has %u arguments available"),
979 return evaluate_probe_argument (pc_probe.probe, sel, frame);
982 /* This is called to compile one of the $_probe_arg* convenience
983 variables into an agent expression. */
986 compile_probe_arg (struct internalvar *ivar, struct agent_expr *expr,
987 struct axs_value *value, void *data)
989 CORE_ADDR pc = expr->scope;
990 int sel = (int) (uintptr_t) data;
991 struct bound_probe pc_probe;
992 const struct sym_probe_fns *pc_probe_fns;
994 struct frame_info *frame = get_selected_frame (NULL);
996 /* SEL == -1 means "_probe_argc". */
997 gdb_assert (sel >= -1);
999 pc_probe = find_probe_by_pc (pc);
1000 if (pc_probe.probe == NULL)
1001 error (_("No probe at PC %s"), core_addr_to_string (pc));
1003 n_args = get_probe_argument_count (pc_probe.probe, frame);
1007 value->kind = axs_rvalue;
1008 value->type = builtin_type (expr->gdbarch)->builtin_int;
1009 ax_const_l (expr, n_args);
1013 gdb_assert (sel >= 0);
1015 error (_("Invalid probe argument %d -- probe has %d arguments available"),
1018 pc_probe.probe->pops->compile_to_ax (pc_probe.probe, expr, value, sel);
1021 static const struct internalvar_funcs probe_funcs =
1029 VEC (probe_ops_cp) *all_probe_ops;
1031 void _initialize_probe (void);
1034 _initialize_probe (void)
1036 VEC_safe_push (probe_ops_cp, all_probe_ops, &probe_ops_any);
1038 create_internalvar_type_lazy ("_probe_argc", &probe_funcs,
1039 (void *) (uintptr_t) -1);
1040 create_internalvar_type_lazy ("_probe_arg0", &probe_funcs,
1041 (void *) (uintptr_t) 0);
1042 create_internalvar_type_lazy ("_probe_arg1", &probe_funcs,
1043 (void *) (uintptr_t) 1);
1044 create_internalvar_type_lazy ("_probe_arg2", &probe_funcs,
1045 (void *) (uintptr_t) 2);
1046 create_internalvar_type_lazy ("_probe_arg3", &probe_funcs,
1047 (void *) (uintptr_t) 3);
1048 create_internalvar_type_lazy ("_probe_arg4", &probe_funcs,
1049 (void *) (uintptr_t) 4);
1050 create_internalvar_type_lazy ("_probe_arg5", &probe_funcs,
1051 (void *) (uintptr_t) 5);
1052 create_internalvar_type_lazy ("_probe_arg6", &probe_funcs,
1053 (void *) (uintptr_t) 6);
1054 create_internalvar_type_lazy ("_probe_arg7", &probe_funcs,
1055 (void *) (uintptr_t) 7);
1056 create_internalvar_type_lazy ("_probe_arg8", &probe_funcs,
1057 (void *) (uintptr_t) 8);
1058 create_internalvar_type_lazy ("_probe_arg9", &probe_funcs,
1059 (void *) (uintptr_t) 9);
1060 create_internalvar_type_lazy ("_probe_arg10", &probe_funcs,
1061 (void *) (uintptr_t) 10);
1062 create_internalvar_type_lazy ("_probe_arg11", &probe_funcs,
1063 (void *) (uintptr_t) 11);
1065 add_cmd ("all", class_info, info_probes_command,
1067 Show information about all type of probes."),
1068 info_probes_cmdlist_get ());
1070 add_cmd ("probes", class_breakpoint, enable_probes_command, _("\
1072 Usage: enable probes [PROVIDER [NAME [OBJECT]]]\n\
1073 Each argument is a regular expression, used to select probes.\n\
1074 PROVIDER matches probe provider names.\n\
1075 NAME matches the probe names.\n\
1076 OBJECT matches the executable or shared library name.\n\
1077 If you do not specify any argument then the command will enable\n\
1078 all defined probes."),
1081 add_cmd ("probes", class_breakpoint, disable_probes_command, _("\
1083 Usage: disable probes [PROVIDER [NAME [OBJECT]]]\n\
1084 Each argument is a regular expression, used to select probes.\n\
1085 PROVIDER matches probe provider names.\n\
1086 NAME matches the probe names.\n\
1087 OBJECT matches the executable or shared library name.\n\
1088 If you do not specify any argument then the command will disable\n\
1089 all defined probes."),