1 /* MI Interpreter Definitions and Commands for GDB, the GNU debugger. 2 3 Copyright (C) 2002-2023 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 22 #include "mi-interp.h" 23 24 #include "interps.h" 25 #include "event-top.h" 26 #include "gdbsupport/event-loop.h" 27 #include "inferior.h" 28 #include "infrun.h" 29 #include "ui-out.h" 30 #include "top.h" 31 #include "mi-main.h" 32 #include "mi-cmds.h" 33 #include "mi-out.h" 34 #include "mi-console.h" 35 #include "mi-common.h" 36 #include "observable.h" 37 #include "gdbthread.h" 38 #include "solist.h" 39 #include "objfiles.h" 40 #include "tracepoint.h" 41 #include "cli-out.h" 42 #include "thread-fsm.h" 43 #include "cli/cli-interp.h" 44 #include "gdbsupport/scope-exit.h" 45 46 /* These are the interpreter setup, etc. functions for the MI 47 interpreter. */ 48 49 static void mi_execute_command_wrapper (const char *cmd); 50 static void mi_execute_command_input_handler 51 (gdb::unique_xmalloc_ptr<char> &&cmd); 52 53 /* These are hooks that we put in place while doing interpreter_exec 54 so we can report interesting things that happened "behind the MI's 55 back" in this command. */ 56 57 static int mi_interp_query_hook (const char *ctlstr, va_list ap) 58 ATTRIBUTE_PRINTF (1, 0); 59 60 static void mi_insert_notify_hooks (void); 61 static void mi_remove_notify_hooks (void); 62 63 static void mi_on_signal_received (enum gdb_signal siggnal); 64 static void mi_on_end_stepping_range (void); 65 static void mi_on_signal_exited (enum gdb_signal siggnal); 66 static void mi_on_exited (int exitstatus); 67 static void mi_on_normal_stop (struct bpstat *bs, int print_frame); 68 static void mi_on_no_history (void); 69 70 static void mi_new_thread (struct thread_info *t); 71 static void mi_thread_exit (struct thread_info *t, int silent); 72 static void mi_record_changed (struct inferior*, int, const char *, 73 const char *); 74 static void mi_inferior_added (struct inferior *inf); 75 static void mi_inferior_appeared (struct inferior *inf); 76 static void mi_inferior_exit (struct inferior *inf); 77 static void mi_inferior_removed (struct inferior *inf); 78 static void mi_on_resume (ptid_t ptid); 79 static void mi_solib_loaded (struct so_list *solib); 80 static void mi_solib_unloaded (struct so_list *solib); 81 static void mi_about_to_proceed (void); 82 static void mi_traceframe_changed (int tfnum, int tpnum); 83 static void mi_tsv_created (const struct trace_state_variable *tsv); 84 static void mi_tsv_deleted (const struct trace_state_variable *tsv); 85 static void mi_tsv_modified (const struct trace_state_variable *tsv); 86 static void mi_breakpoint_created (struct breakpoint *b); 87 static void mi_breakpoint_deleted (struct breakpoint *b); 88 static void mi_breakpoint_modified (struct breakpoint *b); 89 static void mi_command_param_changed (const char *param, const char *value); 90 static void mi_memory_changed (struct inferior *inf, CORE_ADDR memaddr, 91 ssize_t len, const bfd_byte *myaddr); 92 static void mi_on_sync_execution_done (void); 93 94 /* Display the MI prompt. */ 95 96 static void 97 display_mi_prompt (struct mi_interp *mi) 98 { 99 struct ui *ui = current_ui; 100 101 gdb_puts ("(gdb) \n", mi->raw_stdout); 102 gdb_flush (mi->raw_stdout); 103 ui->prompt_state = PROMPTED; 104 } 105 106 /* Returns the INTERP's data cast as mi_interp if INTERP is an MI, and 107 returns NULL otherwise. */ 108 109 static struct mi_interp * 110 as_mi_interp (struct interp *interp) 111 { 112 return dynamic_cast<mi_interp *> (interp); 113 } 114 115 /* Observer for the command_error notification. */ 116 117 static void 118 mi_on_command_error () 119 { 120 mi_interp *mi = as_mi_interp (top_level_interpreter ()); 121 if (mi != nullptr) 122 display_mi_prompt (mi); 123 } 124 125 void 126 mi_interp::init (bool top_level) 127 { 128 mi_interp *mi = this; 129 130 /* Store the current output channel, so that we can create a console 131 channel that encapsulates and prefixes all gdb_output-type bits 132 coming from the rest of the debugger. */ 133 mi->raw_stdout = gdb_stdout; 134 135 /* Create MI console channels, each with a different prefix so they 136 can be distinguished. */ 137 mi->out = new mi_console_file (mi->raw_stdout, "~", '"'); 138 mi->err = new mi_console_file (mi->raw_stdout, "&", '"'); 139 mi->log = mi->err; 140 mi->targ = new mi_console_file (mi->raw_stdout, "@", '"'); 141 mi->event_channel = new mi_console_file (mi->raw_stdout, "=", 0); 142 mi->mi_uiout = mi_out_new (name ()); 143 gdb_assert (mi->mi_uiout != nullptr); 144 mi->cli_uiout = new cli_ui_out (mi->out); 145 146 if (top_level) 147 { 148 /* The initial inferior is created before this function is called, so we 149 need to report it explicitly when initializing the top-level MI 150 interpreter. 151 152 This is also called when additional MI interpreters are added (using 153 the new-ui command), when multiple inferiors possibly exist, so we need 154 to use iteration to report all the inferiors. mi_inferior_added can't 155 be used, because it would print the event on all the other MI UIs. */ 156 157 for (inferior *inf : all_inferiors ()) 158 { 159 target_terminal::scoped_restore_terminal_state term_state; 160 target_terminal::ours_for_output (); 161 162 gdb_printf (mi->event_channel, 163 "thread-group-added,id=\"i%d\"", 164 inf->num); 165 166 gdb_flush (mi->event_channel); 167 } 168 } 169 } 170 171 void 172 mi_interp::resume () 173 { 174 struct mi_interp *mi = this; 175 struct ui *ui = current_ui; 176 177 /* As per hack note in mi_interpreter_init, swap in the output 178 channels... */ 179 gdb_setup_readline (0); 180 181 ui->call_readline = gdb_readline_no_editing_callback; 182 ui->input_handler = mi_execute_command_input_handler; 183 184 gdb_stdout = mi->out; 185 /* Route error and log output through the MI. */ 186 gdb_stderr = mi->err; 187 gdb_stdlog = mi->log; 188 /* Route target output through the MI. */ 189 gdb_stdtarg = mi->targ; 190 /* Route target error through the MI as well. */ 191 gdb_stdtargerr = mi->targ; 192 193 deprecated_show_load_progress = mi_load_progress; 194 } 195 196 void 197 mi_interp::suspend () 198 { 199 gdb_disable_readline (); 200 } 201 202 gdb_exception 203 mi_interp::exec (const char *command) 204 { 205 mi_execute_command_wrapper (command); 206 return gdb_exception (); 207 } 208 209 void 210 mi_cmd_interpreter_exec (const char *command, char **argv, int argc) 211 { 212 struct interp *interp_to_use; 213 int i; 214 215 if (argc < 2) 216 error (_("-interpreter-exec: " 217 "Usage: -interpreter-exec interp command")); 218 219 interp_to_use = interp_lookup (current_ui, argv[0]); 220 if (interp_to_use == NULL) 221 error (_("-interpreter-exec: could not find interpreter \"%s\""), 222 argv[0]); 223 224 /* Note that unlike the CLI version of this command, we don't 225 actually set INTERP_TO_USE as the current interpreter, as we 226 still want gdb_stdout, etc. to point at MI streams. */ 227 228 /* Insert the MI out hooks, making sure to also call the 229 interpreter's hooks if it has any. */ 230 /* KRS: We shouldn't need this... Events should be installed and 231 they should just ALWAYS fire something out down the MI 232 channel. */ 233 mi_insert_notify_hooks (); 234 235 /* Now run the code. */ 236 237 SCOPE_EXIT 238 { 239 mi_remove_notify_hooks (); 240 }; 241 242 for (i = 1; i < argc; i++) 243 { 244 struct gdb_exception e = interp_exec (interp_to_use, argv[i]); 245 246 if (e.reason < 0) 247 error ("%s", e.what ()); 248 } 249 } 250 251 /* This inserts a number of hooks that are meant to produce 252 async-notify ("=") MI messages while running commands in another 253 interpreter using mi_interpreter_exec. The canonical use for this 254 is to allow access to the gdb CLI interpreter from within the MI, 255 while still producing MI style output when actions in the CLI 256 command change GDB's state. */ 257 258 static void 259 mi_insert_notify_hooks (void) 260 { 261 deprecated_query_hook = mi_interp_query_hook; 262 } 263 264 static void 265 mi_remove_notify_hooks (void) 266 { 267 deprecated_query_hook = NULL; 268 } 269 270 static int 271 mi_interp_query_hook (const char *ctlstr, va_list ap) 272 { 273 return 1; 274 } 275 276 static void 277 mi_execute_command_wrapper (const char *cmd) 278 { 279 struct ui *ui = current_ui; 280 281 mi_execute_command (cmd, ui->instream == ui->stdin_stream); 282 } 283 284 /* Observer for the synchronous_command_done notification. */ 285 286 static void 287 mi_on_sync_execution_done (void) 288 { 289 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 290 291 if (mi == NULL) 292 return; 293 294 /* If MI is sync, then output the MI prompt now, indicating we're 295 ready for further input. */ 296 if (!mi_async_p ()) 297 display_mi_prompt (mi); 298 } 299 300 /* mi_execute_command_wrapper wrapper suitable for INPUT_HANDLER. */ 301 302 static void 303 mi_execute_command_input_handler (gdb::unique_xmalloc_ptr<char> &&cmd) 304 { 305 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 306 struct ui *ui = current_ui; 307 308 ui->prompt_state = PROMPT_NEEDED; 309 310 mi_execute_command_wrapper (cmd.get ()); 311 312 /* Print a prompt, indicating we're ready for further input, unless 313 we just started a synchronous command. In that case, we're about 314 to go back to the event loop and will output the prompt in the 315 'synchronous_command_done' observer when the target next 316 stops. */ 317 if (ui->prompt_state == PROMPT_NEEDED) 318 display_mi_prompt (mi); 319 } 320 321 void 322 mi_interp::pre_command_loop () 323 { 324 struct mi_interp *mi = this; 325 326 /* Turn off 8 bit strings in quoted output. Any character with the 327 high bit set is printed using C's octal format. */ 328 sevenbit_strings = 1; 329 330 /* Tell the world that we're alive. */ 331 display_mi_prompt (mi); 332 } 333 334 static void 335 mi_new_thread (struct thread_info *t) 336 { 337 SWITCH_THRU_ALL_UIS () 338 { 339 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 340 341 if (mi == NULL) 342 continue; 343 344 target_terminal::scoped_restore_terminal_state term_state; 345 target_terminal::ours_for_output (); 346 347 gdb_printf (mi->event_channel, 348 "thread-created,id=\"%d\",group-id=\"i%d\"", 349 t->global_num, t->inf->num); 350 gdb_flush (mi->event_channel); 351 } 352 } 353 354 static void 355 mi_thread_exit (struct thread_info *t, int silent) 356 { 357 SWITCH_THRU_ALL_UIS () 358 { 359 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 360 361 if (mi == NULL) 362 continue; 363 364 target_terminal::scoped_restore_terminal_state term_state; 365 target_terminal::ours_for_output (); 366 gdb_printf (mi->event_channel, 367 "thread-exited,id=\"%d\",group-id=\"i%d\"", 368 t->global_num, t->inf->num); 369 gdb_flush (mi->event_channel); 370 } 371 } 372 373 /* Emit notification on changing the state of record. */ 374 375 static void 376 mi_record_changed (struct inferior *inferior, int started, const char *method, 377 const char *format) 378 { 379 SWITCH_THRU_ALL_UIS () 380 { 381 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 382 383 if (mi == NULL) 384 continue; 385 386 target_terminal::scoped_restore_terminal_state term_state; 387 target_terminal::ours_for_output (); 388 389 if (started) 390 { 391 if (format != NULL) 392 { 393 gdb_printf (mi->event_channel, 394 "record-started,thread-group=\"i%d\"," 395 "method=\"%s\",format=\"%s\"", 396 inferior->num, method, format); 397 } 398 else 399 { 400 gdb_printf (mi->event_channel, 401 "record-started,thread-group=\"i%d\"," 402 "method=\"%s\"", 403 inferior->num, method); 404 } 405 } 406 else 407 { 408 gdb_printf (mi->event_channel, 409 "record-stopped,thread-group=\"i%d\"", 410 inferior->num); 411 } 412 413 gdb_flush (mi->event_channel); 414 } 415 } 416 417 static void 418 mi_inferior_added (struct inferior *inf) 419 { 420 SWITCH_THRU_ALL_UIS () 421 { 422 struct interp *interp; 423 struct mi_interp *mi; 424 425 /* We'll be called once for the initial inferior, before the top 426 level interpreter is set. */ 427 interp = top_level_interpreter (); 428 if (interp == NULL) 429 continue; 430 431 mi = as_mi_interp (interp); 432 if (mi == NULL) 433 continue; 434 435 target_terminal::scoped_restore_terminal_state term_state; 436 target_terminal::ours_for_output (); 437 438 gdb_printf (mi->event_channel, 439 "thread-group-added,id=\"i%d\"", 440 inf->num); 441 gdb_flush (mi->event_channel); 442 } 443 } 444 445 static void 446 mi_inferior_appeared (struct inferior *inf) 447 { 448 SWITCH_THRU_ALL_UIS () 449 { 450 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 451 452 if (mi == NULL) 453 continue; 454 455 target_terminal::scoped_restore_terminal_state term_state; 456 target_terminal::ours_for_output (); 457 458 gdb_printf (mi->event_channel, 459 "thread-group-started,id=\"i%d\",pid=\"%d\"", 460 inf->num, inf->pid); 461 gdb_flush (mi->event_channel); 462 } 463 } 464 465 static void 466 mi_inferior_exit (struct inferior *inf) 467 { 468 SWITCH_THRU_ALL_UIS () 469 { 470 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 471 472 if (mi == NULL) 473 continue; 474 475 target_terminal::scoped_restore_terminal_state term_state; 476 target_terminal::ours_for_output (); 477 478 if (inf->has_exit_code) 479 gdb_printf (mi->event_channel, 480 "thread-group-exited,id=\"i%d\",exit-code=\"%s\"", 481 inf->num, int_string (inf->exit_code, 8, 0, 0, 1)); 482 else 483 gdb_printf (mi->event_channel, 484 "thread-group-exited,id=\"i%d\"", inf->num); 485 486 gdb_flush (mi->event_channel); 487 } 488 } 489 490 static void 491 mi_inferior_removed (struct inferior *inf) 492 { 493 SWITCH_THRU_ALL_UIS () 494 { 495 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 496 497 if (mi == NULL) 498 continue; 499 500 target_terminal::scoped_restore_terminal_state term_state; 501 target_terminal::ours_for_output (); 502 503 gdb_printf (mi->event_channel, 504 "thread-group-removed,id=\"i%d\"", 505 inf->num); 506 gdb_flush (mi->event_channel); 507 } 508 } 509 510 /* Return the MI interpreter, if it is active -- either because it's 511 the top-level interpreter or the interpreter executing the current 512 command. Returns NULL if the MI interpreter is not being used. */ 513 514 static struct mi_interp * 515 find_mi_interp (void) 516 { 517 struct mi_interp *mi; 518 519 mi = as_mi_interp (top_level_interpreter ()); 520 if (mi != NULL) 521 return mi; 522 523 mi = as_mi_interp (command_interp ()); 524 if (mi != NULL) 525 return mi; 526 527 return NULL; 528 } 529 530 /* Observers for several run control events that print why the 531 inferior has stopped to both the MI event channel and to the MI 532 console. If the MI interpreter is not active, print nothing. */ 533 534 /* Observer for the signal_received notification. */ 535 536 static void 537 mi_on_signal_received (enum gdb_signal siggnal) 538 { 539 SWITCH_THRU_ALL_UIS () 540 { 541 struct mi_interp *mi = find_mi_interp (); 542 543 if (mi == NULL) 544 continue; 545 546 print_signal_received_reason (mi->mi_uiout, siggnal); 547 print_signal_received_reason (mi->cli_uiout, siggnal); 548 } 549 } 550 551 /* Observer for the end_stepping_range notification. */ 552 553 static void 554 mi_on_end_stepping_range (void) 555 { 556 SWITCH_THRU_ALL_UIS () 557 { 558 struct mi_interp *mi = find_mi_interp (); 559 560 if (mi == NULL) 561 continue; 562 563 print_end_stepping_range_reason (mi->mi_uiout); 564 print_end_stepping_range_reason (mi->cli_uiout); 565 } 566 } 567 568 /* Observer for the signal_exited notification. */ 569 570 static void 571 mi_on_signal_exited (enum gdb_signal siggnal) 572 { 573 SWITCH_THRU_ALL_UIS () 574 { 575 struct mi_interp *mi = find_mi_interp (); 576 577 if (mi == NULL) 578 continue; 579 580 print_signal_exited_reason (mi->mi_uiout, siggnal); 581 print_signal_exited_reason (mi->cli_uiout, siggnal); 582 } 583 } 584 585 /* Observer for the exited notification. */ 586 587 static void 588 mi_on_exited (int exitstatus) 589 { 590 SWITCH_THRU_ALL_UIS () 591 { 592 struct mi_interp *mi = find_mi_interp (); 593 594 if (mi == NULL) 595 continue; 596 597 print_exited_reason (mi->mi_uiout, exitstatus); 598 print_exited_reason (mi->cli_uiout, exitstatus); 599 } 600 } 601 602 /* Observer for the no_history notification. */ 603 604 static void 605 mi_on_no_history (void) 606 { 607 SWITCH_THRU_ALL_UIS () 608 { 609 struct mi_interp *mi = find_mi_interp (); 610 611 if (mi == NULL) 612 continue; 613 614 print_no_history_reason (mi->mi_uiout); 615 print_no_history_reason (mi->cli_uiout); 616 } 617 } 618 619 static void 620 mi_on_normal_stop_1 (struct bpstat *bs, int print_frame) 621 { 622 /* Since this can be called when CLI command is executing, 623 using cli interpreter, be sure to use MI uiout for output, 624 not the current one. */ 625 struct ui_out *mi_uiout = top_level_interpreter ()->interp_ui_out (); 626 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter (); 627 628 if (print_frame) 629 { 630 struct thread_info *tp; 631 int core; 632 struct interp *console_interp; 633 634 tp = inferior_thread (); 635 636 if (tp->thread_fsm () != nullptr 637 && tp->thread_fsm ()->finished_p ()) 638 { 639 enum async_reply_reason reason; 640 641 reason = tp->thread_fsm ()->async_reply_reason (); 642 mi_uiout->field_string ("reason", async_reason_lookup (reason)); 643 } 644 645 console_interp = interp_lookup (current_ui, INTERP_CONSOLE); 646 /* We only want to print the displays once, and we want it to 647 look just how it would on the console, so we use this to 648 decide whether the MI stop should include them. */ 649 bool console_print = should_print_stop_to_console (console_interp, tp); 650 print_stop_event (mi_uiout, !console_print); 651 652 if (console_print) 653 print_stop_event (mi->cli_uiout); 654 655 mi_uiout->field_signed ("thread-id", tp->global_num); 656 if (non_stop) 657 { 658 ui_out_emit_list list_emitter (mi_uiout, "stopped-threads"); 659 660 mi_uiout->field_signed (NULL, tp->global_num); 661 } 662 else 663 mi_uiout->field_string ("stopped-threads", "all"); 664 665 core = target_core_of_thread (tp->ptid); 666 if (core != -1) 667 mi_uiout->field_signed ("core", core); 668 } 669 670 gdb_puts ("*stopped", mi->raw_stdout); 671 mi_out_put (mi_uiout, mi->raw_stdout); 672 mi_out_rewind (mi_uiout); 673 mi_print_timing_maybe (mi->raw_stdout); 674 gdb_puts ("\n", mi->raw_stdout); 675 gdb_flush (mi->raw_stdout); 676 } 677 678 static void 679 mi_on_normal_stop (struct bpstat *bs, int print_frame) 680 { 681 SWITCH_THRU_ALL_UIS () 682 { 683 if (as_mi_interp (top_level_interpreter ()) == NULL) 684 continue; 685 686 mi_on_normal_stop_1 (bs, print_frame); 687 } 688 } 689 690 static void 691 mi_about_to_proceed (void) 692 { 693 /* Suppress output while calling an inferior function. */ 694 695 if (inferior_ptid != null_ptid) 696 { 697 struct thread_info *tp = inferior_thread (); 698 699 if (tp->control.in_infcall) 700 return; 701 } 702 703 mi_proceeded = 1; 704 } 705 706 /* When the element is non-zero, no MI notifications will be emitted in 707 response to the corresponding observers. */ 708 709 struct mi_suppress_notification mi_suppress_notification = 710 { 711 0, 712 0, 713 0, 714 0, 715 }; 716 717 /* Emit notification on changing a traceframe. */ 718 719 static void 720 mi_traceframe_changed (int tfnum, int tpnum) 721 { 722 if (mi_suppress_notification.traceframe) 723 return; 724 725 SWITCH_THRU_ALL_UIS () 726 { 727 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 728 729 if (mi == NULL) 730 continue; 731 732 target_terminal::scoped_restore_terminal_state term_state; 733 target_terminal::ours_for_output (); 734 735 if (tfnum >= 0) 736 gdb_printf (mi->event_channel, "traceframe-changed," 737 "num=\"%d\",tracepoint=\"%d\"", 738 tfnum, tpnum); 739 else 740 gdb_printf (mi->event_channel, "traceframe-changed,end"); 741 742 gdb_flush (mi->event_channel); 743 } 744 } 745 746 /* Emit notification on creating a trace state variable. */ 747 748 static void 749 mi_tsv_created (const struct trace_state_variable *tsv) 750 { 751 SWITCH_THRU_ALL_UIS () 752 { 753 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 754 755 if (mi == NULL) 756 continue; 757 758 target_terminal::scoped_restore_terminal_state term_state; 759 target_terminal::ours_for_output (); 760 761 gdb_printf (mi->event_channel, "tsv-created," 762 "name=\"%s\",initial=\"%s\"", 763 tsv->name.c_str (), plongest (tsv->initial_value)); 764 765 gdb_flush (mi->event_channel); 766 } 767 } 768 769 /* Emit notification on deleting a trace state variable. */ 770 771 static void 772 mi_tsv_deleted (const struct trace_state_variable *tsv) 773 { 774 SWITCH_THRU_ALL_UIS () 775 { 776 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 777 778 if (mi == NULL) 779 continue; 780 781 target_terminal::scoped_restore_terminal_state term_state; 782 target_terminal::ours_for_output (); 783 784 if (tsv != NULL) 785 gdb_printf (mi->event_channel, "tsv-deleted," 786 "name=\"%s\"", tsv->name.c_str ()); 787 else 788 gdb_printf (mi->event_channel, "tsv-deleted"); 789 790 gdb_flush (mi->event_channel); 791 } 792 } 793 794 /* Emit notification on modifying a trace state variable. */ 795 796 static void 797 mi_tsv_modified (const struct trace_state_variable *tsv) 798 { 799 SWITCH_THRU_ALL_UIS () 800 { 801 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 802 struct ui_out *mi_uiout; 803 804 if (mi == NULL) 805 continue; 806 807 mi_uiout = top_level_interpreter ()->interp_ui_out (); 808 809 target_terminal::scoped_restore_terminal_state term_state; 810 target_terminal::ours_for_output (); 811 812 gdb_printf (mi->event_channel, 813 "tsv-modified"); 814 815 ui_out_redirect_pop redir (mi_uiout, mi->event_channel); 816 817 mi_uiout->field_string ("name", tsv->name); 818 mi_uiout->field_string ("initial", 819 plongest (tsv->initial_value)); 820 if (tsv->value_known) 821 mi_uiout->field_string ("current", plongest (tsv->value)); 822 823 gdb_flush (mi->event_channel); 824 } 825 } 826 827 /* Print breakpoint BP on MI's event channel. */ 828 829 static void 830 mi_print_breakpoint_for_event (struct mi_interp *mi, breakpoint *bp) 831 { 832 ui_out *mi_uiout = mi->interp_ui_out (); 833 834 /* We want the output from print_breakpoint to go to 835 mi->event_channel. One approach would be to just call 836 print_breakpoint, and then use mi_out_put to send the current 837 content of mi_uiout into mi->event_channel. However, that will 838 break if anything is output to mi_uiout prior to calling the 839 breakpoint_created notifications. So, we use 840 ui_out_redirect. */ 841 ui_out_redirect_pop redir (mi_uiout, mi->event_channel); 842 843 try 844 { 845 scoped_restore restore_uiout 846 = make_scoped_restore (¤t_uiout, mi_uiout); 847 848 print_breakpoint (bp); 849 } 850 catch (const gdb_exception &ex) 851 { 852 exception_print (gdb_stderr, ex); 853 } 854 } 855 856 /* Emit notification about a created breakpoint. */ 857 858 static void 859 mi_breakpoint_created (struct breakpoint *b) 860 { 861 if (mi_suppress_notification.breakpoint) 862 return; 863 864 if (b->number <= 0) 865 return; 866 867 SWITCH_THRU_ALL_UIS () 868 { 869 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 870 871 if (mi == NULL) 872 continue; 873 874 target_terminal::scoped_restore_terminal_state term_state; 875 target_terminal::ours_for_output (); 876 877 gdb_printf (mi->event_channel, 878 "breakpoint-created"); 879 mi_print_breakpoint_for_event (mi, b); 880 881 gdb_flush (mi->event_channel); 882 } 883 } 884 885 /* Emit notification about deleted breakpoint. */ 886 887 static void 888 mi_breakpoint_deleted (struct breakpoint *b) 889 { 890 if (mi_suppress_notification.breakpoint) 891 return; 892 893 if (b->number <= 0) 894 return; 895 896 SWITCH_THRU_ALL_UIS () 897 { 898 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 899 900 if (mi == NULL) 901 continue; 902 903 target_terminal::scoped_restore_terminal_state term_state; 904 target_terminal::ours_for_output (); 905 906 gdb_printf (mi->event_channel, "breakpoint-deleted,id=\"%d\"", 907 b->number); 908 909 gdb_flush (mi->event_channel); 910 } 911 } 912 913 /* Emit notification about modified breakpoint. */ 914 915 static void 916 mi_breakpoint_modified (struct breakpoint *b) 917 { 918 if (mi_suppress_notification.breakpoint) 919 return; 920 921 if (b->number <= 0) 922 return; 923 924 SWITCH_THRU_ALL_UIS () 925 { 926 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 927 928 if (mi == NULL) 929 continue; 930 931 target_terminal::scoped_restore_terminal_state term_state; 932 target_terminal::ours_for_output (); 933 gdb_printf (mi->event_channel, 934 "breakpoint-modified"); 935 mi_print_breakpoint_for_event (mi, b); 936 937 gdb_flush (mi->event_channel); 938 } 939 } 940 941 static void 942 mi_output_running (struct thread_info *thread) 943 { 944 SWITCH_THRU_ALL_UIS () 945 { 946 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 947 948 if (mi == NULL) 949 continue; 950 951 gdb_printf (mi->raw_stdout, 952 "*running,thread-id=\"%d\"\n", 953 thread->global_num); 954 } 955 } 956 957 /* Return true if there are multiple inferiors loaded. This is used 958 for backwards compatibility -- if there's only one inferior, output 959 "all", otherwise, output each resumed thread individually. */ 960 961 static bool 962 multiple_inferiors_p () 963 { 964 int count = 0; 965 for (inferior *inf ATTRIBUTE_UNUSED : all_non_exited_inferiors ()) 966 { 967 count++; 968 if (count > 1) 969 return true; 970 } 971 972 return false; 973 } 974 975 static void 976 mi_on_resume_1 (struct mi_interp *mi, 977 process_stratum_target *targ, ptid_t ptid) 978 { 979 /* To cater for older frontends, emit ^running, but do it only once 980 per each command. We do it here, since at this point we know 981 that the target was successfully resumed, and in non-async mode, 982 we won't return back to MI interpreter code until the target 983 is done running, so delaying the output of "^running" until then 984 will make it impossible for frontend to know what's going on. 985 986 In future (MI3), we'll be outputting "^done" here. */ 987 if (!running_result_record_printed && mi_proceeded) 988 { 989 gdb_printf (mi->raw_stdout, "%s^running\n", 990 current_token ? current_token : ""); 991 } 992 993 /* Backwards compatibility. If doing a wildcard resume and there's 994 only one inferior, output "all", otherwise, output each resumed 995 thread individually. */ 996 if ((ptid == minus_one_ptid || ptid.is_pid ()) 997 && !multiple_inferiors_p ()) 998 gdb_printf (mi->raw_stdout, "*running,thread-id=\"all\"\n"); 999 else 1000 for (thread_info *tp : all_non_exited_threads (targ, ptid)) 1001 mi_output_running (tp); 1002 1003 if (!running_result_record_printed && mi_proceeded) 1004 { 1005 running_result_record_printed = 1; 1006 /* This is what gdb used to do historically -- printing prompt 1007 even if it cannot actually accept any input. This will be 1008 surely removed for MI3, and may be removed even earlier. */ 1009 if (current_ui->prompt_state == PROMPT_BLOCKED) 1010 gdb_puts ("(gdb) \n", mi->raw_stdout); 1011 } 1012 gdb_flush (mi->raw_stdout); 1013 } 1014 1015 static void 1016 mi_on_resume (ptid_t ptid) 1017 { 1018 struct thread_info *tp = NULL; 1019 1020 process_stratum_target *target = current_inferior ()->process_target (); 1021 if (ptid == minus_one_ptid || ptid.is_pid ()) 1022 tp = inferior_thread (); 1023 else 1024 tp = find_thread_ptid (target, ptid); 1025 1026 /* Suppress output while calling an inferior function. */ 1027 if (tp->control.in_infcall) 1028 return; 1029 1030 SWITCH_THRU_ALL_UIS () 1031 { 1032 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 1033 1034 if (mi == NULL) 1035 continue; 1036 1037 target_terminal::scoped_restore_terminal_state term_state; 1038 target_terminal::ours_for_output (); 1039 1040 mi_on_resume_1 (mi, target, ptid); 1041 } 1042 } 1043 1044 /* See mi-interp.h. */ 1045 1046 void 1047 mi_output_solib_attribs (ui_out *uiout, struct so_list *solib) 1048 { 1049 struct gdbarch *gdbarch = target_gdbarch (); 1050 1051 uiout->field_string ("id", solib->so_original_name); 1052 uiout->field_string ("target-name", solib->so_original_name); 1053 uiout->field_string ("host-name", solib->so_name); 1054 uiout->field_signed ("symbols-loaded", solib->symbols_loaded); 1055 if (!gdbarch_has_global_solist (target_gdbarch ())) 1056 uiout->field_fmt ("thread-group", "i%d", current_inferior ()->num); 1057 1058 ui_out_emit_list list_emitter (uiout, "ranges"); 1059 ui_out_emit_tuple tuple_emitter (uiout, NULL); 1060 if (solib->addr_high != 0) 1061 { 1062 uiout->field_core_addr ("from", gdbarch, solib->addr_low); 1063 uiout->field_core_addr ("to", gdbarch, solib->addr_high); 1064 } 1065 } 1066 1067 static void 1068 mi_solib_loaded (struct so_list *solib) 1069 { 1070 SWITCH_THRU_ALL_UIS () 1071 { 1072 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 1073 struct ui_out *uiout; 1074 1075 if (mi == NULL) 1076 continue; 1077 1078 uiout = top_level_interpreter ()->interp_ui_out (); 1079 1080 target_terminal::scoped_restore_terminal_state term_state; 1081 target_terminal::ours_for_output (); 1082 1083 gdb_printf (mi->event_channel, "library-loaded"); 1084 1085 ui_out_redirect_pop redir (uiout, mi->event_channel); 1086 1087 mi_output_solib_attribs (uiout, solib); 1088 1089 gdb_flush (mi->event_channel); 1090 } 1091 } 1092 1093 static void 1094 mi_solib_unloaded (struct so_list *solib) 1095 { 1096 SWITCH_THRU_ALL_UIS () 1097 { 1098 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 1099 struct ui_out *uiout; 1100 1101 if (mi == NULL) 1102 continue; 1103 1104 uiout = top_level_interpreter ()->interp_ui_out (); 1105 1106 target_terminal::scoped_restore_terminal_state term_state; 1107 target_terminal::ours_for_output (); 1108 1109 gdb_printf (mi->event_channel, "library-unloaded"); 1110 1111 ui_out_redirect_pop redir (uiout, mi->event_channel); 1112 1113 uiout->field_string ("id", solib->so_original_name); 1114 uiout->field_string ("target-name", solib->so_original_name); 1115 uiout->field_string ("host-name", solib->so_name); 1116 if (!gdbarch_has_global_solist (target_gdbarch ())) 1117 { 1118 uiout->field_fmt ("thread-group", "i%d", current_inferior ()->num); 1119 } 1120 1121 gdb_flush (mi->event_channel); 1122 } 1123 } 1124 1125 /* Emit notification about the command parameter change. */ 1126 1127 static void 1128 mi_command_param_changed (const char *param, const char *value) 1129 { 1130 if (mi_suppress_notification.cmd_param_changed) 1131 return; 1132 1133 SWITCH_THRU_ALL_UIS () 1134 { 1135 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 1136 struct ui_out *mi_uiout; 1137 1138 if (mi == NULL) 1139 continue; 1140 1141 mi_uiout = top_level_interpreter ()->interp_ui_out (); 1142 1143 target_terminal::scoped_restore_terminal_state term_state; 1144 target_terminal::ours_for_output (); 1145 1146 gdb_printf (mi->event_channel, "cmd-param-changed"); 1147 1148 ui_out_redirect_pop redir (mi_uiout, mi->event_channel); 1149 1150 mi_uiout->field_string ("param", param); 1151 mi_uiout->field_string ("value", value); 1152 1153 gdb_flush (mi->event_channel); 1154 } 1155 } 1156 1157 /* Emit notification about the target memory change. */ 1158 1159 static void 1160 mi_memory_changed (struct inferior *inferior, CORE_ADDR memaddr, 1161 ssize_t len, const bfd_byte *myaddr) 1162 { 1163 if (mi_suppress_notification.memory) 1164 return; 1165 1166 SWITCH_THRU_ALL_UIS () 1167 { 1168 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 1169 struct ui_out *mi_uiout; 1170 struct obj_section *sec; 1171 1172 if (mi == NULL) 1173 continue; 1174 1175 mi_uiout = top_level_interpreter ()->interp_ui_out (); 1176 1177 target_terminal::scoped_restore_terminal_state term_state; 1178 target_terminal::ours_for_output (); 1179 1180 gdb_printf (mi->event_channel, "memory-changed"); 1181 1182 ui_out_redirect_pop redir (mi_uiout, mi->event_channel); 1183 1184 mi_uiout->field_fmt ("thread-group", "i%d", inferior->num); 1185 mi_uiout->field_core_addr ("addr", target_gdbarch (), memaddr); 1186 mi_uiout->field_string ("len", hex_string (len)); 1187 1188 /* Append 'type=code' into notification if MEMADDR falls in the range of 1189 sections contain code. */ 1190 sec = find_pc_section (memaddr); 1191 if (sec != NULL && sec->objfile != NULL) 1192 { 1193 flagword flags = bfd_section_flags (sec->the_bfd_section); 1194 1195 if (flags & SEC_CODE) 1196 mi_uiout->field_string ("type", "code"); 1197 } 1198 1199 gdb_flush (mi->event_channel); 1200 } 1201 } 1202 1203 /* Emit an event when the selection context (inferior, thread, frame) 1204 changed. */ 1205 1206 static void 1207 mi_user_selected_context_changed (user_selected_what selection) 1208 { 1209 struct thread_info *tp; 1210 1211 /* Don't send an event if we're responding to an MI command. */ 1212 if (mi_suppress_notification.user_selected_context) 1213 return; 1214 1215 if (inferior_ptid != null_ptid) 1216 tp = inferior_thread (); 1217 else 1218 tp = NULL; 1219 1220 SWITCH_THRU_ALL_UIS () 1221 { 1222 struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); 1223 struct ui_out *mi_uiout; 1224 1225 if (mi == NULL) 1226 continue; 1227 1228 mi_uiout = top_level_interpreter ()->interp_ui_out (); 1229 1230 ui_out_redirect_pop redirect_popper (mi_uiout, mi->event_channel); 1231 1232 target_terminal::scoped_restore_terminal_state term_state; 1233 target_terminal::ours_for_output (); 1234 1235 if (selection & USER_SELECTED_INFERIOR) 1236 print_selected_inferior (mi->cli_uiout); 1237 1238 if (tp != NULL 1239 && (selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME))) 1240 { 1241 print_selected_thread_frame (mi->cli_uiout, selection); 1242 1243 gdb_printf (mi->event_channel, 1244 "thread-selected,id=\"%d\"", 1245 tp->global_num); 1246 1247 if (tp->state != THREAD_RUNNING) 1248 { 1249 if (has_stack_frames ()) 1250 print_stack_frame_to_uiout (mi_uiout, get_selected_frame (NULL), 1251 1, SRC_AND_LOC, 1); 1252 } 1253 } 1254 1255 gdb_flush (mi->event_channel); 1256 } 1257 } 1258 1259 ui_out * 1260 mi_interp::interp_ui_out () 1261 { 1262 return this->mi_uiout; 1263 } 1264 1265 /* Do MI-specific logging actions; save raw_stdout, and change all 1266 the consoles to use the supplied ui-file(s). */ 1267 1268 void 1269 mi_interp::set_logging (ui_file_up logfile, bool logging_redirect, 1270 bool debug_redirect) 1271 { 1272 struct mi_interp *mi = this; 1273 1274 if (logfile != NULL) 1275 { 1276 mi->saved_raw_stdout = mi->raw_stdout; 1277 1278 ui_file *logfile_p = logfile.get (); 1279 mi->logfile_holder = std::move (logfile); 1280 1281 /* If something is not being redirected, then a tee containing both the 1282 logfile and stdout. */ 1283 ui_file *tee = nullptr; 1284 if (!logging_redirect || !debug_redirect) 1285 { 1286 tee = new tee_file (mi->raw_stdout, logfile_p); 1287 mi->stdout_holder.reset (tee); 1288 } 1289 1290 mi->raw_stdout = logging_redirect ? logfile_p : tee; 1291 } 1292 else 1293 { 1294 mi->logfile_holder.reset (); 1295 mi->stdout_holder.reset (); 1296 mi->raw_stdout = mi->saved_raw_stdout; 1297 mi->saved_raw_stdout = nullptr; 1298 } 1299 1300 mi->out->set_raw (mi->raw_stdout); 1301 mi->err->set_raw (mi->raw_stdout); 1302 mi->log->set_raw (mi->raw_stdout); 1303 mi->targ->set_raw (mi->raw_stdout); 1304 mi->event_channel->set_raw (mi->raw_stdout); 1305 } 1306 1307 /* Factory for MI interpreters. */ 1308 1309 static struct interp * 1310 mi_interp_factory (const char *name) 1311 { 1312 return new mi_interp (name); 1313 } 1314 1315 void _initialize_mi_interp (); 1316 void 1317 _initialize_mi_interp () 1318 { 1319 /* The various interpreter levels. */ 1320 interp_factory_register (INTERP_MI1, mi_interp_factory); 1321 interp_factory_register (INTERP_MI2, mi_interp_factory); 1322 interp_factory_register (INTERP_MI3, mi_interp_factory); 1323 interp_factory_register (INTERP_MI4, mi_interp_factory); 1324 interp_factory_register (INTERP_MI, mi_interp_factory); 1325 1326 gdb::observers::signal_received.attach (mi_on_signal_received, "mi-interp"); 1327 gdb::observers::end_stepping_range.attach (mi_on_end_stepping_range, 1328 "mi-interp"); 1329 gdb::observers::signal_exited.attach (mi_on_signal_exited, "mi-interp"); 1330 gdb::observers::exited.attach (mi_on_exited, "mi-interp"); 1331 gdb::observers::no_history.attach (mi_on_no_history, "mi-interp"); 1332 gdb::observers::new_thread.attach (mi_new_thread, "mi-interp"); 1333 gdb::observers::thread_exit.attach (mi_thread_exit, "mi-interp"); 1334 gdb::observers::inferior_added.attach (mi_inferior_added, "mi-interp"); 1335 gdb::observers::inferior_appeared.attach (mi_inferior_appeared, "mi-interp"); 1336 gdb::observers::inferior_exit.attach (mi_inferior_exit, "mi-interp"); 1337 gdb::observers::inferior_removed.attach (mi_inferior_removed, "mi-interp"); 1338 gdb::observers::record_changed.attach (mi_record_changed, "mi-interp"); 1339 gdb::observers::normal_stop.attach (mi_on_normal_stop, "mi-interp"); 1340 gdb::observers::target_resumed.attach (mi_on_resume, "mi-interp"); 1341 gdb::observers::solib_loaded.attach (mi_solib_loaded, "mi-interp"); 1342 gdb::observers::solib_unloaded.attach (mi_solib_unloaded, "mi-interp"); 1343 gdb::observers::about_to_proceed.attach (mi_about_to_proceed, "mi-interp"); 1344 gdb::observers::traceframe_changed.attach (mi_traceframe_changed, 1345 "mi-interp"); 1346 gdb::observers::tsv_created.attach (mi_tsv_created, "mi-interp"); 1347 gdb::observers::tsv_deleted.attach (mi_tsv_deleted, "mi-interp"); 1348 gdb::observers::tsv_modified.attach (mi_tsv_modified, "mi-interp"); 1349 gdb::observers::breakpoint_created.attach (mi_breakpoint_created, 1350 "mi-interp"); 1351 gdb::observers::breakpoint_deleted.attach (mi_breakpoint_deleted, 1352 "mi-interp"); 1353 gdb::observers::breakpoint_modified.attach (mi_breakpoint_modified, 1354 "mi-interp"); 1355 gdb::observers::command_param_changed.attach (mi_command_param_changed, 1356 "mi-interp"); 1357 gdb::observers::command_error.attach (mi_on_command_error, "mi-interp"); 1358 gdb::observers::memory_changed.attach (mi_memory_changed, "mi-interp"); 1359 gdb::observers::sync_execution_done.attach (mi_on_sync_execution_done, 1360 "mi-interp"); 1361 gdb::observers::user_selected_context_changed.attach 1362 (mi_user_selected_context_changed, "mi-interp"); 1363 } 1364