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