1343171Sdim/* Annotation routines for GDB. 2343171Sdim Copyright (C) 1986-2020 Free Software Foundation, Inc. 3343171Sdim 4353358Sdim This file is part of GDB. 5353358Sdim 6353358Sdim This program is free software; you can redistribute it and/or modify 7343171Sdim it under the terms of the GNU General Public License as published by 8343171Sdim the Free Software Foundation; either version 3 of the License, or 9343171Sdim (at your option) any later version. 10343171Sdim 11343171Sdim This program is distributed in the hope that it will be useful, 12343171Sdim but WITHOUT ANY WARRANTY; without even the implied warranty of 13343171Sdim MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14343171Sdim GNU General Public License for more details. 15343171Sdim 16343171Sdim You should have received a copy of the GNU General Public License 17343171Sdim along with this program. If not, see <http://www.gnu.org/licenses/>. */ 18343171Sdim 19343171Sdim#include "defs.h" 20343171Sdim#include "annotate.h" 21343171Sdim#include "value.h" 22343171Sdim#include "target.h" 23343171Sdim#include "gdbtypes.h" 24343171Sdim#include "breakpoint.h" 25343171Sdim#include "observable.h" 26343171Sdim#include "inferior.h" 27343171Sdim#include "infrun.h" 28343171Sdim#include "top.h" 29343171Sdim#include "source.h" 30343171Sdim#include "objfiles.h" 31343171Sdim#include "source-cache.h" 32343171Sdim 33343171Sdim 34343171Sdim/* Prototypes for local functions. */ 35343171Sdim 36343171Sdimstatic void print_value_flags (struct type *); 37343171Sdim 38343171Sdimstatic void breakpoint_changed (struct breakpoint *b); 39343171Sdim 40343171Sdim 41343171Sdimvoid (*deprecated_annotate_signalled_hook) (void); 42343171Sdimvoid (*deprecated_annotate_signal_hook) (void); 43343171Sdim 44343171Sdim/* Booleans indicating whether we've emitted certain notifications. 45343171Sdim Used to suppress useless repeated notifications until the next time 46343171Sdim we're ready to accept more commands. Reset whenever a prompt is 47343171Sdim displayed. */ 48343171Sdimstatic int frames_invalid_emitted; 49343171Sdimstatic int breakpoints_invalid_emitted; 50343171Sdim 51343171Sdimstatic void 52343171Sdimprint_value_flags (struct type *t) 53343171Sdim{ 54343171Sdim if (can_dereference (t)) 55343171Sdim printf_filtered (("*")); 56343171Sdim else 57343171Sdim printf_filtered (("-")); 58343171Sdim} 59343171Sdim 60343171Sdimstatic void 61343171Sdimannotate_breakpoints_invalid (void) 62343171Sdim{ 63343171Sdim if (annotation_level == 2 64343171Sdim && (!breakpoints_invalid_emitted 65343171Sdim || current_ui->prompt_state != PROMPT_BLOCKED)) 66343171Sdim { 67360784Sdim target_terminal::scoped_restore_terminal_state term_state; 68343171Sdim target_terminal::ours_for_output (); 69343171Sdim 70343171Sdim printf_unfiltered (("\n\032\032breakpoints-invalid\n")); 71343171Sdim breakpoints_invalid_emitted = 1; 72343171Sdim } 73343171Sdim} 74343171Sdim 75343171Sdimvoid 76343171Sdimannotate_breakpoint (int num) 77343171Sdim{ 78360784Sdim if (annotation_level > 1) 79360784Sdim printf_filtered (("\n\032\032breakpoint %d\n"), num); 80343171Sdim} 81343171Sdim 82343171Sdimvoid 83343171Sdimannotate_catchpoint (int num) 84343171Sdim{ 85343171Sdim if (annotation_level > 1) 86343171Sdim printf_filtered (("\n\032\032catchpoint %d\n"), num); 87343171Sdim} 88343171Sdim 89343171Sdimvoid 90343171Sdimannotate_watchpoint (int num) 91343171Sdim{ 92343171Sdim if (annotation_level > 1) 93343171Sdim printf_filtered (("\n\032\032watchpoint %d\n"), num); 94343171Sdim} 95343171Sdim 96343171Sdimvoid 97343171Sdimannotate_starting (void) 98360784Sdim{ 99360784Sdim if (annotation_level > 1) 100360784Sdim printf_filtered (("\n\032\032starting\n")); 101343171Sdim} 102343171Sdim 103343171Sdimvoid 104343171Sdimannotate_stopped (void) 105343171Sdim{ 106343171Sdim if (annotation_level > 1) 107343171Sdim printf_filtered (("\n\032\032stopped\n")); 108343171Sdim} 109343171Sdim 110343171Sdimvoid 111343171Sdimannotate_exited (int exitstatus) 112343171Sdim{ 113343171Sdim if (annotation_level > 1) 114343171Sdim printf_filtered (("\n\032\032exited %d\n"), exitstatus); 115343171Sdim} 116343171Sdim 117343171Sdimvoid 118343171Sdimannotate_signalled (void) 119343171Sdim{ 120343171Sdim if (deprecated_annotate_signalled_hook) 121343171Sdim deprecated_annotate_signalled_hook (); 122343171Sdim 123343171Sdim if (annotation_level > 1) 124360784Sdim printf_filtered (("\n\032\032signalled\n")); 125360784Sdim} 126343171Sdim 127343171Sdimvoid 128343171Sdimannotate_signal_name (void) 129343171Sdim{ 130343171Sdim if (annotation_level == 2) 131360784Sdim printf_filtered (("\n\032\032signal-name\n")); 132343171Sdim} 133343171Sdim 134343171Sdimvoid 135343171Sdimannotate_signal_name_end (void) 136343171Sdim{ 137343171Sdim if (annotation_level == 2) 138343171Sdim printf_filtered (("\n\032\032signal-name-end\n")); 139343171Sdim} 140343171Sdim 141343171Sdimvoid 142343171Sdimannotate_signal_string (void) 143343171Sdim{ 144343171Sdim if (annotation_level == 2) 145343171Sdim printf_filtered (("\n\032\032signal-string\n")); 146343171Sdim} 147343171Sdim 148343171Sdimvoid 149343171Sdimannotate_signal_string_end (void) 150343171Sdim{ 151343171Sdim if (annotation_level == 2) 152343171Sdim printf_filtered (("\n\032\032signal-string-end\n")); 153343171Sdim} 154343171Sdim 155343171Sdimvoid 156343171Sdimannotate_signal (void) 157343171Sdim{ 158343171Sdim if (deprecated_annotate_signal_hook) 159343171Sdim deprecated_annotate_signal_hook (); 160343171Sdim 161343171Sdim if (annotation_level > 1) 162343171Sdim printf_filtered (("\n\032\032signal\n")); 163343171Sdim} 164343171Sdim 165343171Sdimvoid 166343171Sdimannotate_breakpoints_headers (void) 167343171Sdim{ 168343171Sdim if (annotation_level == 2) 169343171Sdim printf_filtered (("\n\032\032breakpoints-headers\n")); 170343171Sdim} 171343171Sdim 172343171Sdimvoid 173343171Sdimannotate_field (int num) 174343171Sdim{ 175343171Sdim if (annotation_level == 2) 176343171Sdim printf_filtered (("\n\032\032field %d\n"), num); 177343171Sdim} 178343171Sdim 179343171Sdimvoid 180343171Sdimannotate_breakpoints_table (void) 181343171Sdim{ 182343171Sdim if (annotation_level == 2) 183343171Sdim printf_filtered (("\n\032\032breakpoints-table\n")); 184343171Sdim} 185343171Sdim 186343171Sdimvoid 187343171Sdimannotate_record (void) 188343171Sdim{ 189343171Sdim if (annotation_level == 2) 190343171Sdim printf_filtered (("\n\032\032record\n")); 191343171Sdim} 192343171Sdim 193343171Sdimvoid 194343171Sdimannotate_breakpoints_table_end (void) 195343171Sdim{ 196343171Sdim if (annotation_level == 2) 197343171Sdim printf_filtered (("\n\032\032breakpoints-table-end\n")); 198343171Sdim} 199343171Sdim 200343171Sdimvoid 201343171Sdimannotate_frames_invalid (void) 202343171Sdim{ 203343171Sdim if (annotation_level == 2 204343171Sdim && (!frames_invalid_emitted 205343171Sdim || current_ui->prompt_state != PROMPT_BLOCKED)) 206360784Sdim { 207360784Sdim target_terminal::scoped_restore_terminal_state term_state; 208360784Sdim target_terminal::ours_for_output (); 209360784Sdim 210343171Sdim printf_unfiltered (("\n\032\032frames-invalid\n")); 211343171Sdim frames_invalid_emitted = 1; 212343171Sdim } 213343171Sdim} 214343171Sdim 215343171Sdimvoid 216343171Sdimannotate_new_thread (void) 217343171Sdim{ 218343171Sdim if (annotation_level > 1) 219360784Sdim { 220360784Sdim printf_unfiltered (("\n\032\032new-thread\n")); 221343171Sdim } 222360784Sdim} 223343171Sdim 224343171Sdimvoid 225343171Sdimannotate_thread_changed (void) 226343171Sdim{ 227343171Sdim if (annotation_level > 1) 228343171Sdim { 229343171Sdim printf_unfiltered (("\n\032\032thread-changed\n")); 230343171Sdim } 231343171Sdim} 232343171Sdim 233343171Sdim/* Emit notification on thread exit. */ 234343171Sdim 235343171Sdimstatic void 236343171Sdimannotate_thread_exited (struct thread_info *t, int silent) 237343171Sdim{ 238343171Sdim if (annotation_level > 1) 239343171Sdim { 240343171Sdim printf_filtered(("\n\032\032thread-exited," 241343171Sdim "id=\"%d\",group-id=\"i%d\"\n"), 242343171Sdim t->global_num, t->inf->num); 243343171Sdim } 244343171Sdim} 245343171Sdim 246343171Sdimvoid 247343171Sdimannotate_field_begin (struct type *type) 248343171Sdim{ 249343171Sdim if (annotation_level == 2) 250343171Sdim { 251343171Sdim printf_filtered (("\n\032\032field-begin ")); 252343171Sdim print_value_flags (type); 253343171Sdim printf_filtered (("\n")); 254343171Sdim } 255343171Sdim} 256343171Sdim 257343171Sdimvoid 258343171Sdimannotate_field_name_end (void) 259343171Sdim{ 260343171Sdim if (annotation_level == 2) 261343171Sdim printf_filtered (("\n\032\032field-name-end\n")); 262360784Sdim} 263360784Sdim 264343171Sdimvoid 265343171Sdimannotate_field_value (void) 266343171Sdim{ 267343171Sdim if (annotation_level == 2) 268343171Sdim printf_filtered (("\n\032\032field-value\n")); 269343171Sdim} 270343171Sdim 271343171Sdimvoid 272343171Sdimannotate_field_end (void) 273343171Sdim{ 274343171Sdim if (annotation_level == 2) 275343171Sdim printf_filtered (("\n\032\032field-end\n")); 276343171Sdim} 277343171Sdim 278343171Sdimvoid 279343171Sdimannotate_quit (void) 280343171Sdim{ 281343171Sdim if (annotation_level > 1) 282343171Sdim printf_filtered (("\n\032\032quit\n")); 283343171Sdim} 284343171Sdim 285343171Sdimvoid 286360784Sdimannotate_error (void) 287360784Sdim{ 288360784Sdim if (annotation_level > 1) 289343171Sdim printf_filtered (("\n\032\032error\n")); 290343171Sdim} 291343171Sdim 292343171Sdimvoid 293343171Sdimannotate_error_begin (void) 294343171Sdim{ 295343171Sdim if (annotation_level > 1) 296343171Sdim fprintf_filtered (gdb_stderr, "\n\032\032error-begin\n"); 297343171Sdim} 298343171Sdim 299343171Sdimvoid 300343171Sdimannotate_value_history_begin (int histindex, struct type *type) 301343171Sdim{ 302343171Sdim if (annotation_level == 2) 303343171Sdim { 304343171Sdim printf_filtered (("\n\032\032value-history-begin %d "), histindex); 305343171Sdim print_value_flags (type); 306343171Sdim printf_filtered (("\n")); 307343171Sdim } 308343171Sdim} 309343171Sdim 310343171Sdimvoid 311343171Sdimannotate_value_begin (struct type *type) 312343171Sdim{ 313343171Sdim if (annotation_level == 2) 314343171Sdim { 315343171Sdim printf_filtered (("\n\032\032value-begin ")); 316343171Sdim print_value_flags (type); 317343171Sdim printf_filtered (("\n")); 318343171Sdim } 319343171Sdim} 320343171Sdim 321343171Sdimvoid 322343171Sdimannotate_value_history_value (void) 323343171Sdim{ 324343171Sdim if (annotation_level == 2) 325343171Sdim printf_filtered (("\n\032\032value-history-value\n")); 326343171Sdim} 327343171Sdim 328343171Sdimvoid 329343171Sdimannotate_value_history_end (void) 330343171Sdim{ 331343171Sdim if (annotation_level == 2) 332343171Sdim printf_filtered (("\n\032\032value-history-end\n")); 333343171Sdim} 334360784Sdim 335343171Sdimvoid 336343171Sdimannotate_value_end (void) 337343171Sdim{ 338343171Sdim if (annotation_level == 2) 339343171Sdim printf_filtered (("\n\032\032value-end\n")); 340343171Sdim} 341343171Sdim 342343171Sdimvoid 343360784Sdimannotate_display_begin (void) 344343171Sdim{ 345343171Sdim if (annotation_level == 2) 346343171Sdim printf_filtered (("\n\032\032display-begin\n")); 347360784Sdim} 348343171Sdim 349343171Sdimvoid 350343171Sdimannotate_display_number_end (void) 351343171Sdim{ 352343171Sdim if (annotation_level == 2) 353343171Sdim printf_filtered (("\n\032\032display-number-end\n")); 354343171Sdim} 355343171Sdim 356343171Sdimvoid 357343171Sdimannotate_display_format (void) 358343171Sdim{ 359343171Sdim if (annotation_level == 2) 360343171Sdim printf_filtered (("\n\032\032display-format\n")); 361343171Sdim} 362343171Sdim 363343171Sdimvoid 364343171Sdimannotate_display_expression (void) 365343171Sdim{ 366360784Sdim if (annotation_level == 2) 367360784Sdim printf_filtered (("\n\032\032display-expression\n")); 368360784Sdim} 369360784Sdim 370360784Sdimvoid 371360784Sdimannotate_display_expression_end (void) 372360784Sdim{ 373343171Sdim if (annotation_level == 2) 374343171Sdim printf_filtered (("\n\032\032display-expression-end\n")); 375343171Sdim} 376343171Sdim 377343171Sdimvoid 378343171Sdimannotate_display_value (void) 379343171Sdim{ 380343171Sdim if (annotation_level == 2) 381343171Sdim printf_filtered (("\n\032\032display-value\n")); 382343171Sdim} 383343171Sdim 384343171Sdimvoid 385343171Sdimannotate_display_end (void) 386343171Sdim{ 387343171Sdim if (annotation_level == 2) 388343171Sdim printf_filtered (("\n\032\032display-end\n")); 389343171Sdim} 390343171Sdim 391343171Sdimvoid 392343171Sdimannotate_arg_begin (void) 393343171Sdim{ 394343171Sdim if (annotation_level == 2) 395343171Sdim printf_filtered (("\n\032\032arg-begin\n")); 396343171Sdim} 397343171Sdim 398343171Sdimvoid 399343171Sdimannotate_arg_name_end (void) 400343171Sdim{ 401343171Sdim if (annotation_level == 2) 402343171Sdim printf_filtered (("\n\032\032arg-name-end\n")); 403343171Sdim} 404343171Sdim 405343171Sdimvoid 406343171Sdimannotate_arg_value (struct type *type) 407343171Sdim{ 408343171Sdim if (annotation_level == 2) 409343171Sdim { 410 printf_filtered (("\n\032\032arg-value ")); 411 print_value_flags (type); 412 printf_filtered (("\n")); 413 } 414} 415 416void 417annotate_arg_end (void) 418{ 419 if (annotation_level == 2) 420 printf_filtered (("\n\032\032arg-end\n")); 421} 422 423static void 424annotate_source (const char *filename, int line, int character, int mid, 425 struct gdbarch *gdbarch, CORE_ADDR pc) 426{ 427 if (annotation_level > 1) 428 printf_filtered (("\n\032\032source ")); 429 else 430 printf_filtered (("\032\032")); 431 432 printf_filtered (("%s:%d:%d:%s:%s\n"), filename, line, character, 433 mid ? "middle" : "beg", paddress (gdbarch, pc)); 434} 435 436/* See annotate.h. */ 437 438bool 439annotate_source_line (struct symtab *s, int line, int mid_statement, 440 CORE_ADDR pc) 441{ 442 if (annotation_level > 0) 443 { 444 const std::vector<off_t> *offsets; 445 if (!g_source_cache.get_line_charpos (s, &offsets)) 446 return false; 447 if (line > offsets->size ()) 448 return false; 449 450 annotate_source (s->fullname, line, (int) (*offsets)[line - 1], 451 mid_statement, SYMTAB_OBJFILE (s)->arch (), 452 pc); 453 454 /* Update the current symtab and line. */ 455 symtab_and_line sal; 456 sal.pspace = SYMTAB_PSPACE (s); 457 sal.symtab = s; 458 sal.line = line; 459 set_current_source_symtab_and_line (sal); 460 461 return true; 462 } 463 464 return false; 465} 466 467 468void 469annotate_frame_begin (int level, struct gdbarch *gdbarch, CORE_ADDR pc) 470{ 471 if (annotation_level > 1) 472 printf_filtered (("\n\032\032frame-begin %d %s\n"), 473 level, paddress (gdbarch, pc)); 474} 475 476void 477annotate_function_call (void) 478{ 479 if (annotation_level == 2) 480 printf_filtered (("\n\032\032function-call\n")); 481} 482 483void 484annotate_signal_handler_caller (void) 485{ 486 if (annotation_level == 2) 487 printf_filtered (("\n\032\032signal-handler-caller\n")); 488} 489 490void 491annotate_frame_address (void) 492{ 493 if (annotation_level == 2) 494 printf_filtered (("\n\032\032frame-address\n")); 495} 496 497void 498annotate_frame_address_end (void) 499{ 500 if (annotation_level == 2) 501 printf_filtered (("\n\032\032frame-address-end\n")); 502} 503 504void 505annotate_frame_function_name (void) 506{ 507 if (annotation_level == 2) 508 printf_filtered (("\n\032\032frame-function-name\n")); 509} 510 511void 512annotate_frame_args (void) 513{ 514 if (annotation_level == 2) 515 printf_filtered (("\n\032\032frame-args\n")); 516} 517 518void 519annotate_frame_source_begin (void) 520{ 521 if (annotation_level == 2) 522 printf_filtered (("\n\032\032frame-source-begin\n")); 523} 524 525void 526annotate_frame_source_file (void) 527{ 528 if (annotation_level == 2) 529 printf_filtered (("\n\032\032frame-source-file\n")); 530} 531 532void 533annotate_frame_source_file_end (void) 534{ 535 if (annotation_level == 2) 536 printf_filtered (("\n\032\032frame-source-file-end\n")); 537} 538 539void 540annotate_frame_source_line (void) 541{ 542 if (annotation_level == 2) 543 printf_filtered (("\n\032\032frame-source-line\n")); 544} 545 546void 547annotate_frame_source_end (void) 548{ 549 if (annotation_level == 2) 550 printf_filtered (("\n\032\032frame-source-end\n")); 551} 552 553void 554annotate_frame_where (void) 555{ 556 if (annotation_level == 2) 557 printf_filtered (("\n\032\032frame-where\n")); 558} 559 560void 561annotate_frame_end (void) 562{ 563 if (annotation_level == 2) 564 printf_filtered (("\n\032\032frame-end\n")); 565} 566 567void 568annotate_array_section_begin (int idx, struct type *elttype) 569{ 570 if (annotation_level == 2) 571 { 572 printf_filtered (("\n\032\032array-section-begin %d "), idx); 573 print_value_flags (elttype); 574 printf_filtered (("\n")); 575 } 576} 577 578void 579annotate_elt_rep (unsigned int repcount) 580{ 581 if (annotation_level == 2) 582 printf_filtered (("\n\032\032elt-rep %u\n"), repcount); 583} 584 585void 586annotate_elt_rep_end (void) 587{ 588 if (annotation_level == 2) 589 printf_filtered (("\n\032\032elt-rep-end\n")); 590} 591 592void 593annotate_elt (void) 594{ 595 if (annotation_level == 2) 596 printf_filtered (("\n\032\032elt\n")); 597} 598 599void 600annotate_array_section_end (void) 601{ 602 if (annotation_level == 2) 603 printf_filtered (("\n\032\032array-section-end\n")); 604} 605 606/* Called when GDB is about to display the prompt. Used to reset 607 annotation suppression whenever we're ready to accept new 608 frontend/user commands. */ 609 610void 611annotate_display_prompt (void) 612{ 613 frames_invalid_emitted = 0; 614 breakpoints_invalid_emitted = 0; 615} 616 617static void 618breakpoint_changed (struct breakpoint *b) 619{ 620 if (b->number <= 0) 621 return; 622 623 annotate_breakpoints_invalid (); 624} 625 626void _initialize_annotate (); 627void 628_initialize_annotate () 629{ 630 gdb::observers::breakpoint_created.attach (breakpoint_changed); 631 gdb::observers::breakpoint_deleted.attach (breakpoint_changed); 632 gdb::observers::breakpoint_modified.attach (breakpoint_changed); 633 gdb::observers::thread_exit.attach (annotate_thread_exited); 634} 635