1 /* Generic static probe support for GDB. 2 3 Copyright (C) 2012-2020 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #include "defs.h" 21 #include "probe.h" 22 #include "command.h" 23 #include "cli/cli-cmds.h" 24 #include "cli/cli-utils.h" 25 #include "objfiles.h" 26 #include "symtab.h" 27 #include "progspace.h" 28 #include "filenames.h" 29 #include "linespec.h" 30 #include "gdb_regex.h" 31 #include "frame.h" 32 #include "arch-utils.h" 33 #include "value.h" 34 #include "ax.h" 35 #include "ax-gdb.h" 36 #include "location.h" 37 #include <ctype.h> 38 #include <algorithm> 39 #include "gdbsupport/gdb_optional.h" 40 41 /* Class that implements the static probe methods for "any" probe. */ 42 43 class any_static_probe_ops : public static_probe_ops 44 { 45 public: 46 /* See probe.h. */ 47 bool is_linespec (const char **linespecp) const override; 48 49 /* See probe.h. */ 50 void get_probes (std::vector<std::unique_ptr<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 63 const any_static_probe_ops any_static_probe_ops {}; 64 65 /* A helper for parse_probes that decodes a probe specification in 66 SEARCH_PSPACE. It appends matching SALs to RESULT. */ 67 68 static void 69 parse_probes_in_pspace (const static_probe_ops *spops, 70 struct program_space *search_pspace, 71 const char *objfile_namestr, 72 const char *provider, 73 const char *name, 74 std::vector<symtab_and_line> *result) 75 { 76 for (objfile *objfile : search_pspace->objfiles ()) 77 { 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 87 const std::vector<std::unique_ptr<probe>> &probes 88 = objfile->sf->sym_probe_fns->sym_get_probes (objfile); 89 90 for (auto &p : probes) 91 { 92 if (spops != &any_static_probe_ops && p->get_static_ops () != spops) 93 continue; 94 95 if (provider != NULL && p->get_provider () != provider) 96 continue; 97 98 if (p->get_name () != name) 99 continue; 100 101 symtab_and_line sal; 102 sal.pc = p->get_relocated_address (objfile); 103 sal.explicit_pc = 1; 104 sal.section = find_pc_overlay (sal.pc); 105 sal.pspace = search_pspace; 106 sal.prob = p.get (); 107 sal.objfile = objfile; 108 109 result->push_back (std::move (sal)); 110 } 111 } 112 } 113 114 /* See definition in probe.h. */ 115 116 std::vector<symtab_and_line> 117 parse_probes (const struct event_location *location, 118 struct program_space *search_pspace, 119 struct linespec_result *canonical) 120 { 121 char *arg_end, *arg; 122 char *objfile_namestr = NULL, *provider = NULL, *name, *p; 123 const char *arg_start, *cs; 124 125 gdb_assert (event_location_type (location) == PROBE_LOCATION); 126 arg_start = get_probe_location (location); 127 128 cs = arg_start; 129 const static_probe_ops *spops = probe_linespec_to_static_ops (&cs); 130 if (spops == NULL) 131 error (_("'%s' is not a probe linespec"), arg_start); 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. */ 141 std::string copy (arg, arg_end - arg); 142 arg = ©[0]; 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'; 167 objfile_namestr = arg; 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")); 177 if (objfile_namestr && *objfile_namestr == '\0') 178 error (_("invalid objfile name")); 179 180 std::vector<symtab_and_line> result; 181 if (search_pspace != NULL) 182 { 183 parse_probes_in_pspace (spops, search_pspace, objfile_namestr, 184 provider, name, &result); 185 } 186 else 187 { 188 for (struct program_space *pspace : program_spaces) 189 parse_probes_in_pspace (spops, pspace, objfile_namestr, 190 provider, name, &result); 191 } 192 193 if (result.empty ()) 194 { 195 throw_error (NOT_FOUND_ERROR, 196 _("No probe matching objfile=`%s', provider=`%s', name=`%s'"), 197 objfile_namestr ? objfile_namestr : _("<any>"), 198 provider ? provider : _("<any>"), 199 name); 200 } 201 202 if (canonical) 203 { 204 std::string canon (arg_start, arg_end - arg_start); 205 canonical->special_display = 1; 206 canonical->pre_expanded = 1; 207 canonical->location = new_probe_location (canon.c_str ()); 208 } 209 210 return result; 211 } 212 213 /* See definition in probe.h. */ 214 215 std::vector<probe *> 216 find_probes_in_objfile (struct objfile *objfile, const char *provider, 217 const char *name) 218 { 219 std::vector<probe *> result; 220 221 if (!objfile->sf || !objfile->sf->sym_probe_fns) 222 return result; 223 224 const std::vector<std::unique_ptr<probe>> &probes 225 = objfile->sf->sym_probe_fns->sym_get_probes (objfile); 226 for (auto &p : probes) 227 { 228 if (p->get_provider () != provider) 229 continue; 230 231 if (p->get_name () != name) 232 continue; 233 234 result.push_back (p.get ()); 235 } 236 237 return result; 238 } 239 240 /* See definition in probe.h. */ 241 242 struct bound_probe 243 find_probe_by_pc (CORE_ADDR pc) 244 { 245 struct bound_probe result; 246 247 result.objfile = NULL; 248 result.prob = NULL; 249 250 for (objfile *objfile : current_program_space->objfiles ()) 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. */ 257 const std::vector<std::unique_ptr<probe>> &probes 258 = objfile->sf->sym_probe_fns->sym_get_probes (objfile); 259 for (auto &p : probes) 260 if (p->get_relocated_address (objfile) == pc) 261 { 262 result.objfile = objfile; 263 result.prob = p.get (); 264 return result; 265 } 266 } 267 268 return result; 269 } 270 271 272 273 /* Make a vector of probes matching OBJNAME, PROVIDER, and PROBE_NAME. 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. */ 277 278 static std::vector<bound_probe> 279 collect_probes (const std::string &objname, const std::string &provider, 280 const std::string &probe_name, const static_probe_ops *spops) 281 { 282 std::vector<bound_probe> result; 283 gdb::optional<compiled_regex> obj_pat, prov_pat, probe_pat; 284 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")); 294 295 for (objfile *objfile : current_program_space->objfiles ()) 296 { 297 if (! objfile->sf || ! objfile->sf->sym_probe_fns) 298 continue; 299 300 if (obj_pat) 301 { 302 if (obj_pat->exec (objfile_name (objfile), 0, NULL, 0) != 0) 303 continue; 304 } 305 306 const std::vector<std::unique_ptr<probe>> &probes 307 = objfile->sf->sym_probe_fns->sym_get_probes (objfile); 308 309 for (auto &p : probes) 310 { 311 if (spops != &any_static_probe_ops && p->get_static_ops () != spops) 312 continue; 313 314 if (prov_pat 315 && prov_pat->exec (p->get_provider ().c_str (), 0, NULL, 0) != 0) 316 continue; 317 318 if (probe_pat 319 && probe_pat->exec (p->get_name ().c_str (), 0, NULL, 0) != 0) 320 continue; 321 322 result.emplace_back (p.get (), objfile); 323 } 324 } 325 326 return result; 327 } 328 329 /* A qsort comparison function for bound_probe_s objects. */ 330 331 static bool 332 compare_probes (const bound_probe &a, const bound_probe &b) 333 { 334 int v; 335 336 v = a.prob->get_provider ().compare (b.prob->get_provider ()); 337 if (v != 0) 338 return v < 0; 339 340 v = a.prob->get_name ().compare (b.prob->get_name ()); 341 if (v != 0) 342 return v < 0; 343 344 if (a.prob->get_address () != b.prob->get_address ()) 345 return a.prob->get_address () < b.prob->get_address (); 346 347 return strcmp (objfile_name (a.objfile), objfile_name (b.objfile)) < 0; 348 } 349 350 /* Helper function that generate entries in the ui_out table being 351 crafted by `info_probes_for_ops'. */ 352 353 static void 354 gen_ui_out_table_header_info (const std::vector<bound_probe> &probes, 355 const static_probe_ops *spops) 356 { 357 /* `headings' refers to the names of the columns when printing `info 358 probes'. */ 359 gdb_assert (spops != NULL); 360 361 std::vector<struct info_probe_column> headings 362 = spops->gen_info_probes_table_header (); 363 364 for (const info_probe_column &column : headings) 365 { 366 size_t size_max = strlen (column.print_name); 367 368 for (const bound_probe &probe : probes) 369 { 370 /* `probe_fields' refers to the values of each new field that this 371 probe will display. */ 372 373 if (probe.prob->get_static_ops () != spops) 374 continue; 375 376 std::vector<const char *> probe_fields 377 = probe.prob->gen_info_probes_table_values (); 378 379 gdb_assert (probe_fields.size () == headings.size ()); 380 381 for (const char *val : probe_fields) 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 389 size_max = std::max (strlen (val), size_max); 390 } 391 } 392 393 current_uiout->table_header (size_max, ui_left, 394 column.field_name, column.print_name); 395 } 396 } 397 398 /* Helper function to print not-applicable strings for all the extra 399 columns defined in a static_probe_ops. */ 400 401 static void 402 print_ui_out_not_applicables (const static_probe_ops *spops) 403 { 404 std::vector<struct info_probe_column> headings 405 = spops->gen_info_probes_table_header (); 406 407 for (const info_probe_column &column : headings) 408 current_uiout->field_string (column.field_name, _("n/a")); 409 } 410 411 /* Helper function to print extra information about a probe and an objfile 412 represented by PROBE. */ 413 414 static void 415 print_ui_out_info (probe *probe) 416 { 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. */ 419 gdb_assert (probe != NULL); 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 (); 424 425 gdb_assert (headings.size () == values.size ()); 426 427 for (int ix = 0; ix < headings.size (); ++ix) 428 { 429 struct info_probe_column column = headings[ix]; 430 const char *val = values[ix]; 431 432 if (val == NULL) 433 current_uiout->field_skip (column.field_name); 434 else 435 current_uiout->field_string (column.field_name, val); 436 } 437 } 438 439 /* Helper function that returns the number of extra fields which POPS will 440 need. */ 441 442 static int 443 get_number_extra_fields (const static_probe_ops *spops) 444 { 445 return spops->gen_info_probes_table_header ().size (); 446 } 447 448 /* Helper function that returns true if there is a probe in PROBES 449 featuring the given SPOPS. It returns false otherwise. */ 450 451 static bool 452 exists_probe_with_spops (const std::vector<bound_probe> &probes, 453 const static_probe_ops *spops) 454 { 455 for (const bound_probe &probe : probes) 456 if (probe.prob->get_static_ops () == spops) 457 return true; 458 459 return false; 460 } 461 462 /* Helper function that parses a probe linespec of the form [PROVIDER 463 [PROBE [OBJNAME]]] from the provided string STR. */ 464 465 static void 466 parse_probe_linespec (const char *str, std::string *provider, 467 std::string *probe_name, std::string *objname) 468 { 469 *probe_name = *objname = ""; 470 471 *provider = extract_arg (&str); 472 if (!provider->empty ()) 473 { 474 *probe_name = extract_arg (&str); 475 if (!probe_name->empty ()) 476 *objname = extract_arg (&str); 477 } 478 } 479 480 /* See comment in probe.h. */ 481 482 void 483 info_probes_for_spops (const char *arg, int from_tty, 484 const static_probe_ops *spops) 485 { 486 std::string provider, probe_name, objname; 487 int any_found; 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"); 493 size_t size_type = strlen ("Type"); 494 struct gdbarch *gdbarch = get_current_arch (); 495 496 parse_probe_linespec (arg, &provider, &probe_name, &objname); 497 498 std::vector<bound_probe> probes 499 = collect_probes (objname, provider, probe_name, spops); 500 501 if (spops == &any_static_probe_ops) 502 { 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)) 517 ui_out_extra_fields += get_number_extra_fields (po); 518 } 519 else 520 ui_out_extra_fields = get_number_extra_fields (spops); 521 522 { 523 ui_out_emit_table table_emitter (current_uiout, 524 5 + ui_out_extra_fields, 525 probes.size (), "StaticProbes"); 526 527 std::sort (probes.begin (), probes.end (), compare_probes); 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'). */ 534 for (const bound_probe &probe : probes) 535 { 536 const char *probe_type = probe.prob->get_static_ops ()->type_name (); 537 538 size_type = std::max (strlen (probe_type), size_type); 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); 542 size_objname = std::max (strlen (objfile_name (probe.objfile)), 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 552 if (spops == &any_static_probe_ops) 553 { 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. */ 557 for (const static_probe_ops *po : all_static_probe_ops) 558 if (exists_probe_with_spops (probes, po)) 559 gen_ui_out_table_header_info (probes, po); 560 } 561 else 562 gen_ui_out_table_header_info (probes, spops); 563 564 current_uiout->table_header (size_objname, ui_left, "object", _("Object")); 565 current_uiout->table_body (); 566 567 for (const bound_probe &probe : probes) 568 { 569 const char *probe_type = probe.prob->get_static_ops ()->type_name (); 570 571 ui_out_emit_tuple tuple_emitter (current_uiout, "probe"); 572 573 current_uiout->field_string ("type", probe_type); 574 current_uiout->field_string ("provider", 575 probe.prob->get_provider ().c_str ()); 576 current_uiout->field_string ("name", probe.prob->get_name ().c_str ()); 577 current_uiout->field_core_addr ("addr", probe.prob->get_gdbarch (), 578 probe.prob->get_relocated_address 579 (probe.objfile)); 580 581 if (spops == &any_static_probe_ops) 582 { 583 for (const static_probe_ops *po : all_static_probe_ops) 584 { 585 if (probe.prob->get_static_ops () == po) 586 print_ui_out_info (probe.prob); 587 else if (exists_probe_with_spops (probes, po)) 588 print_ui_out_not_applicables (po); 589 } 590 } 591 else 592 print_ui_out_info (probe.prob); 593 594 current_uiout->field_string ("object", 595 objfile_name (probe.objfile)); 596 current_uiout->text ("\n"); 597 } 598 599 any_found = !probes.empty (); 600 } 601 602 if (!any_found) 603 current_uiout->message (_("No probes matched.\n")); 604 } 605 606 /* Implementation of the `info probes' command. */ 607 608 static void 609 info_probes_command (const char *arg, int from_tty) 610 { 611 info_probes_for_spops (arg, from_tty, &any_static_probe_ops); 612 } 613 614 /* Implementation of the `enable probes' command. */ 615 616 static void 617 enable_probes_command (const char *arg, int from_tty) 618 { 619 std::string provider, probe_name, objname; 620 621 parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname); 622 623 std::vector<bound_probe> probes 624 = collect_probes (objname, provider, probe_name, &any_static_probe_ops); 625 if (probes.empty ()) 626 { 627 current_uiout->message (_("No probes matched.\n")); 628 return; 629 } 630 631 /* Enable the selected probes, provided their backends support the 632 notion of enabling a probe. */ 633 for (const bound_probe &probe: probes) 634 { 635 if (probe.prob->get_static_ops ()->can_enable ()) 636 { 637 probe.prob->enable (); 638 current_uiout->message (_("Probe %s:%s enabled.\n"), 639 probe.prob->get_provider ().c_str (), 640 probe.prob->get_name ().c_str ()); 641 } 642 else 643 current_uiout->message (_("Probe %s:%s cannot be enabled.\n"), 644 probe.prob->get_provider ().c_str (), 645 probe.prob->get_name ().c_str ()); 646 } 647 } 648 649 /* Implementation of the `disable probes' command. */ 650 651 static void 652 disable_probes_command (const char *arg, int from_tty) 653 { 654 std::string provider, probe_name, objname; 655 656 parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname); 657 658 std::vector<bound_probe> probes 659 = collect_probes (objname, provider, probe_name, &any_static_probe_ops); 660 if (probes.empty ()) 661 { 662 current_uiout->message (_("No probes matched.\n")); 663 return; 664 } 665 666 /* Disable the selected probes, provided their backends support the 667 notion of enabling a probe. */ 668 for (const bound_probe &probe : probes) 669 { 670 if (probe.prob->get_static_ops ()->can_enable ()) 671 { 672 probe.prob->disable (); 673 current_uiout->message (_("Probe %s:%s disabled.\n"), 674 probe.prob->get_provider ().c_str (), 675 probe.prob->get_name ().c_str ()); 676 } 677 else 678 current_uiout->message (_("Probe %s:%s cannot be disabled.\n"), 679 probe.prob->get_provider ().c_str (), 680 probe.prob->get_name ().c_str ()); 681 } 682 } 683 684 /* See comments in probe.h. */ 685 686 struct value * 687 probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n) 688 { 689 struct bound_probe probe; 690 unsigned n_args; 691 692 probe = find_probe_by_pc (get_frame_pc (frame)); 693 if (!probe.prob) 694 return NULL; 695 696 n_args = probe.prob->get_argument_count (get_frame_arch (frame)); 697 if (n >= n_args) 698 return NULL; 699 700 return probe.prob->evaluate_argument (n, frame); 701 } 702 703 /* See comment in probe.h. */ 704 705 const struct static_probe_ops * 706 probe_linespec_to_static_ops (const char **linespecp) 707 { 708 for (const static_probe_ops *ops : all_static_probe_ops) 709 if (ops->is_linespec (linespecp)) 710 return ops; 711 712 return NULL; 713 } 714 715 /* See comment in probe.h. */ 716 717 int 718 probe_is_linespec_by_keyword (const char **linespecp, const char *const *keywords) 719 { 720 const char *s = *linespecp; 721 const char *const *csp; 722 723 for (csp = keywords; *csp; csp++) 724 { 725 const char *keyword = *csp; 726 size_t len = strlen (keyword); 727 728 if (strncmp (s, keyword, len) == 0 && isspace (s[len])) 729 { 730 *linespecp += len + 1; 731 return 1; 732 } 733 } 734 735 return 0; 736 } 737 738 /* Implementation of `is_linespec' method. */ 739 740 bool 741 any_static_probe_ops::is_linespec (const char **linespecp) const 742 { 743 static const char *const keywords[] = { "-p", "-probe", NULL }; 744 745 return probe_is_linespec_by_keyword (linespecp, keywords); 746 } 747 748 /* Implementation of 'get_probes' method. */ 749 750 void 751 any_static_probe_ops::get_probes (std::vector<std::unique_ptr<probe>> *probesp, 752 struct objfile *objfile) const 753 { 754 /* No probes can be provided by this dummy backend. */ 755 } 756 757 /* Implementation of the 'type_name' method. */ 758 759 const char * 760 any_static_probe_ops::type_name () const 761 { 762 return NULL; 763 } 764 765 /* Implementation of the 'gen_info_probes_table_header' method. */ 766 767 std::vector<struct info_probe_column> 768 any_static_probe_ops::gen_info_probes_table_header () const 769 { 770 return std::vector<struct info_probe_column> (); 771 } 772 773 /* See comments in probe.h. */ 774 775 struct cmd_list_element ** 776 info_probes_cmdlist_get (void) 777 { 778 static struct cmd_list_element *info_probes_cmdlist; 779 780 if (info_probes_cmdlist == NULL) 781 add_prefix_cmd ("probes", class_info, info_probes_command, 782 _("\ 783 Show available static probes.\n\ 784 Usage: info probes [all|TYPE [ARGS]]\n\ 785 TYPE specifies the type of the probe, and can be one of the following:\n\ 786 - stap\n\ 787 If you specify TYPE, there may be additional arguments needed by the\n\ 788 subcommand.\n\ 789 If you do not specify any argument, or specify `all', then the command\n\ 790 will show information about all types of probes."), 791 &info_probes_cmdlist, "info probes ", 792 0/*allow-unknown*/, &infolist); 793 794 return &info_probes_cmdlist; 795 } 796 797 798 799 /* This is called to compute the value of one of the $_probe_arg* 800 convenience variables. */ 801 802 static struct value * 803 compute_probe_arg (struct gdbarch *arch, struct internalvar *ivar, 804 void *data) 805 { 806 struct frame_info *frame = get_selected_frame (_("No frame selected")); 807 CORE_ADDR pc = get_frame_pc (frame); 808 int sel = (int) (uintptr_t) data; 809 struct bound_probe pc_probe; 810 unsigned n_args; 811 812 /* SEL == -1 means "_probe_argc". */ 813 gdb_assert (sel >= -1); 814 815 pc_probe = find_probe_by_pc (pc); 816 if (pc_probe.prob == NULL) 817 error (_("No probe at PC %s"), core_addr_to_string (pc)); 818 819 n_args = pc_probe.prob->get_argument_count (arch); 820 if (sel == -1) 821 return value_from_longest (builtin_type (arch)->builtin_int, n_args); 822 823 if (sel >= n_args) 824 error (_("Invalid probe argument %d -- probe has %u arguments available"), 825 sel, n_args); 826 827 return pc_probe.prob->evaluate_argument (sel, frame); 828 } 829 830 /* This is called to compile one of the $_probe_arg* convenience 831 variables into an agent expression. */ 832 833 static void 834 compile_probe_arg (struct internalvar *ivar, struct agent_expr *expr, 835 struct axs_value *value, void *data) 836 { 837 CORE_ADDR pc = expr->scope; 838 int sel = (int) (uintptr_t) data; 839 struct bound_probe pc_probe; 840 int n_args; 841 842 /* SEL == -1 means "_probe_argc". */ 843 gdb_assert (sel >= -1); 844 845 pc_probe = find_probe_by_pc (pc); 846 if (pc_probe.prob == NULL) 847 error (_("No probe at PC %s"), core_addr_to_string (pc)); 848 849 n_args = pc_probe.prob->get_argument_count (expr->gdbarch); 850 851 if (sel == -1) 852 { 853 value->kind = axs_rvalue; 854 value->type = builtin_type (expr->gdbarch)->builtin_int; 855 ax_const_l (expr, n_args); 856 return; 857 } 858 859 gdb_assert (sel >= 0); 860 if (sel >= n_args) 861 error (_("Invalid probe argument %d -- probe has %d arguments available"), 862 sel, n_args); 863 864 pc_probe.prob->compile_to_ax (expr, value, sel); 865 } 866 867 static const struct internalvar_funcs probe_funcs = 868 { 869 compute_probe_arg, 870 compile_probe_arg, 871 NULL 872 }; 873 874 875 std::vector<const static_probe_ops *> all_static_probe_ops; 876 877 void _initialize_probe (); 878 void 879 _initialize_probe () 880 { 881 all_static_probe_ops.push_back (&any_static_probe_ops); 882 883 create_internalvar_type_lazy ("_probe_argc", &probe_funcs, 884 (void *) (uintptr_t) -1); 885 create_internalvar_type_lazy ("_probe_arg0", &probe_funcs, 886 (void *) (uintptr_t) 0); 887 create_internalvar_type_lazy ("_probe_arg1", &probe_funcs, 888 (void *) (uintptr_t) 1); 889 create_internalvar_type_lazy ("_probe_arg2", &probe_funcs, 890 (void *) (uintptr_t) 2); 891 create_internalvar_type_lazy ("_probe_arg3", &probe_funcs, 892 (void *) (uintptr_t) 3); 893 create_internalvar_type_lazy ("_probe_arg4", &probe_funcs, 894 (void *) (uintptr_t) 4); 895 create_internalvar_type_lazy ("_probe_arg5", &probe_funcs, 896 (void *) (uintptr_t) 5); 897 create_internalvar_type_lazy ("_probe_arg6", &probe_funcs, 898 (void *) (uintptr_t) 6); 899 create_internalvar_type_lazy ("_probe_arg7", &probe_funcs, 900 (void *) (uintptr_t) 7); 901 create_internalvar_type_lazy ("_probe_arg8", &probe_funcs, 902 (void *) (uintptr_t) 8); 903 create_internalvar_type_lazy ("_probe_arg9", &probe_funcs, 904 (void *) (uintptr_t) 9); 905 create_internalvar_type_lazy ("_probe_arg10", &probe_funcs, 906 (void *) (uintptr_t) 10); 907 create_internalvar_type_lazy ("_probe_arg11", &probe_funcs, 908 (void *) (uintptr_t) 11); 909 910 add_cmd ("all", class_info, info_probes_command, 911 _("\ 912 Show information about all type of probes."), 913 info_probes_cmdlist_get ()); 914 915 add_cmd ("probes", class_breakpoint, enable_probes_command, _("\ 916 Enable probes.\n\ 917 Usage: enable probes [PROVIDER [NAME [OBJECT]]]\n\ 918 Each argument is a regular expression, used to select probes.\n\ 919 PROVIDER matches probe provider names.\n\ 920 NAME matches the probe names.\n\ 921 OBJECT matches the executable or shared library name.\n\ 922 If you do not specify any argument then the command will enable\n\ 923 all defined probes."), 924 &enablelist); 925 926 add_cmd ("probes", class_breakpoint, disable_probes_command, _("\ 927 Disable probes.\n\ 928 Usage: disable probes [PROVIDER [NAME [OBJECT]]]\n\ 929 Each argument is a regular expression, used to select probes.\n\ 930 PROVIDER matches probe provider names.\n\ 931 NAME matches the probe names.\n\ 932 OBJECT matches the executable or shared library name.\n\ 933 If you do not specify any argument then the command will disable\n\ 934 all defined probes."), 935 &disablelist); 936 937 } 938