Fix ARC TLS support.
[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
c2f4122d
PA
44/* A helper for parse_probes that decodes a probe specification in
45 SEARCH_PSPACE. It appends matching SALs to RESULT. */
46
47static void
48parse_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
55aa24fb
SDJ
104/* See definition in probe.h. */
105
106struct symtabs_and_lines
f00aae0f 107parse_probes (const struct event_location *location,
c2f4122d 108 struct program_space *search_pspace,
f00aae0f 109 struct linespec_result *canonical)
55aa24fb 110{
f00aae0f 111 char *arg_end, *arg;
4721dc18 112 char *objfile_namestr = NULL, *provider = NULL, *name, *p;
55aa24fb
SDJ
113 struct cleanup *cleanup;
114 struct symtabs_and_lines result;
55aa24fb 115 const struct probe_ops *probe_ops;
f00aae0f 116 const char *arg_start, *cs;
55aa24fb
SDJ
117
118 result.sals = NULL;
119 result.nelts = 0;
120
5b56227b
KS
121 gdb_assert (event_location_type (location) == PROBE_LOCATION);
122 arg_start = get_probe_location (location);
55aa24fb 123
f00aae0f 124 cs = arg_start;
55aa24fb 125 probe_ops = probe_linespec_to_ops (&cs);
1bff71c3
SDJ
126 if (probe_ops == NULL)
127 error (_("'%s' is not a probe linespec"), arg_start);
55aa24fb
SDJ
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';
4721dc18 163 objfile_namestr = arg;
55aa24fb
SDJ
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"));
4721dc18 173 if (objfile_namestr && *objfile_namestr == '\0')
55aa24fb
SDJ
174 error (_("invalid objfile name"));
175
c2f4122d
PA
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;
55aa24fb 184
c2f4122d
PA
185 ALL_PSPACES (pspace)
186 parse_probes_in_pspace (probe_ops, pspace, objfile_namestr,
187 provider, name, &result);
188 }
55aa24fb
SDJ
189
190 if (result.nelts == 0)
191 {
192 throw_error (NOT_FOUND_ERROR,
193 _("No probe matching objfile=`%s', provider=`%s', name=`%s'"),
4721dc18 194 objfile_namestr ? objfile_namestr : _("<any>"),
55aa24fb
SDJ
195 provider ? provider : _("<any>"),
196 name);
197 }
198
199 if (canonical)
200 {
f00aae0f
KS
201 char *canon;
202
203 canon = savestring (arg_start, arg_end - arg_start);
204 make_cleanup (xfree, canon);
55aa24fb
SDJ
205 canonical->special_display = 1;
206 canonical->pre_expanded = 1;
5b56227b 207 canonical->location = new_probe_location (canon);
55aa24fb
SDJ
208 }
209
55aa24fb
SDJ
210 do_cleanups (cleanup);
211
212 return result;
213}
214
215/* See definition in probe.h. */
216
217VEC (probe_p) *
218find_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
729662a5 245struct bound_probe
6bac7473 246find_probe_by_pc (CORE_ADDR pc)
55aa24fb
SDJ
247{
248 struct objfile *objfile;
729662a5
TT
249 struct bound_probe result;
250
251 result.objfile = NULL;
252 result.probe = NULL;
55aa24fb
SDJ
253
254 ALL_OBJFILES (objfile)
255 {
256 VEC (probe_p) *probes;
257 int ix;
258 struct probe *probe;
259
729662a5
TT
260 if (!objfile->sf || !objfile->sf->sym_probe_fns
261 || objfile->sect_index_text == -1)
55aa24fb
SDJ
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++)
729662a5
TT
267 if (get_probe_address (probe, objfile) == pc)
268 {
269 result.objfile = objfile;
270 result.probe = probe;
271 return result;
272 }
55aa24fb
SDJ
273 }
274
729662a5 275 return result;
55aa24fb
SDJ
276}
277
278\f
279
55aa24fb
SDJ
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
729662a5 284static VEC (bound_probe_s) *
55aa24fb
SDJ
285collect_probes (char *objname, char *provider, char *probe_name,
286 const struct probe_ops *pops)
287{
288 struct objfile *objfile;
729662a5 289 VEC (bound_probe_s) *result = NULL;
55aa24fb
SDJ
290 struct cleanup *cleanup, *cleanup_temps;
291 regex_t obj_pat, prov_pat, probe_pat;
292
729662a5 293 cleanup = make_cleanup (VEC_cleanup (bound_probe_s), &result);
55aa24fb
SDJ
294
295 cleanup_temps = make_cleanup (null_cleanup, NULL);
db26349c
TT
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"));
55aa24fb
SDJ
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 {
4262abfb 314 if (regexec (&obj_pat, objfile_name (objfile), 0, NULL, 0) != 0)
55aa24fb
SDJ
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 {
729662a5
TT
322 struct bound_probe bound;
323
55aa24fb
SDJ
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
729662a5
TT
335 bound.objfile = objfile;
336 bound.probe = probe;
337 VEC_safe_push (bound_probe_s, result, &bound);
55aa24fb
SDJ
338 }
339 }
340
341 do_cleanups (cleanup_temps);
342 discard_cleanups (cleanup);
343 return result;
344}
345
729662a5 346/* A qsort comparison function for bound_probe_s objects. */
55aa24fb
SDJ
347
348static int
6bac7473 349compare_probes (const void *a, const void *b)
55aa24fb 350{
729662a5
TT
351 const struct bound_probe *pa = (const struct bound_probe *) a;
352 const struct bound_probe *pb = (const struct bound_probe *) b;
55aa24fb
SDJ
353 int v;
354
729662a5 355 v = strcmp (pa->probe->provider, pb->probe->provider);
55aa24fb
SDJ
356 if (v)
357 return v;
358
729662a5 359 v = strcmp (pa->probe->name, pb->probe->name);
55aa24fb
SDJ
360 if (v)
361 return v;
362
729662a5 363 if (pa->probe->address < pb->probe->address)
55aa24fb 364 return -1;
729662a5 365 if (pa->probe->address > pb->probe->address)
55aa24fb
SDJ
366 return 1;
367
4262abfb 368 return strcmp (objfile_name (pa->objfile), objfile_name (pb->objfile));
55aa24fb
SDJ
369}
370
371/* Helper function that generate entries in the ui_out table being
372 crafted by `info_probes_for_ops'. */
373
374static void
729662a5 375gen_ui_out_table_header_info (VEC (bound_probe_s) *probes,
55aa24fb
SDJ
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 {
729662a5 404 struct bound_probe *probe;
55aa24fb
SDJ
405 int jx;
406 size_t size_max = strlen (column->print_name);
407
729662a5 408 for (jx = 0; VEC_iterate (bound_probe_s, probes, jx, probe); ++jx)
55aa24fb
SDJ
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
729662a5 417 if (probe->probe->pops != p)
55aa24fb
SDJ
418 continue;
419
420 c2 = make_cleanup (VEC_cleanup (const_char_ptr), &probe_fields);
729662a5 421 p->gen_info_probes_table_values (probe->probe, &probe_fields);
55aa24fb
SDJ
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
6f9b8491
JM
447/* Helper function to print not-applicable strings for all the extra
448 columns defined in a probe_ops. */
449
450static void
451print_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
55aa24fb 472/* Helper function to print extra information about a probe and an objfile
6bac7473 473 represented by PROBE. */
55aa24fb
SDJ
474
475static void
6bac7473 476print_ui_out_info (struct probe *probe)
55aa24fb
SDJ
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
6bac7473
SDJ
487 gdb_assert (probe != NULL);
488 gdb_assert (probe->pops != NULL);
55aa24fb 489
6bac7473
SDJ
490 if (probe->pops->gen_info_probes_table_header == NULL
491 && probe->pops->gen_info_probes_table_values == NULL)
55aa24fb
SDJ
492 return;
493
6bac7473
SDJ
494 gdb_assert (probe->pops->gen_info_probes_table_header != NULL
495 && probe->pops->gen_info_probes_table_values != NULL);
55aa24fb
SDJ
496
497 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
498 make_cleanup (VEC_cleanup (const_char_ptr), &values);
499
6bac7473
SDJ
500 probe->pops->gen_info_probes_table_header (&headings);
501 probe->pops->gen_info_probes_table_values (probe, &values);
55aa24fb
SDJ
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
524static int
525get_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
6f9b8491
JM
544/* Helper function that returns 1 if there is a probe in PROBES
545 featuring the given POPS. It returns 0 otherwise. */
546
547static int
548exists_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
9aca2ff8
JM
561/* Helper function that parses a probe linespec of the form [PROVIDER
562 [PROBE [OBJNAME]]] from the provided string STR. */
563
564static void
565parse_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
55aa24fb
SDJ
579/* See comment in probe.h. */
580
581void
8236def8
TT
582info_probes_for_ops (const char *arg, int from_tty,
583 const struct probe_ops *pops)
55aa24fb 584{
6bac7473 585 char *provider, *probe_name = NULL, *objname = NULL;
55aa24fb 586 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
729662a5 587 VEC (bound_probe_s) *probes;
55aa24fb
SDJ
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");
6f9b8491 594 size_t size_type = strlen ("Type");
729662a5 595 struct bound_probe *probe;
55aa24fb
SDJ
596 struct gdbarch *gdbarch = get_current_arch ();
597
9aca2ff8
JM
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);
55aa24fb 602
6f9b8491
JM
603 probes = collect_probes (objname, provider, probe_name, pops);
604 make_cleanup (VEC_cleanup (probe_p), &probes);
605
55aa24fb
SDJ
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
6f9b8491
JM
618 that number. But note that we ignore the probe_ops for which no probes
619 are defined with the given search criteria. */
55aa24fb
SDJ
620
621 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
6f9b8491
JM
622 if (exists_probe_with_pops (probes, po))
623 ui_out_extra_fields += get_number_extra_fields (po);
55aa24fb
SDJ
624 }
625 else
626 ui_out_extra_fields = get_number_extra_fields (pops);
627
55aa24fb 628 make_cleanup_ui_out_table_begin_end (current_uiout,
6f9b8491 629 5 + ui_out_extra_fields,
729662a5 630 VEC_length (bound_probe_s, probes),
55aa24fb
SDJ
631 "StaticProbes");
632
729662a5
TT
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);
55aa24fb
SDJ
637
638 /* What's the size of an address in our architecture? */
639 size_addr = gdbarch_addr_bit (gdbarch) == 64 ? 18 : 10;
640
6f9b8491
JM
641 /* Determining the maximum size of each field (`type', `provider',
642 `name' and `objname'). */
729662a5 643 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
55aa24fb 644 {
6f9b8491
JM
645 const char *probe_type = probe->probe->pops->type_name (probe->probe);
646
647 size_type = max (strlen (probe_type), size_type);
729662a5
TT
648 size_name = max (strlen (probe->probe->name), size_name);
649 size_provider = max (strlen (probe->probe->provider), size_provider);
4262abfb 650 size_objname = max (strlen (objfile_name (probe->objfile)), size_objname);
55aa24fb
SDJ
651 }
652
6f9b8491 653 ui_out_table_header (current_uiout, size_type, ui_left, "type", _("Type"));
55aa24fb
SDJ
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
6f9b8491
JM
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. */
55aa24fb 667 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
6f9b8491
JM
668 if (exists_probe_with_pops (probes, po))
669 gen_ui_out_table_header_info (probes, po);
55aa24fb
SDJ
670 }
671 else
6bac7473 672 gen_ui_out_table_header_info (probes, pops);
55aa24fb
SDJ
673
674 ui_out_table_header (current_uiout, size_objname, ui_left, "object",
675 _("Object"));
676 ui_out_table_body (current_uiout);
677
729662a5 678 for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
55aa24fb
SDJ
679 {
680 struct cleanup *inner;
6f9b8491 681 const char *probe_type = probe->probe->pops->type_name (probe->probe);
55aa24fb
SDJ
682
683 inner = make_cleanup_ui_out_tuple_begin_end (current_uiout, "probe");
684
6f9b8491 685 ui_out_field_string (current_uiout, "type",probe_type);
729662a5
TT
686 ui_out_field_string (current_uiout, "provider", probe->probe->provider);
687 ui_out_field_string (current_uiout, "name", probe->probe->name);
55aa24fb 688 ui_out_field_core_addr (current_uiout, "addr",
729662a5
TT
689 probe->probe->arch,
690 get_probe_address (probe->probe, probe->objfile));
55aa24fb
SDJ
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)
729662a5
TT
699 if (probe->probe->pops == po)
700 print_ui_out_info (probe->probe);
6f9b8491
JM
701 else if (exists_probe_with_pops (probes, po))
702 print_ui_out_not_applicables (po);
55aa24fb
SDJ
703 }
704 else
729662a5 705 print_ui_out_info (probe->probe);
55aa24fb 706
4262abfb
JK
707 ui_out_field_string (current_uiout, "object",
708 objfile_name (probe->objfile));
55aa24fb
SDJ
709 ui_out_text (current_uiout, "\n");
710
711 do_cleanups (inner);
712 }
713
729662a5 714 any_found = !VEC_empty (bound_probe_s, probes);
55aa24fb
SDJ
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
723static void
724info_probes_command (char *arg, int from_tty)
725{
726 info_probes_for_ops (arg, from_tty, NULL);
727}
728
9aca2ff8
JM
729/* Implementation of the `enable probes' command. */
730
731static void
732enable_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
777static void
778disable_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
55aa24fb
SDJ
821/* See comments in probe.h. */
822
729662a5
TT
823CORE_ADDR
824get_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
9ee6a5ac 831unsigned
08a6411c 832get_probe_argument_count (struct probe *probe, struct frame_info *frame)
9ee6a5ac 833{
08a6411c 834 return probe->pops->get_probe_argument_count (probe, frame);
9ee6a5ac
GB
835}
836
837/* See comments in probe.h. */
838
25f9533e
SDJ
839int
840can_evaluate_probe_arguments (struct probe *probe)
841{
37fbcad0 842 return probe->pops->can_evaluate_probe_arguments (probe);
25f9533e
SDJ
843}
844
845/* See comments in probe.h. */
846
9ee6a5ac 847struct value *
08a6411c
SDJ
848evaluate_probe_argument (struct probe *probe, unsigned n,
849 struct frame_info *frame)
9ee6a5ac 850{
08a6411c 851 return probe->pops->evaluate_probe_argument (probe, n, frame);
9ee6a5ac
GB
852}
853
854/* See comments in probe.h. */
855
55aa24fb
SDJ
856struct value *
857probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n)
858{
729662a5 859 struct bound_probe probe;
2b963b68 860 unsigned n_args;
55aa24fb 861
6bac7473 862 probe = find_probe_by_pc (get_frame_pc (frame));
729662a5 863 if (!probe.probe)
55aa24fb 864 return NULL;
55aa24fb 865
729662a5 866 n_args = get_probe_argument_count (probe.probe, frame);
2b963b68 867 if (n >= n_args)
55aa24fb
SDJ
868 return NULL;
869
729662a5 870 return evaluate_probe_argument (probe.probe, n, frame);
55aa24fb
SDJ
871}
872
873/* See comment in probe.h. */
874
875const struct probe_ops *
876probe_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
890int
891probe_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
913static int
914probe_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
923static void
924probe_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
931const 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
939struct cmd_list_element **
940info_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 _("\
947Show available static probes.\n\
948Usage: info probes [all|TYPE [ARGS]]\n\
949TYPE specifies the type of the probe, and can be one of the following:\n\
950 - stap\n\
951If you specify TYPE, there may be additional arguments needed by the\n\
952subcommand.\n\
953If you do not specify any argument, or specify `all', then the command\n\
954will 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
03e98035
JM
961\f
962
963/* This is called to compute the value of one of the $_probe_arg*
964 convenience variables. */
965
966static struct value *
967compute_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
998static void
999compile_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
1034static const struct internalvar_funcs probe_funcs =
1035{
1036 compute_probe_arg,
1037 compile_probe_arg,
1038 NULL
1039};
1040
1041
55aa24fb
SDJ
1042VEC (probe_ops_cp) *all_probe_ops;
1043
1044void _initialize_probe (void);
1045
1046void
1047_initialize_probe (void)
1048{
1049 VEC_safe_push (probe_ops_cp, all_probe_ops, &probe_ops_any);
1050
03e98035
JM
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
55aa24fb
SDJ
1078 add_cmd ("all", class_info, info_probes_command,
1079 _("\
1080Show information about all type of probes."),
1081 info_probes_cmdlist_get ());
9aca2ff8
JM
1082
1083 add_cmd ("probes", class_breakpoint, enable_probes_command, _("\
1084Enable probes.\n\
1085Usage: enable probes [PROVIDER [NAME [OBJECT]]]\n\
1086Each argument is a regular expression, used to select probes.\n\
1087PROVIDER matches probe provider names.\n\
1088NAME matches the probe names.\n\
1089OBJECT matches the executable or shared library name.\n\
1090If you do not specify any argument then the command will enable\n\
1091all defined probes."),
1092 &enablelist);
1093
1094 add_cmd ("probes", class_breakpoint, disable_probes_command, _("\
1095Disable probes.\n\
1096Usage: disable probes [PROVIDER [NAME [OBJECT]]]\n\
1097Each argument is a regular expression, used to select probes.\n\
1098PROVIDER matches probe provider names.\n\
1099NAME matches the probe names.\n\
1100OBJECT matches the executable or shared library name.\n\
1101If you do not specify any argument then the command will disable\n\
1102all defined probes."),
1103 &disablelist);
1104
55aa24fb 1105}
This page took 0.426589 seconds and 4 git commands to generate.