1 /* Manages interpreters for GDB, the GNU debugger. 2 3 Copyright (C) 2000-2017 Free Software Foundation, Inc. 4 5 Written by Jim Ingham <jingham@apple.com> of Apple Computer, Inc. 6 7 This file is part of GDB. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 21 22 /* This is just a first cut at separating out the "interpreter" 23 functions of gdb into self-contained modules. There are a couple 24 of open areas that need to be sorted out: 25 26 1) The interpreter explicitly contains a UI_OUT, and can insert itself 27 into the event loop, but it doesn't explicitly contain hooks for readline. 28 I did this because it seems to me many interpreters won't want to use 29 the readline command interface, and it is probably simpler to just let 30 them take over the input in their resume proc. */ 31 32 #include "defs.h" 33 #include "gdbcmd.h" 34 #include "ui-out.h" 35 #include "event-loop.h" 36 #include "event-top.h" 37 #include "interps.h" 38 #include "completer.h" 39 #include "top.h" /* For command_loop. */ 40 #include "continuations.h" 41 42 /* Each UI has its own independent set of interpreters. */ 43 44 struct ui_interp_info 45 { 46 /* Each top level has its own independent set of interpreters. */ 47 struct interp *interp_list; 48 struct interp *current_interpreter; 49 struct interp *top_level_interpreter; 50 51 /* The interpreter that is active while `interp_exec' is active, NULL 52 at all other times. */ 53 struct interp *command_interpreter; 54 }; 55 56 /* Get UI's ui_interp_info object. Never returns NULL. */ 57 58 static struct ui_interp_info * 59 get_interp_info (struct ui *ui) 60 { 61 if (ui->interp_info == NULL) 62 ui->interp_info = XCNEW (struct ui_interp_info); 63 return ui->interp_info; 64 } 65 66 /* Get the current UI's ui_interp_info object. Never returns 67 NULL. */ 68 69 static struct ui_interp_info * 70 get_current_interp_info (void) 71 { 72 return get_interp_info (current_ui); 73 } 74 75 /* The magic initialization routine for this module. */ 76 77 void _initialize_interpreter (void); 78 79 static struct interp *interp_lookup_existing (struct ui *ui, 80 const char *name); 81 82 interp::interp (const char *name) 83 { 84 this->name = xstrdup (name); 85 this->inited = false; 86 } 87 88 interp::~interp () 89 {} 90 91 /* An interpreter factory. Maps an interpreter name to the factory 92 function that instantiates an interpreter by that name. */ 93 94 struct interp_factory 95 { 96 /* This is the name in "-i=INTERP" and "interpreter-exec INTERP". */ 97 const char *name; 98 99 /* The function that creates the interpreter. */ 100 interp_factory_func func; 101 }; 102 103 typedef struct interp_factory *interp_factory_p; 104 DEF_VEC_P(interp_factory_p); 105 106 /* The registered interpreter factories. */ 107 static VEC(interp_factory_p) *interpreter_factories = NULL; 108 109 /* See interps.h. */ 110 111 void 112 interp_factory_register (const char *name, interp_factory_func func) 113 { 114 struct interp_factory *f; 115 int ix; 116 117 /* Assert that no factory for NAME is already registered. */ 118 for (ix = 0; 119 VEC_iterate (interp_factory_p, interpreter_factories, ix, f); 120 ++ix) 121 if (strcmp (f->name, name) == 0) 122 { 123 internal_error (__FILE__, __LINE__, 124 _("interpreter factory already registered: \"%s\"\n"), 125 name); 126 } 127 128 f = XNEW (struct interp_factory); 129 f->name = name; 130 f->func = func; 131 VEC_safe_push (interp_factory_p, interpreter_factories, f); 132 } 133 134 /* Add interpreter INTERP to the gdb interpreter list. The 135 interpreter must not have previously been added. */ 136 void 137 interp_add (struct ui *ui, struct interp *interp) 138 { 139 struct ui_interp_info *ui_interp = get_interp_info (ui); 140 141 gdb_assert (interp_lookup_existing (ui, interp->name) == NULL); 142 143 interp->next = ui_interp->interp_list; 144 ui_interp->interp_list = interp; 145 } 146 147 /* This sets the current interpreter to be INTERP. If INTERP has not 148 been initialized, then this will also run the init method. 149 150 The TOP_LEVEL parameter tells if this new interpreter is 151 the top-level one. The top-level is what is requested 152 on the command line, and is responsible for reporting general 153 notification about target state changes. For example, if 154 MI is the top-level interpreter, then it will always report 155 events such as target stops and new thread creation, even if they 156 are caused by CLI commands. */ 157 158 static void 159 interp_set (struct interp *interp, bool top_level) 160 { 161 struct ui_interp_info *ui_interp = get_current_interp_info (); 162 struct interp *old_interp = ui_interp->current_interpreter; 163 164 /* If we already have an interpreter, then trying to 165 set top level interpreter is kinda pointless. */ 166 gdb_assert (!top_level || !ui_interp->current_interpreter); 167 gdb_assert (!top_level || !ui_interp->top_level_interpreter); 168 169 if (old_interp != NULL) 170 { 171 current_uiout->flush (); 172 old_interp->suspend (); 173 } 174 175 ui_interp->current_interpreter = interp; 176 if (top_level) 177 ui_interp->top_level_interpreter = interp; 178 179 /* We use interpreter_p for the "set interpreter" variable, so we need 180 to make sure we have a malloc'ed copy for the set command to free. */ 181 if (interpreter_p != NULL 182 && strcmp (interp->name, interpreter_p) != 0) 183 { 184 xfree (interpreter_p); 185 186 interpreter_p = xstrdup (interp->name); 187 } 188 189 /* Run the init proc. */ 190 if (!interp->inited) 191 { 192 interp->init (top_level); 193 interp->inited = true; 194 } 195 196 /* Do this only after the interpreter is initialized. */ 197 current_uiout = interp->interp_ui_out (); 198 199 /* Clear out any installed interpreter hooks/event handlers. */ 200 clear_interpreter_hooks (); 201 202 interp->resume (); 203 } 204 205 /* Look up the interpreter for NAME. If no such interpreter exists, 206 return NULL, otherwise return a pointer to the interpreter. */ 207 208 static struct interp * 209 interp_lookup_existing (struct ui *ui, const char *name) 210 { 211 struct ui_interp_info *ui_interp = get_interp_info (ui); 212 struct interp *interp; 213 214 for (interp = ui_interp->interp_list; 215 interp != NULL; 216 interp = interp->next) 217 { 218 if (strcmp (interp->name, name) == 0) 219 return interp; 220 } 221 222 return NULL; 223 } 224 225 /* See interps.h. */ 226 227 struct interp * 228 interp_lookup (struct ui *ui, const char *name) 229 { 230 struct interp_factory *factory; 231 struct interp *interp; 232 int ix; 233 234 if (name == NULL || strlen (name) == 0) 235 return NULL; 236 237 /* Only create each interpreter once per top level. */ 238 interp = interp_lookup_existing (ui, name); 239 if (interp != NULL) 240 return interp; 241 242 for (ix = 0; 243 VEC_iterate (interp_factory_p, interpreter_factories, ix, factory); 244 ++ix) 245 if (strcmp (factory->name, name) == 0) 246 { 247 interp = factory->func (name); 248 interp_add (ui, interp); 249 return interp; 250 } 251 252 return NULL; 253 } 254 255 /* See interps.h. */ 256 257 void 258 set_top_level_interpreter (const char *name) 259 { 260 /* Find it. */ 261 struct interp *interp = interp_lookup (current_ui, name); 262 263 if (interp == NULL) 264 error (_("Interpreter `%s' unrecognized"), name); 265 /* Install it. */ 266 interp_set (interp, true); 267 } 268 269 /* Returns the current interpreter. */ 270 271 struct ui_out * 272 interp_ui_out (struct interp *interp) 273 { 274 struct ui_interp_info *ui_interp = get_current_interp_info (); 275 276 if (interp == NULL) 277 interp = ui_interp->current_interpreter; 278 return interp->interp_ui_out (); 279 } 280 281 void 282 current_interp_set_logging (ui_file_up logfile, 283 bool logging_redirect) 284 { 285 struct ui_interp_info *ui_interp = get_current_interp_info (); 286 struct interp *interp = ui_interp->current_interpreter; 287 288 interp->set_logging (std::move (logfile), logging_redirect); 289 } 290 291 /* Temporarily overrides the current interpreter. */ 292 struct interp * 293 interp_set_temp (const char *name) 294 { 295 struct ui_interp_info *ui_interp = get_current_interp_info (); 296 struct interp *interp = interp_lookup (current_ui, name); 297 struct interp *old_interp = ui_interp->current_interpreter; 298 299 if (interp) 300 ui_interp->current_interpreter = interp; 301 return old_interp; 302 } 303 304 /* Returns the interpreter's name. */ 305 306 const char * 307 interp_name (struct interp *interp) 308 { 309 return interp->name; 310 } 311 312 /* Returns true if the current interp is the passed in name. */ 313 int 314 current_interp_named_p (const char *interp_name) 315 { 316 struct ui_interp_info *ui_interp = get_current_interp_info (); 317 struct interp *interp = ui_interp->current_interpreter; 318 319 if (interp != NULL) 320 return (strcmp (interp->name, interp_name) == 0); 321 322 return 0; 323 } 324 325 /* The interpreter that was active when a command was executed. 326 Normally that'd always be CURRENT_INTERPRETER, except that MI's 327 -interpreter-exec command doesn't actually flip the current 328 interpreter when running its sub-command. The 329 `command_interpreter' global tracks when interp_exec is called 330 (IOW, when -interpreter-exec is called). If that is set, it is 331 INTERP in '-interpreter-exec INTERP "CMD"' or in 'interpreter-exec 332 INTERP "CMD". Otherwise, interp_exec isn't active, and so the 333 interpreter running the command is the current interpreter. */ 334 335 struct interp * 336 command_interp (void) 337 { 338 struct ui_interp_info *ui_interp = get_current_interp_info (); 339 340 if (ui_interp->command_interpreter != NULL) 341 return ui_interp->command_interpreter; 342 else 343 return ui_interp->current_interpreter; 344 } 345 346 /* See interps.h. */ 347 348 void 349 interp_pre_command_loop (struct interp *interp) 350 { 351 gdb_assert (interp != NULL); 352 353 interp->pre_command_loop (); 354 } 355 356 /* See interp.h */ 357 358 int 359 interp_supports_command_editing (struct interp *interp) 360 { 361 return interp->supports_command_editing (); 362 } 363 364 /* interp_exec - This executes COMMAND_STR in the current 365 interpreter. */ 366 367 struct gdb_exception 368 interp_exec (struct interp *interp, const char *command_str) 369 { 370 struct ui_interp_info *ui_interp = get_current_interp_info (); 371 372 struct gdb_exception ex; 373 struct interp *save_command_interp; 374 375 /* See `command_interp' for why we do this. */ 376 save_command_interp = ui_interp->command_interpreter; 377 ui_interp->command_interpreter = interp; 378 379 ex = interp->exec (command_str); 380 381 ui_interp->command_interpreter = save_command_interp; 382 383 return ex; 384 } 385 386 /* A convenience routine that nulls out all the common command hooks. 387 Use it when removing your interpreter in its suspend proc. */ 388 void 389 clear_interpreter_hooks (void) 390 { 391 deprecated_print_frame_info_listing_hook = 0; 392 /*print_frame_more_info_hook = 0; */ 393 deprecated_query_hook = 0; 394 deprecated_warning_hook = 0; 395 deprecated_interactive_hook = 0; 396 deprecated_readline_begin_hook = 0; 397 deprecated_readline_hook = 0; 398 deprecated_readline_end_hook = 0; 399 deprecated_context_hook = 0; 400 deprecated_target_wait_hook = 0; 401 deprecated_call_command_hook = 0; 402 deprecated_error_begin_hook = 0; 403 } 404 405 static void 406 interpreter_exec_cmd (char *args, int from_tty) 407 { 408 struct ui_interp_info *ui_interp = get_current_interp_info (); 409 struct interp *old_interp, *interp_to_use; 410 char **prules = NULL; 411 char **trule = NULL; 412 unsigned int nrules; 413 unsigned int i; 414 struct cleanup *cleanup; 415 416 if (args == NULL) 417 error_no_arg (_("interpreter-exec command")); 418 419 prules = gdb_buildargv (args); 420 cleanup = make_cleanup_freeargv (prules); 421 422 nrules = 0; 423 for (trule = prules; *trule != NULL; trule++) 424 nrules++; 425 426 if (nrules < 2) 427 error (_("usage: interpreter-exec <interpreter> [ <command> ... ]")); 428 429 old_interp = ui_interp->current_interpreter; 430 431 interp_to_use = interp_lookup (current_ui, prules[0]); 432 if (interp_to_use == NULL) 433 error (_("Could not find interpreter \"%s\"."), prules[0]); 434 435 interp_set (interp_to_use, false); 436 437 for (i = 1; i < nrules; i++) 438 { 439 struct gdb_exception e = interp_exec (interp_to_use, prules[i]); 440 441 if (e.reason < 0) 442 { 443 interp_set (old_interp, 0); 444 error (_("error in command: \"%s\"."), prules[i]); 445 } 446 } 447 448 interp_set (old_interp, 0); 449 450 do_cleanups (cleanup); 451 } 452 453 /* See interps.h. */ 454 455 VEC (char_ptr) * 456 interpreter_completer (struct cmd_list_element *ignore, 457 const char *text, const char *word) 458 { 459 struct interp_factory *interp; 460 int textlen; 461 VEC (char_ptr) *matches = NULL; 462 int ix; 463 464 textlen = strlen (text); 465 for (ix = 0; 466 VEC_iterate (interp_factory_p, interpreter_factories, ix, interp); 467 ++ix) 468 { 469 if (strncmp (interp->name, text, textlen) == 0) 470 { 471 char *match; 472 473 match = (char *) xmalloc (strlen (word) + strlen (interp->name) + 1); 474 if (word == text) 475 strcpy (match, interp->name); 476 else if (word > text) 477 { 478 /* Return some portion of interp->name. */ 479 strcpy (match, interp->name + (word - text)); 480 } 481 else 482 { 483 /* Return some of text plus interp->name. */ 484 strncpy (match, word, text - word); 485 match[text - word] = '\0'; 486 strcat (match, interp->name); 487 } 488 VEC_safe_push (char_ptr, matches, match); 489 } 490 } 491 492 return matches; 493 } 494 495 struct interp * 496 top_level_interpreter (void) 497 { 498 struct ui_interp_info *ui_interp = get_current_interp_info (); 499 500 return ui_interp->top_level_interpreter; 501 } 502 503 /* See interps.h. */ 504 505 struct interp * 506 current_interpreter (void) 507 { 508 struct ui_interp_info *ui_interp = get_interp_info (current_ui); 509 510 return ui_interp->current_interpreter; 511 } 512 513 /* This just adds the "interpreter-exec" command. */ 514 void 515 _initialize_interpreter (void) 516 { 517 struct cmd_list_element *c; 518 519 c = add_cmd ("interpreter-exec", class_support, 520 interpreter_exec_cmd, _("\ 521 Execute a command in an interpreter. It takes two arguments:\n\ 522 The first argument is the name of the interpreter to use.\n\ 523 The second argument is the command to execute.\n"), &cmdlist); 524 set_cmd_completer (c, interpreter_completer); 525 } 526