]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/probe.c
[binutils, ARM, 4/16] BF insns infrastructure with array of relocs in struct arm_it
[thirdparty/binutils-gdb.git] / gdb / probe.c
1 /* Generic static probe support for GDB.
2
3 Copyright (C) 2012-2019 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
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.
11
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.
16
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/>. */
19
20 #include "defs.h"
21 #include "probe.h"
22 #include "command.h"
23 #include "cli/cli-cmds.h"
24 #include "cli/cli-utils.h"
25 #include "objfiles.h"
26 #include "symtab.h"
27 #include "progspace.h"
28 #include "filenames.h"
29 #include "linespec.h"
30 #include "gdb_regex.h"
31 #include "frame.h"
32 #include "arch-utils.h"
33 #include "value.h"
34 #include "ax.h"
35 #include "ax-gdb.h"
36 #include "location.h"
37 #include <ctype.h>
38 #include <algorithm>
39 #include "common/gdb_optional.h"
40
41 /* Class that implements the static probe methods for "any" probe. */
42
43 class any_static_probe_ops : public static_probe_ops
44 {
45 public:
46 /* See probe.h. */
47 bool is_linespec (const char **linespecp) const override;
48
49 /* See probe.h. */
50 void get_probes (std::vector<probe *> *probesp,
51 struct objfile *objfile) const override;
52
53 /* See probe.h. */
54 const char *type_name () const override;
55
56 /* See probe.h. */
57 std::vector<struct info_probe_column> gen_info_probes_table_header
58 () const override;
59 };
60
61 /* Static operations associated with a generic probe. */
62
63 const any_static_probe_ops any_static_probe_ops {};
64
65 /* A helper for parse_probes that decodes a probe specification in
66 SEARCH_PSPACE. It appends matching SALs to RESULT. */
67
68 static void
69 parse_probes_in_pspace (const static_probe_ops *spops,
70 struct program_space *search_pspace,
71 const char *objfile_namestr,
72 const char *provider,
73 const char *name,
74 std::vector<symtab_and_line> *result)
75 {
76 for (objfile *objfile : search_pspace->objfiles ())
77 {
78 if (!objfile->sf || !objfile->sf->sym_probe_fns)
79 continue;
80
81 if (objfile_namestr
82 && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0
83 && FILENAME_CMP (lbasename (objfile_name (objfile)),
84 objfile_namestr) != 0)
85 continue;
86
87 const std::vector<probe *> &probes
88 = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
89
90 for (probe *p : probes)
91 {
92 if (spops != &any_static_probe_ops && p->get_static_ops () != spops)
93 continue;
94
95 if (provider != NULL && p->get_provider () != provider)
96 continue;
97
98 if (p->get_name () != name)
99 continue;
100
101 symtab_and_line sal;
102 sal.pc = p->get_relocated_address (objfile);
103 sal.explicit_pc = 1;
104 sal.section = find_pc_overlay (sal.pc);
105 sal.pspace = search_pspace;
106 sal.prob = p;
107 sal.objfile = objfile;
108
109 result->push_back (std::move (sal));
110 }
111 }
112 }
113
114 /* See definition in probe.h. */
115
116 std::vector<symtab_and_line>
117 parse_probes (const struct event_location *location,
118 struct program_space *search_pspace,
119 struct linespec_result *canonical)
120 {
121 char *arg_end, *arg;
122 char *objfile_namestr = NULL, *provider = NULL, *name, *p;
123 const char *arg_start, *cs;
124
125 gdb_assert (event_location_type (location) == PROBE_LOCATION);
126 arg_start = get_probe_location (location);
127
128 cs = arg_start;
129 const static_probe_ops *spops = probe_linespec_to_static_ops (&cs);
130 if (spops == NULL)
131 error (_("'%s' is not a probe linespec"), arg_start);
132
133 arg = (char *) cs;
134 arg = skip_spaces (arg);
135 if (!*arg)
136 error (_("argument to `%s' missing"), arg_start);
137
138 arg_end = skip_to_space (arg);
139
140 /* We make a copy here so we can write over parts with impunity. */
141 std::string copy (arg, arg_end - arg);
142 arg = &copy[0];
143
144 /* Extract each word from the argument, separated by ":"s. */
145 p = strchr (arg, ':');
146 if (p == NULL)
147 {
148 /* This is `-p name'. */
149 name = arg;
150 }
151 else
152 {
153 char *hold = p + 1;
154
155 *p = '\0';
156 p = strchr (hold, ':');
157 if (p == NULL)
158 {
159 /* This is `-p provider:name'. */
160 provider = arg;
161 name = hold;
162 }
163 else
164 {
165 /* This is `-p objfile:provider:name'. */
166 *p = '\0';
167 objfile_namestr = arg;
168 provider = hold;
169 name = p + 1;
170 }
171 }
172
173 if (*name == '\0')
174 error (_("no probe name specified"));
175 if (provider && *provider == '\0')
176 error (_("invalid provider name"));
177 if (objfile_namestr && *objfile_namestr == '\0')
178 error (_("invalid objfile name"));
179
180 std::vector<symtab_and_line> result;
181 if (search_pspace != NULL)
182 {
183 parse_probes_in_pspace (spops, search_pspace, objfile_namestr,
184 provider, name, &result);
185 }
186 else
187 {
188 struct program_space *pspace;
189
190 ALL_PSPACES (pspace)
191 parse_probes_in_pspace (spops, pspace, objfile_namestr,
192 provider, name, &result);
193 }
194
195 if (result.empty ())
196 {
197 throw_error (NOT_FOUND_ERROR,
198 _("No probe matching objfile=`%s', provider=`%s', name=`%s'"),
199 objfile_namestr ? objfile_namestr : _("<any>"),
200 provider ? provider : _("<any>"),
201 name);
202 }
203
204 if (canonical)
205 {
206 std::string canon (arg_start, arg_end - arg_start);
207 canonical->special_display = 1;
208 canonical->pre_expanded = 1;
209 canonical->location = new_probe_location (canon.c_str ());
210 }
211
212 return result;
213 }
214
215 /* See definition in probe.h. */
216
217 std::vector<probe *>
218 find_probes_in_objfile (struct objfile *objfile, const char *provider,
219 const char *name)
220 {
221 std::vector<probe *> result;
222
223 if (!objfile->sf || !objfile->sf->sym_probe_fns)
224 return result;
225
226 const std::vector<probe *> &probes
227 = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
228 for (probe *p : probes)
229 {
230 if (p->get_provider () != provider)
231 continue;
232
233 if (p->get_name () != name)
234 continue;
235
236 result.push_back (p);
237 }
238
239 return result;
240 }
241
242 /* See definition in probe.h. */
243
244 struct bound_probe
245 find_probe_by_pc (CORE_ADDR pc)
246 {
247 struct bound_probe result;
248
249 result.objfile = NULL;
250 result.prob = NULL;
251
252 for (objfile *objfile : current_program_space->objfiles ())
253 {
254 if (!objfile->sf || !objfile->sf->sym_probe_fns
255 || objfile->sect_index_text == -1)
256 continue;
257
258 /* If this proves too inefficient, we can replace with a hash. */
259 const std::vector<probe *> &probes
260 = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
261 for (probe *p : probes)
262 if (p->get_relocated_address (objfile) == pc)
263 {
264 result.objfile = objfile;
265 result.prob = p;
266 return result;
267 }
268 }
269
270 return result;
271 }
272
273 \f
274
275 /* Make a vector of probes matching OBJNAME, PROVIDER, and PROBE_NAME.
276 If SPOPS is not &any_static_probe_ops, only probes related to this
277 specific static probe ops will match. Each argument is a regexp,
278 or NULL, which matches anything. */
279
280 static std::vector<bound_probe>
281 collect_probes (const std::string &objname, const std::string &provider,
282 const std::string &probe_name, const static_probe_ops *spops)
283 {
284 std::vector<bound_probe> result;
285 gdb::optional<compiled_regex> obj_pat, prov_pat, probe_pat;
286
287 if (!provider.empty ())
288 prov_pat.emplace (provider.c_str (), REG_NOSUB,
289 _("Invalid provider regexp"));
290 if (!probe_name.empty ())
291 probe_pat.emplace (probe_name.c_str (), REG_NOSUB,
292 _("Invalid probe regexp"));
293 if (!objname.empty ())
294 obj_pat.emplace (objname.c_str (), REG_NOSUB,
295 _("Invalid object file regexp"));
296
297 for (objfile *objfile : current_program_space->objfiles ())
298 {
299 if (! objfile->sf || ! objfile->sf->sym_probe_fns)
300 continue;
301
302 if (obj_pat)
303 {
304 if (obj_pat->exec (objfile_name (objfile), 0, NULL, 0) != 0)
305 continue;
306 }
307
308 const std::vector<probe *> &probes
309 = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
310
311 for (probe *p : probes)
312 {
313 if (spops != &any_static_probe_ops && p->get_static_ops () != spops)
314 continue;
315
316 if (prov_pat
317 && prov_pat->exec (p->get_provider ().c_str (), 0, NULL, 0) != 0)
318 continue;
319
320 if (probe_pat
321 && probe_pat->exec (p->get_name ().c_str (), 0, NULL, 0) != 0)
322 continue;
323
324 result.emplace_back (p, objfile);
325 }
326 }
327
328 return result;
329 }
330
331 /* A qsort comparison function for bound_probe_s objects. */
332
333 static bool
334 compare_probes (const bound_probe &a, const bound_probe &b)
335 {
336 int v;
337
338 v = a.prob->get_provider ().compare (b.prob->get_provider ());
339 if (v != 0)
340 return v < 0;
341
342 v = a.prob->get_name ().compare (b.prob->get_name ());
343 if (v != 0)
344 return v < 0;
345
346 if (a.prob->get_address () != b.prob->get_address ())
347 return a.prob->get_address () < b.prob->get_address ();
348
349 return strcmp (objfile_name (a.objfile), objfile_name (b.objfile)) < 0;
350 }
351
352 /* Helper function that generate entries in the ui_out table being
353 crafted by `info_probes_for_ops'. */
354
355 static void
356 gen_ui_out_table_header_info (const std::vector<bound_probe> &probes,
357 const static_probe_ops *spops)
358 {
359 /* `headings' refers to the names of the columns when printing `info
360 probes'. */
361 gdb_assert (spops != NULL);
362
363 std::vector<struct info_probe_column> headings
364 = spops->gen_info_probes_table_header ();
365
366 for (const info_probe_column &column : headings)
367 {
368 size_t size_max = strlen (column.print_name);
369
370 for (const bound_probe &probe : probes)
371 {
372 /* `probe_fields' refers to the values of each new field that this
373 probe will display. */
374
375 if (probe.prob->get_static_ops () != spops)
376 continue;
377
378 std::vector<const char *> probe_fields
379 = probe.prob->gen_info_probes_table_values ();
380
381 gdb_assert (probe_fields.size () == headings.size ());
382
383 for (const char *val : probe_fields)
384 {
385 /* It is valid to have a NULL value here, which means that the
386 backend does not have something to write and this particular
387 field should be skipped. */
388 if (val == NULL)
389 continue;
390
391 size_max = std::max (strlen (val), size_max);
392 }
393 }
394
395 current_uiout->table_header (size_max, ui_left,
396 column.field_name, column.print_name);
397 }
398 }
399
400 /* Helper function to print not-applicable strings for all the extra
401 columns defined in a static_probe_ops. */
402
403 static void
404 print_ui_out_not_applicables (const static_probe_ops *spops)
405 {
406 std::vector<struct info_probe_column> headings
407 = spops->gen_info_probes_table_header ();
408
409 for (const info_probe_column &column : headings)
410 current_uiout->field_string (column.field_name, _("n/a"));
411 }
412
413 /* Helper function to print extra information about a probe and an objfile
414 represented by PROBE. */
415
416 static void
417 print_ui_out_info (probe *probe)
418 {
419 /* `values' refers to the actual values of each new field in the output
420 of `info probe'. `headings' refers to the names of each new field. */
421 gdb_assert (probe != NULL);
422 std::vector<struct info_probe_column> headings
423 = probe->get_static_ops ()->gen_info_probes_table_header ();
424 std::vector<const char *> values
425 = probe->gen_info_probes_table_values ();
426
427 gdb_assert (headings.size () == values.size ());
428
429 for (int ix = 0; ix < headings.size (); ++ix)
430 {
431 struct info_probe_column column = headings[ix];
432 const char *val = values[ix];
433
434 if (val == NULL)
435 current_uiout->field_skip (column.field_name);
436 else
437 current_uiout->field_string (column.field_name, val);
438 }
439 }
440
441 /* Helper function that returns the number of extra fields which POPS will
442 need. */
443
444 static int
445 get_number_extra_fields (const static_probe_ops *spops)
446 {
447 return spops->gen_info_probes_table_header ().size ();
448 }
449
450 /* Helper function that returns true if there is a probe in PROBES
451 featuring the given SPOPS. It returns false otherwise. */
452
453 static bool
454 exists_probe_with_spops (const std::vector<bound_probe> &probes,
455 const static_probe_ops *spops)
456 {
457 for (const bound_probe &probe : probes)
458 if (probe.prob->get_static_ops () == spops)
459 return true;
460
461 return false;
462 }
463
464 /* Helper function that parses a probe linespec of the form [PROVIDER
465 [PROBE [OBJNAME]]] from the provided string STR. */
466
467 static void
468 parse_probe_linespec (const char *str, std::string *provider,
469 std::string *probe_name, std::string *objname)
470 {
471 *probe_name = *objname = "";
472
473 *provider = extract_arg (&str);
474 if (!provider->empty ())
475 {
476 *probe_name = extract_arg (&str);
477 if (!probe_name->empty ())
478 *objname = extract_arg (&str);
479 }
480 }
481
482 /* See comment in probe.h. */
483
484 void
485 info_probes_for_spops (const char *arg, int from_tty,
486 const static_probe_ops *spops)
487 {
488 std::string provider, probe_name, objname;
489 int any_found;
490 int ui_out_extra_fields = 0;
491 size_t size_addr;
492 size_t size_name = strlen ("Name");
493 size_t size_objname = strlen ("Object");
494 size_t size_provider = strlen ("Provider");
495 size_t size_type = strlen ("Type");
496 struct gdbarch *gdbarch = get_current_arch ();
497
498 parse_probe_linespec (arg, &provider, &probe_name, &objname);
499
500 std::vector<bound_probe> probes
501 = collect_probes (objname, provider, probe_name, spops);
502
503 if (spops == &any_static_probe_ops)
504 {
505 /* If SPOPS is &any_static_probe_ops, it means the user has
506 requested a "simple" `info probes', i.e., she wants to print
507 all information about all probes. For that, we have to
508 identify how many extra fields we will need to add in the
509 ui_out table.
510
511 To do that, we iterate over all static_probe_ops, querying
512 each one about its extra fields, and incrementing
513 `ui_out_extra_fields' to reflect that number. But note that
514 we ignore the static_probe_ops for which no probes are
515 defined with the given search criteria. */
516
517 for (const static_probe_ops *po : all_static_probe_ops)
518 if (exists_probe_with_spops (probes, po))
519 ui_out_extra_fields += get_number_extra_fields (po);
520 }
521 else
522 ui_out_extra_fields = get_number_extra_fields (spops);
523
524 {
525 ui_out_emit_table table_emitter (current_uiout,
526 5 + ui_out_extra_fields,
527 probes.size (), "StaticProbes");
528
529 std::sort (probes.begin (), probes.end (), compare_probes);
530
531 /* What's the size of an address in our architecture? */
532 size_addr = gdbarch_addr_bit (gdbarch) == 64 ? 18 : 10;
533
534 /* Determining the maximum size of each field (`type', `provider',
535 `name' and `objname'). */
536 for (const bound_probe &probe : probes)
537 {
538 const char *probe_type = probe.prob->get_static_ops ()->type_name ();
539
540 size_type = std::max (strlen (probe_type), size_type);
541 size_name = std::max (probe.prob->get_name ().size (), size_name);
542 size_provider = std::max (probe.prob->get_provider ().size (),
543 size_provider);
544 size_objname = std::max (strlen (objfile_name (probe.objfile)),
545 size_objname);
546 }
547
548 current_uiout->table_header (size_type, ui_left, "type", _("Type"));
549 current_uiout->table_header (size_provider, ui_left, "provider",
550 _("Provider"));
551 current_uiout->table_header (size_name, ui_left, "name", _("Name"));
552 current_uiout->table_header (size_addr, ui_left, "addr", _("Where"));
553
554 if (spops == &any_static_probe_ops)
555 {
556 /* We have to generate the table header for each new probe type
557 that we will print. Note that this excludes probe types not
558 having any defined probe with the search criteria. */
559 for (const static_probe_ops *po : all_static_probe_ops)
560 if (exists_probe_with_spops (probes, po))
561 gen_ui_out_table_header_info (probes, po);
562 }
563 else
564 gen_ui_out_table_header_info (probes, spops);
565
566 current_uiout->table_header (size_objname, ui_left, "object", _("Object"));
567 current_uiout->table_body ();
568
569 for (const bound_probe &probe : probes)
570 {
571 const char *probe_type = probe.prob->get_static_ops ()->type_name ();
572
573 ui_out_emit_tuple tuple_emitter (current_uiout, "probe");
574
575 current_uiout->field_string ("type", probe_type);
576 current_uiout->field_string ("provider",
577 probe.prob->get_provider ().c_str ());
578 current_uiout->field_string ("name", probe.prob->get_name ().c_str ());
579 current_uiout->field_core_addr ("addr", probe.prob->get_gdbarch (),
580 probe.prob->get_relocated_address
581 (probe.objfile));
582
583 if (spops == &any_static_probe_ops)
584 {
585 for (const static_probe_ops *po : all_static_probe_ops)
586 {
587 if (probe.prob->get_static_ops () == po)
588 print_ui_out_info (probe.prob);
589 else if (exists_probe_with_spops (probes, po))
590 print_ui_out_not_applicables (po);
591 }
592 }
593 else
594 print_ui_out_info (probe.prob);
595
596 current_uiout->field_string ("object",
597 objfile_name (probe.objfile));
598 current_uiout->text ("\n");
599 }
600
601 any_found = !probes.empty ();
602 }
603
604 if (!any_found)
605 current_uiout->message (_("No probes matched.\n"));
606 }
607
608 /* Implementation of the `info probes' command. */
609
610 static void
611 info_probes_command (const char *arg, int from_tty)
612 {
613 info_probes_for_spops (arg, from_tty, &any_static_probe_ops);
614 }
615
616 /* Implementation of the `enable probes' command. */
617
618 static void
619 enable_probes_command (const char *arg, int from_tty)
620 {
621 std::string provider, probe_name, objname;
622
623 parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
624
625 std::vector<bound_probe> probes
626 = collect_probes (objname, provider, probe_name, &any_static_probe_ops);
627 if (probes.empty ())
628 {
629 current_uiout->message (_("No probes matched.\n"));
630 return;
631 }
632
633 /* Enable the selected probes, provided their backends support the
634 notion of enabling a probe. */
635 for (const bound_probe &probe: probes)
636 {
637 if (probe.prob->get_static_ops ()->can_enable ())
638 {
639 probe.prob->enable ();
640 current_uiout->message (_("Probe %s:%s enabled.\n"),
641 probe.prob->get_provider ().c_str (),
642 probe.prob->get_name ().c_str ());
643 }
644 else
645 current_uiout->message (_("Probe %s:%s cannot be enabled.\n"),
646 probe.prob->get_provider ().c_str (),
647 probe.prob->get_name ().c_str ());
648 }
649 }
650
651 /* Implementation of the `disable probes' command. */
652
653 static void
654 disable_probes_command (const char *arg, int from_tty)
655 {
656 std::string provider, probe_name, objname;
657
658 parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
659
660 std::vector<bound_probe> probes
661 = collect_probes (objname, provider, probe_name, &any_static_probe_ops);
662 if (probes.empty ())
663 {
664 current_uiout->message (_("No probes matched.\n"));
665 return;
666 }
667
668 /* Disable the selected probes, provided their backends support the
669 notion of enabling a probe. */
670 for (const bound_probe &probe : probes)
671 {
672 if (probe.prob->get_static_ops ()->can_enable ())
673 {
674 probe.prob->disable ();
675 current_uiout->message (_("Probe %s:%s disabled.\n"),
676 probe.prob->get_provider ().c_str (),
677 probe.prob->get_name ().c_str ());
678 }
679 else
680 current_uiout->message (_("Probe %s:%s cannot be disabled.\n"),
681 probe.prob->get_provider ().c_str (),
682 probe.prob->get_name ().c_str ());
683 }
684 }
685
686 /* See comments in probe.h. */
687
688 struct value *
689 probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n)
690 {
691 struct bound_probe probe;
692 unsigned n_args;
693
694 probe = find_probe_by_pc (get_frame_pc (frame));
695 if (!probe.prob)
696 return NULL;
697
698 n_args = probe.prob->get_argument_count (frame);
699 if (n >= n_args)
700 return NULL;
701
702 return probe.prob->evaluate_argument (n, frame);
703 }
704
705 /* See comment in probe.h. */
706
707 const struct static_probe_ops *
708 probe_linespec_to_static_ops (const char **linespecp)
709 {
710 for (const static_probe_ops *ops : all_static_probe_ops)
711 if (ops->is_linespec (linespecp))
712 return ops;
713
714 return NULL;
715 }
716
717 /* See comment in probe.h. */
718
719 int
720 probe_is_linespec_by_keyword (const char **linespecp, const char *const *keywords)
721 {
722 const char *s = *linespecp;
723 const char *const *csp;
724
725 for (csp = keywords; *csp; csp++)
726 {
727 const char *keyword = *csp;
728 size_t len = strlen (keyword);
729
730 if (strncmp (s, keyword, len) == 0 && isspace (s[len]))
731 {
732 *linespecp += len + 1;
733 return 1;
734 }
735 }
736
737 return 0;
738 }
739
740 /* Implementation of `is_linespec' method. */
741
742 bool
743 any_static_probe_ops::is_linespec (const char **linespecp) const
744 {
745 static const char *const keywords[] = { "-p", "-probe", NULL };
746
747 return probe_is_linespec_by_keyword (linespecp, keywords);
748 }
749
750 /* Implementation of 'get_probes' method. */
751
752 void
753 any_static_probe_ops::get_probes (std::vector<probe *> *probesp,
754 struct objfile *objfile) const
755 {
756 /* No probes can be provided by this dummy backend. */
757 }
758
759 /* Implementation of the 'type_name' method. */
760
761 const char *
762 any_static_probe_ops::type_name () const
763 {
764 return NULL;
765 }
766
767 /* Implementation of the 'gen_info_probes_table_header' method. */
768
769 std::vector<struct info_probe_column>
770 any_static_probe_ops::gen_info_probes_table_header () const
771 {
772 return std::vector<struct info_probe_column> ();
773 }
774
775 /* See comments in probe.h. */
776
777 struct cmd_list_element **
778 info_probes_cmdlist_get (void)
779 {
780 static struct cmd_list_element *info_probes_cmdlist;
781
782 if (info_probes_cmdlist == NULL)
783 add_prefix_cmd ("probes", class_info, info_probes_command,
784 _("\
785 Show available static probes.\n\
786 Usage: info probes [all|TYPE [ARGS]]\n\
787 TYPE specifies the type of the probe, and can be one of the following:\n\
788 - stap\n\
789 If you specify TYPE, there may be additional arguments needed by the\n\
790 subcommand.\n\
791 If you do not specify any argument, or specify `all', then the command\n\
792 will show information about all types of probes."),
793 &info_probes_cmdlist, "info probes ",
794 0/*allow-unknown*/, &infolist);
795
796 return &info_probes_cmdlist;
797 }
798
799 \f
800
801 /* This is called to compute the value of one of the $_probe_arg*
802 convenience variables. */
803
804 static struct value *
805 compute_probe_arg (struct gdbarch *arch, struct internalvar *ivar,
806 void *data)
807 {
808 struct frame_info *frame = get_selected_frame (_("No frame selected"));
809 CORE_ADDR pc = get_frame_pc (frame);
810 int sel = (int) (uintptr_t) data;
811 struct bound_probe pc_probe;
812 unsigned n_args;
813
814 /* SEL == -1 means "_probe_argc". */
815 gdb_assert (sel >= -1);
816
817 pc_probe = find_probe_by_pc (pc);
818 if (pc_probe.prob == NULL)
819 error (_("No probe at PC %s"), core_addr_to_string (pc));
820
821 n_args = pc_probe.prob->get_argument_count (frame);
822 if (sel == -1)
823 return value_from_longest (builtin_type (arch)->builtin_int, n_args);
824
825 if (sel >= n_args)
826 error (_("Invalid probe argument %d -- probe has %u arguments available"),
827 sel, n_args);
828
829 return pc_probe.prob->evaluate_argument (sel, frame);
830 }
831
832 /* This is called to compile one of the $_probe_arg* convenience
833 variables into an agent expression. */
834
835 static void
836 compile_probe_arg (struct internalvar *ivar, struct agent_expr *expr,
837 struct axs_value *value, void *data)
838 {
839 CORE_ADDR pc = expr->scope;
840 int sel = (int) (uintptr_t) data;
841 struct bound_probe pc_probe;
842 int n_args;
843 struct frame_info *frame = get_selected_frame (NULL);
844
845 /* SEL == -1 means "_probe_argc". */
846 gdb_assert (sel >= -1);
847
848 pc_probe = find_probe_by_pc (pc);
849 if (pc_probe.prob == NULL)
850 error (_("No probe at PC %s"), core_addr_to_string (pc));
851
852 n_args = pc_probe.prob->get_argument_count (frame);
853
854 if (sel == -1)
855 {
856 value->kind = axs_rvalue;
857 value->type = builtin_type (expr->gdbarch)->builtin_int;
858 ax_const_l (expr, n_args);
859 return;
860 }
861
862 gdb_assert (sel >= 0);
863 if (sel >= n_args)
864 error (_("Invalid probe argument %d -- probe has %d arguments available"),
865 sel, n_args);
866
867 pc_probe.prob->compile_to_ax (expr, value, sel);
868 }
869
870 static const struct internalvar_funcs probe_funcs =
871 {
872 compute_probe_arg,
873 compile_probe_arg,
874 NULL
875 };
876
877
878 std::vector<const static_probe_ops *> all_static_probe_ops;
879
880 void
881 _initialize_probe (void)
882 {
883 all_static_probe_ops.push_back (&any_static_probe_ops);
884
885 create_internalvar_type_lazy ("_probe_argc", &probe_funcs,
886 (void *) (uintptr_t) -1);
887 create_internalvar_type_lazy ("_probe_arg0", &probe_funcs,
888 (void *) (uintptr_t) 0);
889 create_internalvar_type_lazy ("_probe_arg1", &probe_funcs,
890 (void *) (uintptr_t) 1);
891 create_internalvar_type_lazy ("_probe_arg2", &probe_funcs,
892 (void *) (uintptr_t) 2);
893 create_internalvar_type_lazy ("_probe_arg3", &probe_funcs,
894 (void *) (uintptr_t) 3);
895 create_internalvar_type_lazy ("_probe_arg4", &probe_funcs,
896 (void *) (uintptr_t) 4);
897 create_internalvar_type_lazy ("_probe_arg5", &probe_funcs,
898 (void *) (uintptr_t) 5);
899 create_internalvar_type_lazy ("_probe_arg6", &probe_funcs,
900 (void *) (uintptr_t) 6);
901 create_internalvar_type_lazy ("_probe_arg7", &probe_funcs,
902 (void *) (uintptr_t) 7);
903 create_internalvar_type_lazy ("_probe_arg8", &probe_funcs,
904 (void *) (uintptr_t) 8);
905 create_internalvar_type_lazy ("_probe_arg9", &probe_funcs,
906 (void *) (uintptr_t) 9);
907 create_internalvar_type_lazy ("_probe_arg10", &probe_funcs,
908 (void *) (uintptr_t) 10);
909 create_internalvar_type_lazy ("_probe_arg11", &probe_funcs,
910 (void *) (uintptr_t) 11);
911
912 add_cmd ("all", class_info, info_probes_command,
913 _("\
914 Show information about all type of probes."),
915 info_probes_cmdlist_get ());
916
917 add_cmd ("probes", class_breakpoint, enable_probes_command, _("\
918 Enable probes.\n\
919 Usage: enable probes [PROVIDER [NAME [OBJECT]]]\n\
920 Each argument is a regular expression, used to select probes.\n\
921 PROVIDER matches probe provider names.\n\
922 NAME matches the probe names.\n\
923 OBJECT matches the executable or shared library name.\n\
924 If you do not specify any argument then the command will enable\n\
925 all defined probes."),
926 &enablelist);
927
928 add_cmd ("probes", class_breakpoint, disable_probes_command, _("\
929 Disable probes.\n\
930 Usage: disable probes [PROVIDER [NAME [OBJECT]]]\n\
931 Each argument is a regular expression, used to select probes.\n\
932 PROVIDER matches probe provider names.\n\
933 NAME matches the probe names.\n\
934 OBJECT matches the executable or shared library name.\n\
935 If you do not specify any argument then the command will disable\n\
936 all defined probes."),
937 &disablelist);
938
939 }