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