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