struct symtabs_and_lines -> std::vector<symtab_and_line>
[deliverable/binutils-gdb.git] / gdb / probe.c
1 /* Generic static probe support for GDB.
2
3 Copyright (C) 2012-2017 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 typedef struct bound_probe bound_probe_s;
42 DEF_VEC_O (bound_probe_s);
43
44 \f
45
46 /* A helper for parse_probes that decodes a probe specification in
47 SEARCH_PSPACE. It appends matching SALs to RESULT. */
48
49 static void
50 parse_probes_in_pspace (const struct probe_ops *probe_ops,
51 struct program_space *search_pspace,
52 const char *objfile_namestr,
53 const char *provider,
54 const char *name,
55 std::vector<symtab_and_line> *result)
56 {
57 struct objfile *objfile;
58
59 ALL_PSPACE_OBJFILES (search_pspace, objfile)
60 {
61 VEC (probe_p) *probes;
62 struct probe *probe;
63 int ix;
64
65 if (!objfile->sf || !objfile->sf->sym_probe_fns)
66 continue;
67
68 if (objfile_namestr
69 && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0
70 && FILENAME_CMP (lbasename (objfile_name (objfile)),
71 objfile_namestr) != 0)
72 continue;
73
74 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
75
76 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
77 {
78 if (probe_ops != &probe_ops_any && probe->pops != probe_ops)
79 continue;
80
81 if (provider && strcmp (probe->provider, provider) != 0)
82 continue;
83
84 if (strcmp (probe->name, name) != 0)
85 continue;
86
87 symtab_and_line sal;
88
89 init_sal (&sal);
90
91 sal.pc = get_probe_address (probe, objfile);
92 sal.explicit_pc = 1;
93 sal.section = find_pc_overlay (sal.pc);
94 sal.pspace = search_pspace;
95 sal.probe = probe;
96 sal.objfile = objfile;
97
98 result->push_back (std::move (sal));
99 }
100 }
101 }
102
103 /* See definition in probe.h. */
104
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)
109 {
110 char *arg_end, *arg;
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;
115
116 gdb_assert (event_location_type (location) == PROBE_LOCATION);
117 arg_start = get_probe_location (location);
118
119 cs = arg_start;
120 probe_ops = probe_linespec_to_ops (&cs);
121 if (probe_ops == NULL)
122 error (_("'%s' is not a probe linespec"), arg_start);
123
124 arg = (char *) cs;
125 arg = skip_spaces (arg);
126 if (!*arg)
127 error (_("argument to `%s' missing"), arg_start);
128
129 arg_end = skip_to_space (arg);
130
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);
134
135 /* Extract each word from the argument, separated by ":"s. */
136 p = strchr (arg, ':');
137 if (p == NULL)
138 {
139 /* This is `-p name'. */
140 name = arg;
141 }
142 else
143 {
144 char *hold = p + 1;
145
146 *p = '\0';
147 p = strchr (hold, ':');
148 if (p == NULL)
149 {
150 /* This is `-p provider:name'. */
151 provider = arg;
152 name = hold;
153 }
154 else
155 {
156 /* This is `-p objfile:provider:name'. */
157 *p = '\0';
158 objfile_namestr = arg;
159 provider = hold;
160 name = p + 1;
161 }
162 }
163
164 if (*name == '\0')
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"));
170
171 std::vector<symtab_and_line> result;
172 if (search_pspace != NULL)
173 {
174 parse_probes_in_pspace (probe_ops, search_pspace, objfile_namestr,
175 provider, name, &result);
176 }
177 else
178 {
179 struct program_space *pspace;
180
181 ALL_PSPACES (pspace)
182 parse_probes_in_pspace (probe_ops, pspace, objfile_namestr,
183 provider, name, &result);
184 }
185
186 if (result.empty ())
187 {
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>"),
192 name);
193 }
194
195 if (canonical)
196 {
197 char *canon;
198
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);
204 }
205
206 do_cleanups (cleanup);
207
208 return result;
209 }
210
211 /* See definition in probe.h. */
212
213 VEC (probe_p) *
214 find_probes_in_objfile (struct objfile *objfile, const char *provider,
215 const char *name)
216 {
217 VEC (probe_p) *probes, *result = NULL;
218 int ix;
219 struct probe *probe;
220
221 if (!objfile->sf || !objfile->sf->sym_probe_fns)
222 return NULL;
223
224 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
225 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
226 {
227 if (strcmp (probe->provider, provider) != 0)
228 continue;
229
230 if (strcmp (probe->name, name) != 0)
231 continue;
232
233 VEC_safe_push (probe_p, result, probe);
234 }
235
236 return result;
237 }
238
239 /* See definition in probe.h. */
240
241 struct bound_probe
242 find_probe_by_pc (CORE_ADDR pc)
243 {
244 struct objfile *objfile;
245 struct bound_probe result;
246
247 result.objfile = NULL;
248 result.probe = NULL;
249
250 ALL_OBJFILES (objfile)
251 {
252 VEC (probe_p) *probes;
253 int ix;
254 struct probe *probe;
255
256 if (!objfile->sf || !objfile->sf->sym_probe_fns
257 || objfile->sect_index_text == -1)
258 continue;
259
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)
264 {
265 result.objfile = objfile;
266 result.probe = probe;
267 return result;
268 }
269 }
270
271 return result;
272 }
273
274 \f
275
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. */
279
280 static VEC (bound_probe_s) *
281 collect_probes (char *objname, char *provider, char *probe_name,
282 const struct probe_ops *pops)
283 {
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;
288
289 cleanup = make_cleanup (VEC_cleanup (bound_probe_s), &result);
290
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"));
295 if (objname != NULL)
296 obj_pat.emplace (objname, REG_NOSUB, _("Invalid object file regexp"));
297
298 ALL_OBJFILES (objfile)
299 {
300 VEC (probe_p) *probes;
301 struct probe *probe;
302 int ix;
303
304 if (! objfile->sf || ! objfile->sf->sym_probe_fns)
305 continue;
306
307 if (objname)
308 {
309 if (obj_pat->exec (objfile_name (objfile), 0, NULL, 0) != 0)
310 continue;
311 }
312
313 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
314
315 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
316 {
317 struct bound_probe bound;
318
319 if (pops != NULL && probe->pops != pops)
320 continue;
321
322 if (provider
323 && prov_pat->exec (probe->provider, 0, NULL, 0) != 0)
324 continue;
325
326 if (probe_name
327 && probe_pat->exec (probe->name, 0, NULL, 0) != 0)
328 continue;
329
330 bound.objfile = objfile;
331 bound.probe = probe;
332 VEC_safe_push (bound_probe_s, result, &bound);
333 }
334 }
335
336 discard_cleanups (cleanup);
337 return result;
338 }
339
340 /* A qsort comparison function for bound_probe_s objects. */
341
342 static int
343 compare_probes (const void *a, const void *b)
344 {
345 const struct bound_probe *pa = (const struct bound_probe *) a;
346 const struct bound_probe *pb = (const struct bound_probe *) b;
347 int v;
348
349 v = strcmp (pa->probe->provider, pb->probe->provider);
350 if (v)
351 return v;
352
353 v = strcmp (pa->probe->name, pb->probe->name);
354 if (v)
355 return v;
356
357 if (pa->probe->address < pb->probe->address)
358 return -1;
359 if (pa->probe->address > pb->probe->address)
360 return 1;
361
362 return strcmp (objfile_name (pa->objfile), objfile_name (pb->objfile));
363 }
364
365 /* Helper function that generate entries in the ui_out table being
366 crafted by `info_probes_for_ops'. */
367
368 static void
369 gen_ui_out_table_header_info (VEC (bound_probe_s) *probes,
370 const struct probe_ops *p)
371 {
372 /* `headings' refers to the names of the columns when printing `info
373 probes'. */
374 VEC (info_probe_column_s) *headings = NULL;
375 struct cleanup *c;
376 info_probe_column_s *column;
377 size_t headings_size;
378 int ix;
379
380 gdb_assert (p != NULL);
381
382 if (p->gen_info_probes_table_header == NULL
383 && p->gen_info_probes_table_values == NULL)
384 return;
385
386 gdb_assert (p->gen_info_probes_table_header != NULL
387 && p->gen_info_probes_table_values != NULL);
388
389 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
390 p->gen_info_probes_table_header (&headings);
391
392 headings_size = VEC_length (info_probe_column_s, headings);
393
394 for (ix = 0;
395 VEC_iterate (info_probe_column_s, headings, ix, column);
396 ++ix)
397 {
398 struct bound_probe *probe;
399 int jx;
400 size_t size_max = strlen (column->print_name);
401
402 for (jx = 0; VEC_iterate (bound_probe_s, probes, jx, probe); ++jx)
403 {
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;
407 struct cleanup *c2;
408 const char *val;
409 int kx;
410
411 if (probe->probe->pops != p)
412 continue;
413
414 c2 = make_cleanup (VEC_cleanup (const_char_ptr), &probe_fields);
415 p->gen_info_probes_table_values (probe->probe, &probe_fields);
416
417 gdb_assert (VEC_length (const_char_ptr, probe_fields)
418 == headings_size);
419
420 for (kx = 0; VEC_iterate (const_char_ptr, probe_fields, kx, val);
421 ++kx)
422 {
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. */
426 if (val == NULL)
427 continue;
428
429 size_max = std::max (strlen (val), size_max);
430 }
431 do_cleanups (c2);
432 }
433
434 current_uiout->table_header (size_max, ui_left,
435 column->field_name, column->print_name);
436 }
437
438 do_cleanups (c);
439 }
440
441 /* Helper function to print not-applicable strings for all the extra
442 columns defined in a probe_ops. */
443
444 static void
445 print_ui_out_not_applicables (const struct probe_ops *pops)
446 {
447 struct cleanup *c;
448 VEC (info_probe_column_s) *headings = NULL;
449 info_probe_column_s *column;
450 int ix;
451
452 if (pops->gen_info_probes_table_header == NULL)
453 return;
454
455 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
456 pops->gen_info_probes_table_header (&headings);
457
458 for (ix = 0;
459 VEC_iterate (info_probe_column_s, headings, ix, column);
460 ++ix)
461 current_uiout->field_string (column->field_name, _("n/a"));
462
463 do_cleanups (c);
464 }
465
466 /* Helper function to print extra information about a probe and an objfile
467 represented by PROBE. */
468
469 static void
470 print_ui_out_info (struct probe *probe)
471 {
472 int ix;
473 int j = 0;
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;
479 struct cleanup *c;
480
481 gdb_assert (probe != NULL);
482 gdb_assert (probe->pops != NULL);
483
484 if (probe->pops->gen_info_probes_table_header == NULL
485 && probe->pops->gen_info_probes_table_values == NULL)
486 return;
487
488 gdb_assert (probe->pops->gen_info_probes_table_header != NULL
489 && probe->pops->gen_info_probes_table_values != NULL);
490
491 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
492 make_cleanup (VEC_cleanup (const_char_ptr), &values);
493
494 probe->pops->gen_info_probes_table_header (&headings);
495 probe->pops->gen_info_probes_table_values (probe, &values);
496
497 gdb_assert (VEC_length (info_probe_column_s, headings)
498 == VEC_length (const_char_ptr, values));
499
500 for (ix = 0;
501 VEC_iterate (info_probe_column_s, headings, ix, column);
502 ++ix)
503 {
504 const char *val = VEC_index (const_char_ptr, values, j++);
505
506 if (val == NULL)
507 current_uiout->field_skip (column->field_name);
508 else
509 current_uiout->field_string (column->field_name, val);
510 }
511
512 do_cleanups (c);
513 }
514
515 /* Helper function that returns the number of extra fields which POPS will
516 need. */
517
518 static int
519 get_number_extra_fields (const struct probe_ops *pops)
520 {
521 VEC (info_probe_column_s) *headings = NULL;
522 struct cleanup *c;
523 int n;
524
525 if (pops->gen_info_probes_table_header == NULL)
526 return 0;
527
528 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
529 pops->gen_info_probes_table_header (&headings);
530
531 n = VEC_length (info_probe_column_s, headings);
532
533 do_cleanups (c);
534
535 return n;
536 }
537
538 /* Helper function that returns 1 if there is a probe in PROBES
539 featuring the given POPS. It returns 0 otherwise. */
540
541 static int
542 exists_probe_with_pops (VEC (bound_probe_s) *probes,
543 const struct probe_ops *pops)
544 {
545 struct bound_probe *probe;
546 int ix;
547
548 for (ix = 0; VEC_iterate (bound_probe_s, probes, ix, probe); ++ix)
549 if (probe->probe->pops == pops)
550 return 1;
551
552 return 0;
553 }
554
555 /* Helper function that parses a probe linespec of the form [PROVIDER
556 [PROBE [OBJNAME]]] from the provided string STR. */
557
558 static void
559 parse_probe_linespec (const char *str, char **provider,
560 char **probe_name, char **objname)
561 {
562 *probe_name = *objname = NULL;
563
564 *provider = extract_arg_const (&str);
565 if (*provider != NULL)
566 {
567 *probe_name = extract_arg_const (&str);
568 if (*probe_name != NULL)
569 *objname = extract_arg_const (&str);
570 }
571 }
572
573 /* See comment in probe.h. */
574
575 void
576 info_probes_for_ops (const char *arg, int from_tty,
577 const struct probe_ops *pops)
578 {
579 char *provider, *probe_name = NULL, *objname = NULL;
580 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
581 VEC (bound_probe_s) *probes;
582 int i, any_found;
583 int ui_out_extra_fields = 0;
584 size_t size_addr;
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 ();
591
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);
596
597 probes = collect_probes (objname, provider, probe_name, pops);
598 make_cleanup (VEC_cleanup (probe_p), &probes);
599
600 if (pops == NULL)
601 {
602 const struct probe_ops *po;
603 int ix;
604
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.
609
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. */
614
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);
618 }
619 else
620 ui_out_extra_fields = get_number_extra_fields (pops);
621
622 make_cleanup_ui_out_table_begin_end (current_uiout,
623 5 + ui_out_extra_fields,
624 VEC_length (bound_probe_s, probes),
625 "StaticProbes");
626
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);
631
632 /* What's the size of an address in our architecture? */
633 size_addr = gdbarch_addr_bit (gdbarch) == 64 ? 18 : 10;
634
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)
638 {
639 const char *probe_type = probe->probe->pops->type_name (probe->probe);
640
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)),
645 size_objname);
646 }
647
648 current_uiout->table_header (size_type, ui_left, "type", _("Type"));
649 current_uiout->table_header (size_provider, ui_left, "provider",
650 _("Provider"));
651 current_uiout->table_header (size_name, ui_left, "name", _("Name"));
652 current_uiout->table_header (size_addr, ui_left, "addr", _("Where"));
653
654 if (pops == NULL)
655 {
656 const struct probe_ops *po;
657 int ix;
658
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);
665 }
666 else
667 gen_ui_out_table_header_info (probes, pops);
668
669 current_uiout->table_header (size_objname, ui_left, "object", _("Object"));
670 current_uiout->table_body ();
671
672 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
673 {
674 const char *probe_type = probe->probe->pops->type_name (probe->probe);
675
676 ui_out_emit_tuple tuple_emitter (current_uiout, "probe");
677
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));
684
685 if (pops == NULL)
686 {
687 const struct probe_ops *po;
688 int ix;
689
690 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po);
691 ++ix)
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);
696 }
697 else
698 print_ui_out_info (probe->probe);
699
700 current_uiout->field_string ("object",
701 objfile_name (probe->objfile));
702 current_uiout->text ("\n");
703 }
704
705 any_found = !VEC_empty (bound_probe_s, probes);
706 do_cleanups (cleanup);
707
708 if (!any_found)
709 current_uiout->message (_("No probes matched.\n"));
710 }
711
712 /* Implementation of the `info probes' command. */
713
714 static void
715 info_probes_command (char *arg, int from_tty)
716 {
717 info_probes_for_ops (arg, from_tty, NULL);
718 }
719
720 /* Implementation of the `enable probes' command. */
721
722 static void
723 enable_probes_command (char *arg, int from_tty)
724 {
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;
729 int i;
730
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);
735
736 probes = collect_probes (objname, provider, probe_name, NULL);
737 if (VEC_empty (bound_probe_s, probes))
738 {
739 current_uiout->message (_("No probes matched.\n"));
740 do_cleanups (cleanup);
741 return;
742 }
743
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)
747 {
748 const struct probe_ops *pops = probe->probe->pops;
749
750 if (pops->enable_probe != NULL)
751 {
752 pops->enable_probe (probe->probe);
753 current_uiout->message (_("Probe %s:%s enabled.\n"),
754 probe->probe->provider, probe->probe->name);
755 }
756 else
757 current_uiout->message (_("Probe %s:%s cannot be enabled.\n"),
758 probe->probe->provider, probe->probe->name);
759 }
760
761 do_cleanups (cleanup);
762 }
763
764 /* Implementation of the `disable probes' command. */
765
766 static void
767 disable_probes_command (char *arg, int from_tty)
768 {
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;
773 int i;
774
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);
779
780 probes = collect_probes (objname, provider, probe_name, NULL /* pops */);
781 if (VEC_empty (bound_probe_s, probes))
782 {
783 current_uiout->message (_("No probes matched.\n"));
784 do_cleanups (cleanup);
785 return;
786 }
787
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)
791 {
792 const struct probe_ops *pops = probe->probe->pops;
793
794 if (pops->disable_probe != NULL)
795 {
796 pops->disable_probe (probe->probe);
797 current_uiout->message (_("Probe %s:%s disabled.\n"),
798 probe->probe->provider, probe->probe->name);
799 }
800 else
801 current_uiout->message (_("Probe %s:%s cannot be disabled.\n"),
802 probe->probe->provider, probe->probe->name);
803 }
804
805 do_cleanups (cleanup);
806 }
807
808 /* See comments in probe.h. */
809
810 CORE_ADDR
811 get_probe_address (struct probe *probe, struct objfile *objfile)
812 {
813 return probe->pops->get_probe_address (probe, objfile);
814 }
815
816 /* See comments in probe.h. */
817
818 unsigned
819 get_probe_argument_count (struct probe *probe, struct frame_info *frame)
820 {
821 return probe->pops->get_probe_argument_count (probe, frame);
822 }
823
824 /* See comments in probe.h. */
825
826 int
827 can_evaluate_probe_arguments (struct probe *probe)
828 {
829 return probe->pops->can_evaluate_probe_arguments (probe);
830 }
831
832 /* See comments in probe.h. */
833
834 struct value *
835 evaluate_probe_argument (struct probe *probe, unsigned n,
836 struct frame_info *frame)
837 {
838 return probe->pops->evaluate_probe_argument (probe, n, frame);
839 }
840
841 /* See comments in probe.h. */
842
843 struct value *
844 probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n)
845 {
846 struct bound_probe probe;
847 unsigned n_args;
848
849 probe = find_probe_by_pc (get_frame_pc (frame));
850 if (!probe.probe)
851 return NULL;
852
853 n_args = get_probe_argument_count (probe.probe, frame);
854 if (n >= n_args)
855 return NULL;
856
857 return evaluate_probe_argument (probe.probe, n, frame);
858 }
859
860 /* See comment in probe.h. */
861
862 const struct probe_ops *
863 probe_linespec_to_ops (const char **linespecp)
864 {
865 int ix;
866 const struct probe_ops *probe_ops;
867
868 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, probe_ops); ix++)
869 if (probe_ops->is_linespec (linespecp))
870 return probe_ops;
871
872 return NULL;
873 }
874
875 /* See comment in probe.h. */
876
877 int
878 probe_is_linespec_by_keyword (const char **linespecp, const char *const *keywords)
879 {
880 const char *s = *linespecp;
881 const char *const *csp;
882
883 for (csp = keywords; *csp; csp++)
884 {
885 const char *keyword = *csp;
886 size_t len = strlen (keyword);
887
888 if (strncmp (s, keyword, len) == 0 && isspace (s[len]))
889 {
890 *linespecp += len + 1;
891 return 1;
892 }
893 }
894
895 return 0;
896 }
897
898 /* Implementation of `is_linespec' method for `struct probe_ops'. */
899
900 static int
901 probe_any_is_linespec (const char **linespecp)
902 {
903 static const char *const keywords[] = { "-p", "-probe", NULL };
904
905 return probe_is_linespec_by_keyword (linespecp, keywords);
906 }
907
908 /* Dummy method used for `probe_ops_any'. */
909
910 static void
911 probe_any_get_probes (VEC (probe_p) **probesp, struct objfile *objfile)
912 {
913 /* No probes can be provided by this dummy backend. */
914 }
915
916 /* Operations associated with a generic probe. */
917
918 const struct probe_ops probe_ops_any =
919 {
920 probe_any_is_linespec,
921 probe_any_get_probes,
922 };
923
924 /* See comments in probe.h. */
925
926 struct cmd_list_element **
927 info_probes_cmdlist_get (void)
928 {
929 static struct cmd_list_element *info_probes_cmdlist;
930
931 if (info_probes_cmdlist == NULL)
932 add_prefix_cmd ("probes", class_info, info_probes_command,
933 _("\
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\
937 - stap\n\
938 If you specify TYPE, there may be additional arguments needed by the\n\
939 subcommand.\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);
944
945 return &info_probes_cmdlist;
946 }
947
948 \f
949
950 /* This is called to compute the value of one of the $_probe_arg*
951 convenience variables. */
952
953 static struct value *
954 compute_probe_arg (struct gdbarch *arch, struct internalvar *ivar,
955 void *data)
956 {
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;
962 unsigned n_args;
963
964 /* SEL == -1 means "_probe_argc". */
965 gdb_assert (sel >= -1);
966
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));
970
971 n_args = get_probe_argument_count (pc_probe.probe, frame);
972 if (sel == -1)
973 return value_from_longest (builtin_type (arch)->builtin_int, n_args);
974
975 if (sel >= n_args)
976 error (_("Invalid probe argument %d -- probe has %u arguments available"),
977 sel, n_args);
978
979 return evaluate_probe_argument (pc_probe.probe, sel, frame);
980 }
981
982 /* This is called to compile one of the $_probe_arg* convenience
983 variables into an agent expression. */
984
985 static void
986 compile_probe_arg (struct internalvar *ivar, struct agent_expr *expr,
987 struct axs_value *value, void *data)
988 {
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;
993 int n_args;
994 struct frame_info *frame = get_selected_frame (NULL);
995
996 /* SEL == -1 means "_probe_argc". */
997 gdb_assert (sel >= -1);
998
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));
1002
1003 n_args = get_probe_argument_count (pc_probe.probe, frame);
1004
1005 if (sel == -1)
1006 {
1007 value->kind = axs_rvalue;
1008 value->type = builtin_type (expr->gdbarch)->builtin_int;
1009 ax_const_l (expr, n_args);
1010 return;
1011 }
1012
1013 gdb_assert (sel >= 0);
1014 if (sel >= n_args)
1015 error (_("Invalid probe argument %d -- probe has %d arguments available"),
1016 sel, n_args);
1017
1018 pc_probe.probe->pops->compile_to_ax (pc_probe.probe, expr, value, sel);
1019 }
1020
1021 static const struct internalvar_funcs probe_funcs =
1022 {
1023 compute_probe_arg,
1024 compile_probe_arg,
1025 NULL
1026 };
1027
1028
1029 VEC (probe_ops_cp) *all_probe_ops;
1030
1031 void _initialize_probe (void);
1032
1033 void
1034 _initialize_probe (void)
1035 {
1036 VEC_safe_push (probe_ops_cp, all_probe_ops, &probe_ops_any);
1037
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);
1064
1065 add_cmd ("all", class_info, info_probes_command,
1066 _("\
1067 Show information about all type of probes."),
1068 info_probes_cmdlist_get ());
1069
1070 add_cmd ("probes", class_breakpoint, enable_probes_command, _("\
1071 Enable probes.\n\
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."),
1079 &enablelist);
1080
1081 add_cmd ("probes", class_breakpoint, disable_probes_command, _("\
1082 Disable probes.\n\
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."),
1090 &disablelist);
1091
1092 }
This page took 0.232231 seconds and 5 git commands to generate.