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