Introduce compiled_regex, eliminate make_regfree_cleanup
[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 struct symtabs_and_lines *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 struct symtab_and_line *sal;
79
80 if (probe_ops != &probe_ops_any && probe->pops != probe_ops)
81 continue;
82
83 if (provider && strcmp (probe->provider, provider) != 0)
84 continue;
85
86 if (strcmp (probe->name, name) != 0)
87 continue;
88
89 ++result->nelts;
90 result->sals = XRESIZEVEC (struct symtab_and_line, result->sals,
91 result->nelts);
92 sal = &result->sals[result->nelts - 1];
93
94 init_sal (sal);
95
96 sal->pc = get_probe_address (probe, objfile);
97 sal->explicit_pc = 1;
98 sal->section = find_pc_overlay (sal->pc);
99 sal->pspace = search_pspace;
100 sal->probe = probe;
101 sal->objfile = objfile;
102 }
103 }
104 }
105
106 /* See definition in probe.h. */
107
108 struct symtabs_and_lines
109 parse_probes (const struct event_location *location,
110 struct program_space *search_pspace,
111 struct linespec_result *canonical)
112 {
113 char *arg_end, *arg;
114 char *objfile_namestr = NULL, *provider = NULL, *name, *p;
115 struct cleanup *cleanup;
116 struct symtabs_and_lines result;
117 const struct probe_ops *probe_ops;
118 const char *arg_start, *cs;
119
120 result.sals = NULL;
121 result.nelts = 0;
122
123 gdb_assert (event_location_type (location) == PROBE_LOCATION);
124 arg_start = get_probe_location (location);
125
126 cs = arg_start;
127 probe_ops = probe_linespec_to_ops (&cs);
128 if (probe_ops == NULL)
129 error (_("'%s' is not a probe linespec"), arg_start);
130
131 arg = (char *) cs;
132 arg = skip_spaces (arg);
133 if (!*arg)
134 error (_("argument to `%s' missing"), arg_start);
135
136 arg_end = skip_to_space (arg);
137
138 /* We make a copy here so we can write over parts with impunity. */
139 arg = savestring (arg, arg_end - arg);
140 cleanup = make_cleanup (xfree, arg);
141
142 /* Extract each word from the argument, separated by ":"s. */
143 p = strchr (arg, ':');
144 if (p == NULL)
145 {
146 /* This is `-p name'. */
147 name = arg;
148 }
149 else
150 {
151 char *hold = p + 1;
152
153 *p = '\0';
154 p = strchr (hold, ':');
155 if (p == NULL)
156 {
157 /* This is `-p provider:name'. */
158 provider = arg;
159 name = hold;
160 }
161 else
162 {
163 /* This is `-p objfile:provider:name'. */
164 *p = '\0';
165 objfile_namestr = arg;
166 provider = hold;
167 name = p + 1;
168 }
169 }
170
171 if (*name == '\0')
172 error (_("no probe name specified"));
173 if (provider && *provider == '\0')
174 error (_("invalid provider name"));
175 if (objfile_namestr && *objfile_namestr == '\0')
176 error (_("invalid objfile name"));
177
178 if (search_pspace != NULL)
179 {
180 parse_probes_in_pspace (probe_ops, search_pspace, objfile_namestr,
181 provider, name, &result);
182 }
183 else
184 {
185 struct program_space *pspace;
186
187 ALL_PSPACES (pspace)
188 parse_probes_in_pspace (probe_ops, pspace, objfile_namestr,
189 provider, name, &result);
190 }
191
192 if (result.nelts == 0)
193 {
194 throw_error (NOT_FOUND_ERROR,
195 _("No probe matching objfile=`%s', provider=`%s', name=`%s'"),
196 objfile_namestr ? objfile_namestr : _("<any>"),
197 provider ? provider : _("<any>"),
198 name);
199 }
200
201 if (canonical)
202 {
203 char *canon;
204
205 canon = savestring (arg_start, arg_end - arg_start);
206 make_cleanup (xfree, canon);
207 canonical->special_display = 1;
208 canonical->pre_expanded = 1;
209 canonical->location = new_probe_location (canon);
210 }
211
212 do_cleanups (cleanup);
213
214 return result;
215 }
216
217 /* See definition in probe.h. */
218
219 VEC (probe_p) *
220 find_probes_in_objfile (struct objfile *objfile, const char *provider,
221 const char *name)
222 {
223 VEC (probe_p) *probes, *result = NULL;
224 int ix;
225 struct probe *probe;
226
227 if (!objfile->sf || !objfile->sf->sym_probe_fns)
228 return NULL;
229
230 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
231 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
232 {
233 if (strcmp (probe->provider, provider) != 0)
234 continue;
235
236 if (strcmp (probe->name, name) != 0)
237 continue;
238
239 VEC_safe_push (probe_p, result, probe);
240 }
241
242 return result;
243 }
244
245 /* See definition in probe.h. */
246
247 struct bound_probe
248 find_probe_by_pc (CORE_ADDR pc)
249 {
250 struct objfile *objfile;
251 struct bound_probe result;
252
253 result.objfile = NULL;
254 result.probe = NULL;
255
256 ALL_OBJFILES (objfile)
257 {
258 VEC (probe_p) *probes;
259 int ix;
260 struct probe *probe;
261
262 if (!objfile->sf || !objfile->sf->sym_probe_fns
263 || objfile->sect_index_text == -1)
264 continue;
265
266 /* If this proves too inefficient, we can replace with a hash. */
267 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
268 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
269 if (get_probe_address (probe, objfile) == pc)
270 {
271 result.objfile = objfile;
272 result.probe = probe;
273 return result;
274 }
275 }
276
277 return result;
278 }
279
280 \f
281
282 /* Make a vector of probes matching OBJNAME, PROVIDER, and PROBE_NAME.
283 If POPS is not NULL, only probes of this certain probe_ops will match.
284 Each argument is a regexp, or NULL, which matches anything. */
285
286 static VEC (bound_probe_s) *
287 collect_probes (char *objname, char *provider, char *probe_name,
288 const struct probe_ops *pops)
289 {
290 struct objfile *objfile;
291 VEC (bound_probe_s) *result = NULL;
292 struct cleanup *cleanup;
293 gdb::optional<compiled_regex> obj_pat, prov_pat, probe_pat;
294
295 cleanup = make_cleanup (VEC_cleanup (bound_probe_s), &result);
296
297 if (provider != NULL)
298 prov_pat.emplace (provider, REG_NOSUB, _("Invalid provider regexp"));
299 if (probe_name != NULL)
300 probe_pat.emplace (probe_name, REG_NOSUB, _("Invalid probe regexp"));
301 if (objname != NULL)
302 obj_pat.emplace (objname, REG_NOSUB, _("Invalid object file regexp"));
303
304 ALL_OBJFILES (objfile)
305 {
306 VEC (probe_p) *probes;
307 struct probe *probe;
308 int ix;
309
310 if (! objfile->sf || ! objfile->sf->sym_probe_fns)
311 continue;
312
313 if (objname)
314 {
315 if (obj_pat->exec (objfile_name (objfile), 0, NULL, 0) != 0)
316 continue;
317 }
318
319 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
320
321 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
322 {
323 struct bound_probe bound;
324
325 if (pops != NULL && probe->pops != pops)
326 continue;
327
328 if (provider
329 && prov_pat->exec (probe->provider, 0, NULL, 0) != 0)
330 continue;
331
332 if (probe_name
333 && probe_pat->exec (probe->name, 0, NULL, 0) != 0)
334 continue;
335
336 bound.objfile = objfile;
337 bound.probe = probe;
338 VEC_safe_push (bound_probe_s, result, &bound);
339 }
340 }
341
342 discard_cleanups (cleanup);
343 return result;
344 }
345
346 /* A qsort comparison function for bound_probe_s objects. */
347
348 static int
349 compare_probes (const void *a, const void *b)
350 {
351 const struct bound_probe *pa = (const struct bound_probe *) a;
352 const struct bound_probe *pb = (const struct bound_probe *) b;
353 int v;
354
355 v = strcmp (pa->probe->provider, pb->probe->provider);
356 if (v)
357 return v;
358
359 v = strcmp (pa->probe->name, pb->probe->name);
360 if (v)
361 return v;
362
363 if (pa->probe->address < pb->probe->address)
364 return -1;
365 if (pa->probe->address > pb->probe->address)
366 return 1;
367
368 return strcmp (objfile_name (pa->objfile), objfile_name (pb->objfile));
369 }
370
371 /* Helper function that generate entries in the ui_out table being
372 crafted by `info_probes_for_ops'. */
373
374 static void
375 gen_ui_out_table_header_info (VEC (bound_probe_s) *probes,
376 const struct probe_ops *p)
377 {
378 /* `headings' refers to the names of the columns when printing `info
379 probes'. */
380 VEC (info_probe_column_s) *headings = NULL;
381 struct cleanup *c;
382 info_probe_column_s *column;
383 size_t headings_size;
384 int ix;
385
386 gdb_assert (p != NULL);
387
388 if (p->gen_info_probes_table_header == NULL
389 && p->gen_info_probes_table_values == NULL)
390 return;
391
392 gdb_assert (p->gen_info_probes_table_header != NULL
393 && p->gen_info_probes_table_values != NULL);
394
395 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
396 p->gen_info_probes_table_header (&headings);
397
398 headings_size = VEC_length (info_probe_column_s, headings);
399
400 for (ix = 0;
401 VEC_iterate (info_probe_column_s, headings, ix, column);
402 ++ix)
403 {
404 struct bound_probe *probe;
405 int jx;
406 size_t size_max = strlen (column->print_name);
407
408 for (jx = 0; VEC_iterate (bound_probe_s, probes, jx, probe); ++jx)
409 {
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;
413 struct cleanup *c2;
414 const char *val;
415 int kx;
416
417 if (probe->probe->pops != p)
418 continue;
419
420 c2 = make_cleanup (VEC_cleanup (const_char_ptr), &probe_fields);
421 p->gen_info_probes_table_values (probe->probe, &probe_fields);
422
423 gdb_assert (VEC_length (const_char_ptr, probe_fields)
424 == headings_size);
425
426 for (kx = 0; VEC_iterate (const_char_ptr, probe_fields, kx, val);
427 ++kx)
428 {
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. */
432 if (val == NULL)
433 continue;
434
435 size_max = std::max (strlen (val), size_max);
436 }
437 do_cleanups (c2);
438 }
439
440 current_uiout->table_header (size_max, ui_left,
441 column->field_name, column->print_name);
442 }
443
444 do_cleanups (c);
445 }
446
447 /* Helper function to print not-applicable strings for all the extra
448 columns defined in a probe_ops. */
449
450 static void
451 print_ui_out_not_applicables (const struct probe_ops *pops)
452 {
453 struct cleanup *c;
454 VEC (info_probe_column_s) *headings = NULL;
455 info_probe_column_s *column;
456 int ix;
457
458 if (pops->gen_info_probes_table_header == NULL)
459 return;
460
461 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
462 pops->gen_info_probes_table_header (&headings);
463
464 for (ix = 0;
465 VEC_iterate (info_probe_column_s, headings, ix, column);
466 ++ix)
467 current_uiout->field_string (column->field_name, _("n/a"));
468
469 do_cleanups (c);
470 }
471
472 /* Helper function to print extra information about a probe and an objfile
473 represented by PROBE. */
474
475 static void
476 print_ui_out_info (struct probe *probe)
477 {
478 int ix;
479 int j = 0;
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;
485 struct cleanup *c;
486
487 gdb_assert (probe != NULL);
488 gdb_assert (probe->pops != NULL);
489
490 if (probe->pops->gen_info_probes_table_header == NULL
491 && probe->pops->gen_info_probes_table_values == NULL)
492 return;
493
494 gdb_assert (probe->pops->gen_info_probes_table_header != NULL
495 && probe->pops->gen_info_probes_table_values != NULL);
496
497 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
498 make_cleanup (VEC_cleanup (const_char_ptr), &values);
499
500 probe->pops->gen_info_probes_table_header (&headings);
501 probe->pops->gen_info_probes_table_values (probe, &values);
502
503 gdb_assert (VEC_length (info_probe_column_s, headings)
504 == VEC_length (const_char_ptr, values));
505
506 for (ix = 0;
507 VEC_iterate (info_probe_column_s, headings, ix, column);
508 ++ix)
509 {
510 const char *val = VEC_index (const_char_ptr, values, j++);
511
512 if (val == NULL)
513 current_uiout->field_skip (column->field_name);
514 else
515 current_uiout->field_string (column->field_name, val);
516 }
517
518 do_cleanups (c);
519 }
520
521 /* Helper function that returns the number of extra fields which POPS will
522 need. */
523
524 static int
525 get_number_extra_fields (const struct probe_ops *pops)
526 {
527 VEC (info_probe_column_s) *headings = NULL;
528 struct cleanup *c;
529 int n;
530
531 if (pops->gen_info_probes_table_header == NULL)
532 return 0;
533
534 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
535 pops->gen_info_probes_table_header (&headings);
536
537 n = VEC_length (info_probe_column_s, headings);
538
539 do_cleanups (c);
540
541 return n;
542 }
543
544 /* Helper function that returns 1 if there is a probe in PROBES
545 featuring the given POPS. It returns 0 otherwise. */
546
547 static int
548 exists_probe_with_pops (VEC (bound_probe_s) *probes,
549 const struct probe_ops *pops)
550 {
551 struct bound_probe *probe;
552 int ix;
553
554 for (ix = 0; VEC_iterate (bound_probe_s, probes, ix, probe); ++ix)
555 if (probe->probe->pops == pops)
556 return 1;
557
558 return 0;
559 }
560
561 /* Helper function that parses a probe linespec of the form [PROVIDER
562 [PROBE [OBJNAME]]] from the provided string STR. */
563
564 static void
565 parse_probe_linespec (const char *str, char **provider,
566 char **probe_name, char **objname)
567 {
568 *probe_name = *objname = NULL;
569
570 *provider = extract_arg_const (&str);
571 if (*provider != NULL)
572 {
573 *probe_name = extract_arg_const (&str);
574 if (*probe_name != NULL)
575 *objname = extract_arg_const (&str);
576 }
577 }
578
579 /* See comment in probe.h. */
580
581 void
582 info_probes_for_ops (const char *arg, int from_tty,
583 const struct probe_ops *pops)
584 {
585 char *provider, *probe_name = NULL, *objname = NULL;
586 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
587 VEC (bound_probe_s) *probes;
588 int i, any_found;
589 int ui_out_extra_fields = 0;
590 size_t size_addr;
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 ();
597
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);
602
603 probes = collect_probes (objname, provider, probe_name, pops);
604 make_cleanup (VEC_cleanup (probe_p), &probes);
605
606 if (pops == NULL)
607 {
608 const struct probe_ops *po;
609 int ix;
610
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.
615
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. */
620
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);
624 }
625 else
626 ui_out_extra_fields = get_number_extra_fields (pops);
627
628 make_cleanup_ui_out_table_begin_end (current_uiout,
629 5 + ui_out_extra_fields,
630 VEC_length (bound_probe_s, probes),
631 "StaticProbes");
632
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);
637
638 /* What's the size of an address in our architecture? */
639 size_addr = gdbarch_addr_bit (gdbarch) == 64 ? 18 : 10;
640
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)
644 {
645 const char *probe_type = probe->probe->pops->type_name (probe->probe);
646
647 size_type = std::max (strlen (probe_type), size_type);
648 size_name = std::max (strlen (probe->probe->name), size_name);
649 size_provider = std::max (strlen (probe->probe->provider), size_provider);
650 size_objname = std::max (strlen (objfile_name (probe->objfile)),
651 size_objname);
652 }
653
654 current_uiout->table_header (size_type, ui_left, "type", _("Type"));
655 current_uiout->table_header (size_provider, ui_left, "provider",
656 _("Provider"));
657 current_uiout->table_header (size_name, ui_left, "name", _("Name"));
658 current_uiout->table_header (size_addr, ui_left, "addr", _("Where"));
659
660 if (pops == NULL)
661 {
662 const struct probe_ops *po;
663 int ix;
664
665 /* We have to generate the table header for each new probe type
666 that we will print. Note that this excludes probe types not
667 having any defined probe with the search criteria. */
668 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
669 if (exists_probe_with_pops (probes, po))
670 gen_ui_out_table_header_info (probes, po);
671 }
672 else
673 gen_ui_out_table_header_info (probes, pops);
674
675 current_uiout->table_header (size_objname, ui_left, "object", _("Object"));
676 current_uiout->table_body ();
677
678 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
679 {
680 const char *probe_type = probe->probe->pops->type_name (probe->probe);
681
682 ui_out_emit_tuple tuple_emitter (current_uiout, "probe");
683
684 current_uiout->field_string ("type",probe_type);
685 current_uiout->field_string ("provider", probe->probe->provider);
686 current_uiout->field_string ("name", probe->probe->name);
687 current_uiout->field_core_addr (
688 "addr", probe->probe->arch,
689 get_probe_address (probe->probe, probe->objfile));
690
691 if (pops == NULL)
692 {
693 const struct probe_ops *po;
694 int ix;
695
696 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po);
697 ++ix)
698 if (probe->probe->pops == po)
699 print_ui_out_info (probe->probe);
700 else if (exists_probe_with_pops (probes, po))
701 print_ui_out_not_applicables (po);
702 }
703 else
704 print_ui_out_info (probe->probe);
705
706 current_uiout->field_string ("object",
707 objfile_name (probe->objfile));
708 current_uiout->text ("\n");
709 }
710
711 any_found = !VEC_empty (bound_probe_s, probes);
712 do_cleanups (cleanup);
713
714 if (!any_found)
715 current_uiout->message (_("No probes matched.\n"));
716 }
717
718 /* Implementation of the `info probes' command. */
719
720 static void
721 info_probes_command (char *arg, int from_tty)
722 {
723 info_probes_for_ops (arg, from_tty, NULL);
724 }
725
726 /* Implementation of the `enable probes' command. */
727
728 static void
729 enable_probes_command (char *arg, int from_tty)
730 {
731 char *provider, *probe_name = NULL, *objname = NULL;
732 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
733 VEC (bound_probe_s) *probes;
734 struct bound_probe *probe;
735 int i;
736
737 parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
738 make_cleanup (xfree, provider);
739 make_cleanup (xfree, probe_name);
740 make_cleanup (xfree, objname);
741
742 probes = collect_probes (objname, provider, probe_name, NULL);
743 if (VEC_empty (bound_probe_s, probes))
744 {
745 current_uiout->message (_("No probes matched.\n"));
746 do_cleanups (cleanup);
747 return;
748 }
749
750 /* Enable the selected probes, provided their backends support the
751 notion of enabling a probe. */
752 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
753 {
754 const struct probe_ops *pops = probe->probe->pops;
755
756 if (pops->enable_probe != NULL)
757 {
758 pops->enable_probe (probe->probe);
759 current_uiout->message (_("Probe %s:%s enabled.\n"),
760 probe->probe->provider, probe->probe->name);
761 }
762 else
763 current_uiout->message (_("Probe %s:%s cannot be enabled.\n"),
764 probe->probe->provider, probe->probe->name);
765 }
766
767 do_cleanups (cleanup);
768 }
769
770 /* Implementation of the `disable probes' command. */
771
772 static void
773 disable_probes_command (char *arg, int from_tty)
774 {
775 char *provider, *probe_name = NULL, *objname = NULL;
776 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
777 VEC (bound_probe_s) *probes;
778 struct bound_probe *probe;
779 int i;
780
781 parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
782 make_cleanup (xfree, provider);
783 make_cleanup (xfree, probe_name);
784 make_cleanup (xfree, objname);
785
786 probes = collect_probes (objname, provider, probe_name, NULL /* pops */);
787 if (VEC_empty (bound_probe_s, probes))
788 {
789 current_uiout->message (_("No probes matched.\n"));
790 do_cleanups (cleanup);
791 return;
792 }
793
794 /* Disable the selected probes, provided their backends support the
795 notion of enabling a probe. */
796 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
797 {
798 const struct probe_ops *pops = probe->probe->pops;
799
800 if (pops->disable_probe != NULL)
801 {
802 pops->disable_probe (probe->probe);
803 current_uiout->message (_("Probe %s:%s disabled.\n"),
804 probe->probe->provider, probe->probe->name);
805 }
806 else
807 current_uiout->message (_("Probe %s:%s cannot be disabled.\n"),
808 probe->probe->provider, probe->probe->name);
809 }
810
811 do_cleanups (cleanup);
812 }
813
814 /* See comments in probe.h. */
815
816 CORE_ADDR
817 get_probe_address (struct probe *probe, struct objfile *objfile)
818 {
819 return probe->pops->get_probe_address (probe, objfile);
820 }
821
822 /* See comments in probe.h. */
823
824 unsigned
825 get_probe_argument_count (struct probe *probe, struct frame_info *frame)
826 {
827 return probe->pops->get_probe_argument_count (probe, frame);
828 }
829
830 /* See comments in probe.h. */
831
832 int
833 can_evaluate_probe_arguments (struct probe *probe)
834 {
835 return probe->pops->can_evaluate_probe_arguments (probe);
836 }
837
838 /* See comments in probe.h. */
839
840 struct value *
841 evaluate_probe_argument (struct probe *probe, unsigned n,
842 struct frame_info *frame)
843 {
844 return probe->pops->evaluate_probe_argument (probe, n, frame);
845 }
846
847 /* See comments in probe.h. */
848
849 struct value *
850 probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n)
851 {
852 struct bound_probe probe;
853 unsigned n_args;
854
855 probe = find_probe_by_pc (get_frame_pc (frame));
856 if (!probe.probe)
857 return NULL;
858
859 n_args = get_probe_argument_count (probe.probe, frame);
860 if (n >= n_args)
861 return NULL;
862
863 return evaluate_probe_argument (probe.probe, n, frame);
864 }
865
866 /* See comment in probe.h. */
867
868 const struct probe_ops *
869 probe_linespec_to_ops (const char **linespecp)
870 {
871 int ix;
872 const struct probe_ops *probe_ops;
873
874 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, probe_ops); ix++)
875 if (probe_ops->is_linespec (linespecp))
876 return probe_ops;
877
878 return NULL;
879 }
880
881 /* See comment in probe.h. */
882
883 int
884 probe_is_linespec_by_keyword (const char **linespecp, const char *const *keywords)
885 {
886 const char *s = *linespecp;
887 const char *const *csp;
888
889 for (csp = keywords; *csp; csp++)
890 {
891 const char *keyword = *csp;
892 size_t len = strlen (keyword);
893
894 if (strncmp (s, keyword, len) == 0 && isspace (s[len]))
895 {
896 *linespecp += len + 1;
897 return 1;
898 }
899 }
900
901 return 0;
902 }
903
904 /* Implementation of `is_linespec' method for `struct probe_ops'. */
905
906 static int
907 probe_any_is_linespec (const char **linespecp)
908 {
909 static const char *const keywords[] = { "-p", "-probe", NULL };
910
911 return probe_is_linespec_by_keyword (linespecp, keywords);
912 }
913
914 /* Dummy method used for `probe_ops_any'. */
915
916 static void
917 probe_any_get_probes (VEC (probe_p) **probesp, struct objfile *objfile)
918 {
919 /* No probes can be provided by this dummy backend. */
920 }
921
922 /* Operations associated with a generic probe. */
923
924 const struct probe_ops probe_ops_any =
925 {
926 probe_any_is_linespec,
927 probe_any_get_probes,
928 };
929
930 /* See comments in probe.h. */
931
932 struct cmd_list_element **
933 info_probes_cmdlist_get (void)
934 {
935 static struct cmd_list_element *info_probes_cmdlist;
936
937 if (info_probes_cmdlist == NULL)
938 add_prefix_cmd ("probes", class_info, info_probes_command,
939 _("\
940 Show available static probes.\n\
941 Usage: info probes [all|TYPE [ARGS]]\n\
942 TYPE specifies the type of the probe, and can be one of the following:\n\
943 - stap\n\
944 If you specify TYPE, there may be additional arguments needed by the\n\
945 subcommand.\n\
946 If you do not specify any argument, or specify `all', then the command\n\
947 will show information about all types of probes."),
948 &info_probes_cmdlist, "info probes ",
949 0/*allow-unknown*/, &infolist);
950
951 return &info_probes_cmdlist;
952 }
953
954 \f
955
956 /* This is called to compute the value of one of the $_probe_arg*
957 convenience variables. */
958
959 static struct value *
960 compute_probe_arg (struct gdbarch *arch, struct internalvar *ivar,
961 void *data)
962 {
963 struct frame_info *frame = get_selected_frame (_("No frame selected"));
964 CORE_ADDR pc = get_frame_pc (frame);
965 int sel = (int) (uintptr_t) data;
966 struct bound_probe pc_probe;
967 const struct sym_probe_fns *pc_probe_fns;
968 unsigned n_args;
969
970 /* SEL == -1 means "_probe_argc". */
971 gdb_assert (sel >= -1);
972
973 pc_probe = find_probe_by_pc (pc);
974 if (pc_probe.probe == NULL)
975 error (_("No probe at PC %s"), core_addr_to_string (pc));
976
977 n_args = get_probe_argument_count (pc_probe.probe, frame);
978 if (sel == -1)
979 return value_from_longest (builtin_type (arch)->builtin_int, n_args);
980
981 if (sel >= n_args)
982 error (_("Invalid probe argument %d -- probe has %u arguments available"),
983 sel, n_args);
984
985 return evaluate_probe_argument (pc_probe.probe, sel, frame);
986 }
987
988 /* This is called to compile one of the $_probe_arg* convenience
989 variables into an agent expression. */
990
991 static void
992 compile_probe_arg (struct internalvar *ivar, struct agent_expr *expr,
993 struct axs_value *value, void *data)
994 {
995 CORE_ADDR pc = expr->scope;
996 int sel = (int) (uintptr_t) data;
997 struct bound_probe pc_probe;
998 const struct sym_probe_fns *pc_probe_fns;
999 int n_args;
1000 struct frame_info *frame = get_selected_frame (NULL);
1001
1002 /* SEL == -1 means "_probe_argc". */
1003 gdb_assert (sel >= -1);
1004
1005 pc_probe = find_probe_by_pc (pc);
1006 if (pc_probe.probe == NULL)
1007 error (_("No probe at PC %s"), core_addr_to_string (pc));
1008
1009 n_args = get_probe_argument_count (pc_probe.probe, frame);
1010
1011 if (sel == -1)
1012 {
1013 value->kind = axs_rvalue;
1014 value->type = builtin_type (expr->gdbarch)->builtin_int;
1015 ax_const_l (expr, n_args);
1016 return;
1017 }
1018
1019 gdb_assert (sel >= 0);
1020 if (sel >= n_args)
1021 error (_("Invalid probe argument %d -- probe has %d arguments available"),
1022 sel, n_args);
1023
1024 pc_probe.probe->pops->compile_to_ax (pc_probe.probe, expr, value, sel);
1025 }
1026
1027 static const struct internalvar_funcs probe_funcs =
1028 {
1029 compute_probe_arg,
1030 compile_probe_arg,
1031 NULL
1032 };
1033
1034
1035 VEC (probe_ops_cp) *all_probe_ops;
1036
1037 void _initialize_probe (void);
1038
1039 void
1040 _initialize_probe (void)
1041 {
1042 VEC_safe_push (probe_ops_cp, all_probe_ops, &probe_ops_any);
1043
1044 create_internalvar_type_lazy ("_probe_argc", &probe_funcs,
1045 (void *) (uintptr_t) -1);
1046 create_internalvar_type_lazy ("_probe_arg0", &probe_funcs,
1047 (void *) (uintptr_t) 0);
1048 create_internalvar_type_lazy ("_probe_arg1", &probe_funcs,
1049 (void *) (uintptr_t) 1);
1050 create_internalvar_type_lazy ("_probe_arg2", &probe_funcs,
1051 (void *) (uintptr_t) 2);
1052 create_internalvar_type_lazy ("_probe_arg3", &probe_funcs,
1053 (void *) (uintptr_t) 3);
1054 create_internalvar_type_lazy ("_probe_arg4", &probe_funcs,
1055 (void *) (uintptr_t) 4);
1056 create_internalvar_type_lazy ("_probe_arg5", &probe_funcs,
1057 (void *) (uintptr_t) 5);
1058 create_internalvar_type_lazy ("_probe_arg6", &probe_funcs,
1059 (void *) (uintptr_t) 6);
1060 create_internalvar_type_lazy ("_probe_arg7", &probe_funcs,
1061 (void *) (uintptr_t) 7);
1062 create_internalvar_type_lazy ("_probe_arg8", &probe_funcs,
1063 (void *) (uintptr_t) 8);
1064 create_internalvar_type_lazy ("_probe_arg9", &probe_funcs,
1065 (void *) (uintptr_t) 9);
1066 create_internalvar_type_lazy ("_probe_arg10", &probe_funcs,
1067 (void *) (uintptr_t) 10);
1068 create_internalvar_type_lazy ("_probe_arg11", &probe_funcs,
1069 (void *) (uintptr_t) 11);
1070
1071 add_cmd ("all", class_info, info_probes_command,
1072 _("\
1073 Show information about all type of probes."),
1074 info_probes_cmdlist_get ());
1075
1076 add_cmd ("probes", class_breakpoint, enable_probes_command, _("\
1077 Enable probes.\n\
1078 Usage: enable probes [PROVIDER [NAME [OBJECT]]]\n\
1079 Each argument is a regular expression, used to select probes.\n\
1080 PROVIDER matches probe provider names.\n\
1081 NAME matches the probe names.\n\
1082 OBJECT matches the executable or shared library name.\n\
1083 If you do not specify any argument then the command will enable\n\
1084 all defined probes."),
1085 &enablelist);
1086
1087 add_cmd ("probes", class_breakpoint, disable_probes_command, _("\
1088 Disable probes.\n\
1089 Usage: disable probes [PROVIDER [NAME [OBJECT]]]\n\
1090 Each argument is a regular expression, used to select probes.\n\
1091 PROVIDER matches probe provider names.\n\
1092 NAME matches the probe names.\n\
1093 OBJECT matches the executable or shared library name.\n\
1094 If you do not specify any argument then the command will disable\n\
1095 all defined probes."),
1096 &disablelist);
1097
1098 }
This page took 0.069419 seconds and 4 git commands to generate.