]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/probe.c
Limit breakpoint re-set to the current program space
[thirdparty/binutils-gdb.git] / gdb / probe.c
1 /* Generic static probe support for GDB.
2
3 Copyright (C) 2012-2016 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
39 typedef struct bound_probe bound_probe_s;
40 DEF_VEC_O (bound_probe_s);
41
42 \f
43
44 /* A helper for parse_probes that decodes a probe specification in
45 SEARCH_PSPACE. It appends matching SALs to RESULT. */
46
47 static void
48 parse_probes_in_pspace (const struct probe_ops *probe_ops,
49 struct program_space *search_pspace,
50 const char *objfile_namestr,
51 const char *provider,
52 const char *name,
53 struct symtabs_and_lines *result)
54 {
55 struct objfile *objfile;
56
57 ALL_PSPACE_OBJFILES (search_pspace, objfile)
58 {
59 VEC (probe_p) *probes;
60 struct probe *probe;
61 int ix;
62
63 if (!objfile->sf || !objfile->sf->sym_probe_fns)
64 continue;
65
66 if (objfile_namestr
67 && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0
68 && FILENAME_CMP (lbasename (objfile_name (objfile)),
69 objfile_namestr) != 0)
70 continue;
71
72 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
73
74 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
75 {
76 struct symtab_and_line *sal;
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 ++result->nelts;
88 result->sals = XRESIZEVEC (struct symtab_and_line, result->sals,
89 result->nelts);
90 sal = &result->sals[result->nelts - 1];
91
92 init_sal (sal);
93
94 sal->pc = get_probe_address (probe, objfile);
95 sal->explicit_pc = 1;
96 sal->section = find_pc_overlay (sal->pc);
97 sal->pspace = search_pspace;
98 sal->probe = probe;
99 sal->objfile = objfile;
100 }
101 }
102 }
103
104 /* See definition in probe.h. */
105
106 struct symtabs_and_lines
107 parse_probes (const struct event_location *location,
108 struct program_space *search_pspace,
109 struct linespec_result *canonical)
110 {
111 char *arg_end, *arg;
112 char *objfile_namestr = NULL, *provider = NULL, *name, *p;
113 struct cleanup *cleanup;
114 struct symtabs_and_lines result;
115 const struct probe_ops *probe_ops;
116 const char *arg_start, *cs;
117
118 result.sals = NULL;
119 result.nelts = 0;
120
121 gdb_assert (event_location_type (location) == PROBE_LOCATION);
122 arg_start = get_probe_location (location);
123
124 cs = arg_start;
125 probe_ops = probe_linespec_to_ops (&cs);
126 if (probe_ops == NULL)
127 error (_("'%s' is not a probe linespec"), arg_start);
128
129 arg = (char *) cs;
130 arg = skip_spaces (arg);
131 if (!*arg)
132 error (_("argument to `%s' missing"), arg_start);
133
134 arg_end = skip_to_space (arg);
135
136 /* We make a copy here so we can write over parts with impunity. */
137 arg = savestring (arg, arg_end - arg);
138 cleanup = make_cleanup (xfree, arg);
139
140 /* Extract each word from the argument, separated by ":"s. */
141 p = strchr (arg, ':');
142 if (p == NULL)
143 {
144 /* This is `-p name'. */
145 name = arg;
146 }
147 else
148 {
149 char *hold = p + 1;
150
151 *p = '\0';
152 p = strchr (hold, ':');
153 if (p == NULL)
154 {
155 /* This is `-p provider:name'. */
156 provider = arg;
157 name = hold;
158 }
159 else
160 {
161 /* This is `-p objfile:provider:name'. */
162 *p = '\0';
163 objfile_namestr = arg;
164 provider = hold;
165 name = p + 1;
166 }
167 }
168
169 if (*name == '\0')
170 error (_("no probe name specified"));
171 if (provider && *provider == '\0')
172 error (_("invalid provider name"));
173 if (objfile_namestr && *objfile_namestr == '\0')
174 error (_("invalid objfile name"));
175
176 if (search_pspace != NULL)
177 {
178 parse_probes_in_pspace (probe_ops, search_pspace, objfile_namestr,
179 provider, name, &result);
180 }
181 else
182 {
183 struct program_space *pspace;
184
185 ALL_PSPACES (pspace)
186 parse_probes_in_pspace (probe_ops, pspace, objfile_namestr,
187 provider, name, &result);
188 }
189
190 if (result.nelts == 0)
191 {
192 throw_error (NOT_FOUND_ERROR,
193 _("No probe matching objfile=`%s', provider=`%s', name=`%s'"),
194 objfile_namestr ? objfile_namestr : _("<any>"),
195 provider ? provider : _("<any>"),
196 name);
197 }
198
199 if (canonical)
200 {
201 char *canon;
202
203 canon = savestring (arg_start, arg_end - arg_start);
204 make_cleanup (xfree, canon);
205 canonical->special_display = 1;
206 canonical->pre_expanded = 1;
207 canonical->location = new_probe_location (canon);
208 }
209
210 do_cleanups (cleanup);
211
212 return result;
213 }
214
215 /* See definition in probe.h. */
216
217 VEC (probe_p) *
218 find_probes_in_objfile (struct objfile *objfile, const char *provider,
219 const char *name)
220 {
221 VEC (probe_p) *probes, *result = NULL;
222 int ix;
223 struct probe *probe;
224
225 if (!objfile->sf || !objfile->sf->sym_probe_fns)
226 return NULL;
227
228 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
229 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
230 {
231 if (strcmp (probe->provider, provider) != 0)
232 continue;
233
234 if (strcmp (probe->name, name) != 0)
235 continue;
236
237 VEC_safe_push (probe_p, result, probe);
238 }
239
240 return result;
241 }
242
243 /* See definition in probe.h. */
244
245 struct bound_probe
246 find_probe_by_pc (CORE_ADDR pc)
247 {
248 struct objfile *objfile;
249 struct bound_probe result;
250
251 result.objfile = NULL;
252 result.probe = NULL;
253
254 ALL_OBJFILES (objfile)
255 {
256 VEC (probe_p) *probes;
257 int ix;
258 struct probe *probe;
259
260 if (!objfile->sf || !objfile->sf->sym_probe_fns
261 || objfile->sect_index_text == -1)
262 continue;
263
264 /* If this proves too inefficient, we can replace with a hash. */
265 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
266 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
267 if (get_probe_address (probe, objfile) == pc)
268 {
269 result.objfile = objfile;
270 result.probe = probe;
271 return result;
272 }
273 }
274
275 return result;
276 }
277
278 \f
279
280 /* Make a vector of probes matching OBJNAME, PROVIDER, and PROBE_NAME.
281 If POPS is not NULL, only probes of this certain probe_ops will match.
282 Each argument is a regexp, or NULL, which matches anything. */
283
284 static VEC (bound_probe_s) *
285 collect_probes (char *objname, char *provider, char *probe_name,
286 const struct probe_ops *pops)
287 {
288 struct objfile *objfile;
289 VEC (bound_probe_s) *result = NULL;
290 struct cleanup *cleanup, *cleanup_temps;
291 regex_t obj_pat, prov_pat, probe_pat;
292
293 cleanup = make_cleanup (VEC_cleanup (bound_probe_s), &result);
294
295 cleanup_temps = make_cleanup (null_cleanup, NULL);
296 if (provider != NULL)
297 compile_rx_or_error (&prov_pat, provider, _("Invalid provider regexp"));
298 if (probe_name != NULL)
299 compile_rx_or_error (&probe_pat, probe_name, _("Invalid probe regexp"));
300 if (objname != NULL)
301 compile_rx_or_error (&obj_pat, objname, _("Invalid object file regexp"));
302
303 ALL_OBJFILES (objfile)
304 {
305 VEC (probe_p) *probes;
306 struct probe *probe;
307 int ix;
308
309 if (! objfile->sf || ! objfile->sf->sym_probe_fns)
310 continue;
311
312 if (objname)
313 {
314 if (regexec (&obj_pat, objfile_name (objfile), 0, NULL, 0) != 0)
315 continue;
316 }
317
318 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
319
320 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
321 {
322 struct bound_probe bound;
323
324 if (pops != NULL && probe->pops != pops)
325 continue;
326
327 if (provider
328 && regexec (&prov_pat, probe->provider, 0, NULL, 0) != 0)
329 continue;
330
331 if (probe_name
332 && regexec (&probe_pat, probe->name, 0, NULL, 0) != 0)
333 continue;
334
335 bound.objfile = objfile;
336 bound.probe = probe;
337 VEC_safe_push (bound_probe_s, result, &bound);
338 }
339 }
340
341 do_cleanups (cleanup_temps);
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 = max (strlen (val), size_max);
436 }
437 do_cleanups (c2);
438 }
439
440 ui_out_table_header (current_uiout, 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 ui_out_field_string (current_uiout, 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 ui_out_field_skip (current_uiout, column->field_name);
514 else
515 ui_out_field_string (current_uiout, 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 = max (strlen (probe_type), size_type);
648 size_name = max (strlen (probe->probe->name), size_name);
649 size_provider = max (strlen (probe->probe->provider), size_provider);
650 size_objname = max (strlen (objfile_name (probe->objfile)), size_objname);
651 }
652
653 ui_out_table_header (current_uiout, size_type, ui_left, "type", _("Type"));
654 ui_out_table_header (current_uiout, size_provider, ui_left, "provider",
655 _("Provider"));
656 ui_out_table_header (current_uiout, size_name, ui_left, "name", _("Name"));
657 ui_out_table_header (current_uiout, size_addr, ui_left, "addr", _("Where"));
658
659 if (pops == NULL)
660 {
661 const struct probe_ops *po;
662 int ix;
663
664 /* We have to generate the table header for each new probe type
665 that we will print. Note that this excludes probe types not
666 having any defined probe with the search criteria. */
667 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
668 if (exists_probe_with_pops (probes, po))
669 gen_ui_out_table_header_info (probes, po);
670 }
671 else
672 gen_ui_out_table_header_info (probes, pops);
673
674 ui_out_table_header (current_uiout, size_objname, ui_left, "object",
675 _("Object"));
676 ui_out_table_body (current_uiout);
677
678 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
679 {
680 struct cleanup *inner;
681 const char *probe_type = probe->probe->pops->type_name (probe->probe);
682
683 inner = make_cleanup_ui_out_tuple_begin_end (current_uiout, "probe");
684
685 ui_out_field_string (current_uiout, "type",probe_type);
686 ui_out_field_string (current_uiout, "provider", probe->probe->provider);
687 ui_out_field_string (current_uiout, "name", probe->probe->name);
688 ui_out_field_core_addr (current_uiout, "addr",
689 probe->probe->arch,
690 get_probe_address (probe->probe, probe->objfile));
691
692 if (pops == NULL)
693 {
694 const struct probe_ops *po;
695 int ix;
696
697 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po);
698 ++ix)
699 if (probe->probe->pops == po)
700 print_ui_out_info (probe->probe);
701 else if (exists_probe_with_pops (probes, po))
702 print_ui_out_not_applicables (po);
703 }
704 else
705 print_ui_out_info (probe->probe);
706
707 ui_out_field_string (current_uiout, "object",
708 objfile_name (probe->objfile));
709 ui_out_text (current_uiout, "\n");
710
711 do_cleanups (inner);
712 }
713
714 any_found = !VEC_empty (bound_probe_s, probes);
715 do_cleanups (cleanup);
716
717 if (!any_found)
718 ui_out_message (current_uiout, 0, _("No probes matched.\n"));
719 }
720
721 /* Implementation of the `info probes' command. */
722
723 static void
724 info_probes_command (char *arg, int from_tty)
725 {
726 info_probes_for_ops (arg, from_tty, NULL);
727 }
728
729 /* Implementation of the `enable probes' command. */
730
731 static void
732 enable_probes_command (char *arg, int from_tty)
733 {
734 char *provider, *probe_name = NULL, *objname = NULL;
735 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
736 VEC (bound_probe_s) *probes;
737 struct bound_probe *probe;
738 int i;
739
740 parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
741 make_cleanup (xfree, provider);
742 make_cleanup (xfree, probe_name);
743 make_cleanup (xfree, objname);
744
745 probes = collect_probes (objname, provider, probe_name, NULL);
746 if (VEC_empty (bound_probe_s, probes))
747 {
748 ui_out_message (current_uiout, 0, _("No probes matched.\n"));
749 do_cleanups (cleanup);
750 return;
751 }
752
753 /* Enable the selected probes, provided their backends support the
754 notion of enabling a probe. */
755 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
756 {
757 const struct probe_ops *pops = probe->probe->pops;
758
759 if (pops->enable_probe != NULL)
760 {
761 pops->enable_probe (probe->probe);
762 ui_out_message (current_uiout, 0,
763 _("Probe %s:%s enabled.\n"),
764 probe->probe->provider, probe->probe->name);
765 }
766 else
767 ui_out_message (current_uiout, 0,
768 _("Probe %s:%s cannot be enabled.\n"),
769 probe->probe->provider, probe->probe->name);
770 }
771
772 do_cleanups (cleanup);
773 }
774
775 /* Implementation of the `disable probes' command. */
776
777 static void
778 disable_probes_command (char *arg, int from_tty)
779 {
780 char *provider, *probe_name = NULL, *objname = NULL;
781 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
782 VEC (bound_probe_s) *probes;
783 struct bound_probe *probe;
784 int i;
785
786 parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
787 make_cleanup (xfree, provider);
788 make_cleanup (xfree, probe_name);
789 make_cleanup (xfree, objname);
790
791 probes = collect_probes (objname, provider, probe_name, NULL /* pops */);
792 if (VEC_empty (bound_probe_s, probes))
793 {
794 ui_out_message (current_uiout, 0, _("No probes matched.\n"));
795 do_cleanups (cleanup);
796 return;
797 }
798
799 /* Disable the selected probes, provided their backends support the
800 notion of enabling a probe. */
801 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
802 {
803 const struct probe_ops *pops = probe->probe->pops;
804
805 if (pops->disable_probe != NULL)
806 {
807 pops->disable_probe (probe->probe);
808 ui_out_message (current_uiout, 0,
809 _("Probe %s:%s disabled.\n"),
810 probe->probe->provider, probe->probe->name);
811 }
812 else
813 ui_out_message (current_uiout, 0,
814 _("Probe %s:%s cannot be disabled.\n"),
815 probe->probe->provider, probe->probe->name);
816 }
817
818 do_cleanups (cleanup);
819 }
820
821 /* See comments in probe.h. */
822
823 CORE_ADDR
824 get_probe_address (struct probe *probe, struct objfile *objfile)
825 {
826 return probe->pops->get_probe_address (probe, objfile);
827 }
828
829 /* See comments in probe.h. */
830
831 unsigned
832 get_probe_argument_count (struct probe *probe, struct frame_info *frame)
833 {
834 return probe->pops->get_probe_argument_count (probe, frame);
835 }
836
837 /* See comments in probe.h. */
838
839 int
840 can_evaluate_probe_arguments (struct probe *probe)
841 {
842 return probe->pops->can_evaluate_probe_arguments (probe);
843 }
844
845 /* See comments in probe.h. */
846
847 struct value *
848 evaluate_probe_argument (struct probe *probe, unsigned n,
849 struct frame_info *frame)
850 {
851 return probe->pops->evaluate_probe_argument (probe, n, frame);
852 }
853
854 /* See comments in probe.h. */
855
856 struct value *
857 probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n)
858 {
859 struct bound_probe probe;
860 unsigned n_args;
861
862 probe = find_probe_by_pc (get_frame_pc (frame));
863 if (!probe.probe)
864 return NULL;
865
866 n_args = get_probe_argument_count (probe.probe, frame);
867 if (n >= n_args)
868 return NULL;
869
870 return evaluate_probe_argument (probe.probe, n, frame);
871 }
872
873 /* See comment in probe.h. */
874
875 const struct probe_ops *
876 probe_linespec_to_ops (const char **linespecp)
877 {
878 int ix;
879 const struct probe_ops *probe_ops;
880
881 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, probe_ops); ix++)
882 if (probe_ops->is_linespec (linespecp))
883 return probe_ops;
884
885 return NULL;
886 }
887
888 /* See comment in probe.h. */
889
890 int
891 probe_is_linespec_by_keyword (const char **linespecp, const char *const *keywords)
892 {
893 const char *s = *linespecp;
894 const char *const *csp;
895
896 for (csp = keywords; *csp; csp++)
897 {
898 const char *keyword = *csp;
899 size_t len = strlen (keyword);
900
901 if (strncmp (s, keyword, len) == 0 && isspace (s[len]))
902 {
903 *linespecp += len + 1;
904 return 1;
905 }
906 }
907
908 return 0;
909 }
910
911 /* Implementation of `is_linespec' method for `struct probe_ops'. */
912
913 static int
914 probe_any_is_linespec (const char **linespecp)
915 {
916 static const char *const keywords[] = { "-p", "-probe", NULL };
917
918 return probe_is_linespec_by_keyword (linespecp, keywords);
919 }
920
921 /* Dummy method used for `probe_ops_any'. */
922
923 static void
924 probe_any_get_probes (VEC (probe_p) **probesp, struct objfile *objfile)
925 {
926 /* No probes can be provided by this dummy backend. */
927 }
928
929 /* Operations associated with a generic probe. */
930
931 const struct probe_ops probe_ops_any =
932 {
933 probe_any_is_linespec,
934 probe_any_get_probes,
935 };
936
937 /* See comments in probe.h. */
938
939 struct cmd_list_element **
940 info_probes_cmdlist_get (void)
941 {
942 static struct cmd_list_element *info_probes_cmdlist;
943
944 if (info_probes_cmdlist == NULL)
945 add_prefix_cmd ("probes", class_info, info_probes_command,
946 _("\
947 Show available static probes.\n\
948 Usage: info probes [all|TYPE [ARGS]]\n\
949 TYPE specifies the type of the probe, and can be one of the following:\n\
950 - stap\n\
951 If you specify TYPE, there may be additional arguments needed by the\n\
952 subcommand.\n\
953 If you do not specify any argument, or specify `all', then the command\n\
954 will show information about all types of probes."),
955 &info_probes_cmdlist, "info probes ",
956 0/*allow-unknown*/, &infolist);
957
958 return &info_probes_cmdlist;
959 }
960
961 \f
962
963 /* This is called to compute the value of one of the $_probe_arg*
964 convenience variables. */
965
966 static struct value *
967 compute_probe_arg (struct gdbarch *arch, struct internalvar *ivar,
968 void *data)
969 {
970 struct frame_info *frame = get_selected_frame (_("No frame selected"));
971 CORE_ADDR pc = get_frame_pc (frame);
972 int sel = (int) (uintptr_t) data;
973 struct bound_probe pc_probe;
974 const struct sym_probe_fns *pc_probe_fns;
975 unsigned n_args;
976
977 /* SEL == -1 means "_probe_argc". */
978 gdb_assert (sel >= -1);
979
980 pc_probe = find_probe_by_pc (pc);
981 if (pc_probe.probe == NULL)
982 error (_("No probe at PC %s"), core_addr_to_string (pc));
983
984 n_args = get_probe_argument_count (pc_probe.probe, frame);
985 if (sel == -1)
986 return value_from_longest (builtin_type (arch)->builtin_int, n_args);
987
988 if (sel >= n_args)
989 error (_("Invalid probe argument %d -- probe has %u arguments available"),
990 sel, n_args);
991
992 return evaluate_probe_argument (pc_probe.probe, sel, frame);
993 }
994
995 /* This is called to compile one of the $_probe_arg* convenience
996 variables into an agent expression. */
997
998 static void
999 compile_probe_arg (struct internalvar *ivar, struct agent_expr *expr,
1000 struct axs_value *value, void *data)
1001 {
1002 CORE_ADDR pc = expr->scope;
1003 int sel = (int) (uintptr_t) data;
1004 struct bound_probe pc_probe;
1005 const struct sym_probe_fns *pc_probe_fns;
1006 int n_args;
1007 struct frame_info *frame = get_selected_frame (NULL);
1008
1009 /* SEL == -1 means "_probe_argc". */
1010 gdb_assert (sel >= -1);
1011
1012 pc_probe = find_probe_by_pc (pc);
1013 if (pc_probe.probe == NULL)
1014 error (_("No probe at PC %s"), core_addr_to_string (pc));
1015
1016 n_args = get_probe_argument_count (pc_probe.probe, frame);
1017
1018 if (sel == -1)
1019 {
1020 value->kind = axs_rvalue;
1021 value->type = builtin_type (expr->gdbarch)->builtin_int;
1022 ax_const_l (expr, n_args);
1023 return;
1024 }
1025
1026 gdb_assert (sel >= 0);
1027 if (sel >= n_args)
1028 error (_("Invalid probe argument %d -- probe has %d arguments available"),
1029 sel, n_args);
1030
1031 pc_probe.probe->pops->compile_to_ax (pc_probe.probe, expr, value, sel);
1032 }
1033
1034 static const struct internalvar_funcs probe_funcs =
1035 {
1036 compute_probe_arg,
1037 compile_probe_arg,
1038 NULL
1039 };
1040
1041
1042 VEC (probe_ops_cp) *all_probe_ops;
1043
1044 void _initialize_probe (void);
1045
1046 void
1047 _initialize_probe (void)
1048 {
1049 VEC_safe_push (probe_ops_cp, all_probe_ops, &probe_ops_any);
1050
1051 create_internalvar_type_lazy ("_probe_argc", &probe_funcs,
1052 (void *) (uintptr_t) -1);
1053 create_internalvar_type_lazy ("_probe_arg0", &probe_funcs,
1054 (void *) (uintptr_t) 0);
1055 create_internalvar_type_lazy ("_probe_arg1", &probe_funcs,
1056 (void *) (uintptr_t) 1);
1057 create_internalvar_type_lazy ("_probe_arg2", &probe_funcs,
1058 (void *) (uintptr_t) 2);
1059 create_internalvar_type_lazy ("_probe_arg3", &probe_funcs,
1060 (void *) (uintptr_t) 3);
1061 create_internalvar_type_lazy ("_probe_arg4", &probe_funcs,
1062 (void *) (uintptr_t) 4);
1063 create_internalvar_type_lazy ("_probe_arg5", &probe_funcs,
1064 (void *) (uintptr_t) 5);
1065 create_internalvar_type_lazy ("_probe_arg6", &probe_funcs,
1066 (void *) (uintptr_t) 6);
1067 create_internalvar_type_lazy ("_probe_arg7", &probe_funcs,
1068 (void *) (uintptr_t) 7);
1069 create_internalvar_type_lazy ("_probe_arg8", &probe_funcs,
1070 (void *) (uintptr_t) 8);
1071 create_internalvar_type_lazy ("_probe_arg9", &probe_funcs,
1072 (void *) (uintptr_t) 9);
1073 create_internalvar_type_lazy ("_probe_arg10", &probe_funcs,
1074 (void *) (uintptr_t) 10);
1075 create_internalvar_type_lazy ("_probe_arg11", &probe_funcs,
1076 (void *) (uintptr_t) 11);
1077
1078 add_cmd ("all", class_info, info_probes_command,
1079 _("\
1080 Show information about all type of probes."),
1081 info_probes_cmdlist_get ());
1082
1083 add_cmd ("probes", class_breakpoint, enable_probes_command, _("\
1084 Enable probes.\n\
1085 Usage: enable probes [PROVIDER [NAME [OBJECT]]]\n\
1086 Each argument is a regular expression, used to select probes.\n\
1087 PROVIDER matches probe provider names.\n\
1088 NAME matches the probe names.\n\
1089 OBJECT matches the executable or shared library name.\n\
1090 If you do not specify any argument then the command will enable\n\
1091 all defined probes."),
1092 &enablelist);
1093
1094 add_cmd ("probes", class_breakpoint, disable_probes_command, _("\
1095 Disable probes.\n\
1096 Usage: disable probes [PROVIDER [NAME [OBJECT]]]\n\
1097 Each argument is a regular expression, used to select probes.\n\
1098 PROVIDER matches probe provider names.\n\
1099 NAME matches the probe names.\n\
1100 OBJECT matches the executable or shared library name.\n\
1101 If you do not specify any argument then the command will disable\n\
1102 all defined probes."),
1103 &disablelist);
1104
1105 }