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