1 /* Manages interpreters for GDB, the GNU debugger.
2 
3    Copyright (C) 2000-2024 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 "cli/cli-cmds.h"
33 #include "ui-out.h"
34 #include "gdbsupport/event-loop.h"
35 #include "event-top.h"
36 #include "interps.h"
37 #include "completer.h"
38 #include "ui.h"
39 #include "main.h"
40 #include "gdbsupport/buildargv.h"
41 #include "gdbsupport/scope-exit.h"
42 
43 /* The magic initialization routine for this module.  */
44 
45 static struct interp *interp_lookup_existing (struct ui *ui,
46                                                         const char *name);
47 
interp(const char * name)48 interp::interp (const char *name)
49   : m_name (name)
50 {
51 }
52 
53 interp::~interp () = default;
54 
55 /* An interpreter factory.  Maps an interpreter name to the factory
56    function that instantiates an interpreter by that name.  */
57 
58 struct interp_factory
59 {
interp_factoryinterp_factory60   interp_factory (const char *name_, interp_factory_func func_)
61   : name (name_), func (func_)
62   {}
63 
64   /* This is the name in "-i=INTERP" and "interpreter-exec INTERP".  */
65   const char *name;
66 
67   /* The function that creates the interpreter.  */
68   interp_factory_func func;
69 };
70 
71 /* The registered interpreter factories.  */
72 static std::vector<interp_factory> interpreter_factories;
73 
74 /* See interps.h.  */
75 
76 void
interp_factory_register(const char * name,interp_factory_func func)77 interp_factory_register (const char *name, interp_factory_func func)
78 {
79   /* Assert that no factory for NAME is already registered.  */
80   for (const interp_factory &f : interpreter_factories)
81     if (strcmp (f.name, name) == 0)
82       {
83           internal_error (_("interpreter factory already registered: \"%s\"\n"),
84                               name);
85       }
86 
87   interpreter_factories.emplace_back (name, func);
88 }
89 
90 /* Add interpreter INTERP to the gdb interpreter list.  The
91    interpreter must not have previously been added.  */
92 static void
interp_add(struct ui * ui,struct interp * interp)93 interp_add (struct ui *ui, struct interp *interp)
94 {
95   gdb_assert (interp_lookup_existing (ui, interp->name ()) == NULL);
96 
97   ui->interp_list.push_back (*interp);
98 }
99 
100 /* This sets the current interpreter to be INTERP.  If INTERP has not
101    been initialized, then this will also run the init method.
102 
103    The TOP_LEVEL parameter tells if this new interpreter is
104    the top-level one.  The top-level is what is requested
105    on the command line, and is responsible for reporting general
106    notification about target state changes.  For example, if
107    MI is the top-level interpreter, then it will always report
108    events such as target stops and new thread creation, even if they
109    are caused by CLI commands.  */
110 
111 static void
interp_set(struct interp * interp,bool top_level)112 interp_set (struct interp *interp, bool top_level)
113 {
114   struct interp *old_interp = current_ui->current_interpreter;
115 
116   /* If we already have an interpreter, then trying to
117      set top level interpreter is kinda pointless.  */
118   gdb_assert (!top_level || !current_ui->current_interpreter);
119   gdb_assert (!top_level || !current_ui->top_level_interpreter);
120 
121   if (old_interp != NULL)
122     {
123       current_uiout->flush ();
124       old_interp->suspend ();
125     }
126 
127   current_ui->current_interpreter = interp;
128   if (top_level)
129     current_ui->top_level_interpreter = interp;
130 
131   if (interpreter_p != interp->name ())
132     interpreter_p = interp->name ();
133 
134   /* Run the init proc.  */
135   if (!interp->inited)
136     {
137       interp->init (top_level);
138       interp->inited = true;
139     }
140 
141   /* Do this only after the interpreter is initialized.  */
142   current_uiout = interp->interp_ui_out ();
143 
144   /* Clear out any installed interpreter hooks/event handlers.  */
145   clear_interpreter_hooks ();
146 
147   interp->resume ();
148 }
149 
150 /* Look up the interpreter for NAME.  If no such interpreter exists,
151    return NULL, otherwise return a pointer to the interpreter.  */
152 
153 static struct interp *
interp_lookup_existing(struct ui * ui,const char * name)154 interp_lookup_existing (struct ui *ui, const char *name)
155 {
156   for (interp &interp : ui->interp_list)
157     if (strcmp (interp.name (), name) == 0)
158       return &interp;
159 
160   return nullptr;
161 }
162 
163 /* See interps.h.  */
164 
165 struct interp *
interp_lookup(struct ui * ui,const char * name)166 interp_lookup (struct ui *ui, const char *name)
167 {
168   if (name == NULL || strlen (name) == 0)
169     return NULL;
170 
171   /* Only create each interpreter once per top level.  */
172   struct interp *interp = interp_lookup_existing (ui, name);
173   if (interp != NULL)
174     return interp;
175 
176   for (const interp_factory &factory : interpreter_factories)
177     if (strcmp (factory.name, name) == 0)
178       {
179           interp = factory.func (factory.name);
180           interp_add (ui, interp);
181           return interp;
182       }
183 
184   return NULL;
185 }
186 
187 /* See interps.h.  */
188 
189 void
set_top_level_interpreter(const char * name,bool for_new_ui)190 set_top_level_interpreter (const char *name, bool for_new_ui)
191 {
192   /* Find it.  */
193   struct interp *interp = interp_lookup (current_ui, name);
194 
195   if (interp == NULL)
196     error (_("Interpreter `%s' unrecognized"), name);
197   if (for_new_ui && !interp->supports_new_ui ())
198     error (_("interpreter '%s' cannot be used with a new UI"), name);
199 
200   /* Install it.  */
201   interp_set (interp, true);
202 }
203 
204 void
current_interp_set_logging(ui_file_up logfile,bool logging_redirect,bool debug_redirect)205 current_interp_set_logging (ui_file_up logfile, bool logging_redirect,
206                                   bool debug_redirect)
207 {
208   struct interp *interp = current_ui->current_interpreter;
209 
210   interp->set_logging (std::move (logfile), logging_redirect, debug_redirect);
211 }
212 
213 /* Temporarily overrides the current interpreter.  */
214 struct interp *
set_interp(const char * name)215 scoped_restore_interp::set_interp (const char *name)
216 {
217   struct interp *interp = interp_lookup (current_ui, name);
218   struct interp *old_interp = current_ui->current_interpreter;
219 
220   if (interp)
221     current_ui->current_interpreter = interp;
222 
223   return old_interp;
224 }
225 
226 /* Returns true if the current interp is the passed in name.  */
227 int
current_interp_named_p(const char * interp_name)228 current_interp_named_p (const char *interp_name)
229 {
230   interp *interp = current_ui->current_interpreter;
231 
232   if (interp != NULL)
233     return (strcmp (interp->name (), interp_name) == 0);
234 
235   return 0;
236 }
237 
238 /* The interpreter that was active when a command was executed.
239    Normally that'd always be CURRENT_INTERPRETER, except that MI's
240    -interpreter-exec command doesn't actually flip the current
241    interpreter when running its sub-command.  The
242    `command_interpreter' global tracks when interp_exec is called
243    (IOW, when -interpreter-exec is called).  If that is set, it is
244    INTERP in '-interpreter-exec INTERP "CMD"' or in 'interpreter-exec
245    INTERP "CMD".  Otherwise, interp_exec isn't active, and so the
246    interpreter running the command is the current interpreter.  */
247 
248 struct interp *
command_interp(void)249 command_interp (void)
250 {
251   if (current_ui->command_interpreter != nullptr)
252     return current_ui->command_interpreter;
253   else
254     return current_ui->current_interpreter;
255 }
256 
257 /* interp_exec - This executes COMMAND_STR in the current
258    interpreter.  */
259 
260 void
interp_exec(struct interp * interp,const char * command_str)261 interp_exec (struct interp *interp, const char *command_str)
262 {
263   /* See `command_interp' for why we do this.  */
264   scoped_restore save_command_interp
265     = make_scoped_restore (&current_ui->command_interpreter, interp);
266 
267   interp->exec (command_str);
268 }
269 
270 /* A convenience routine that nulls out all the common command hooks.
271    Use it when removing your interpreter in its suspend proc.  */
272 void
clear_interpreter_hooks(void)273 clear_interpreter_hooks (void)
274 {
275   deprecated_print_frame_info_listing_hook = 0;
276   /*print_frame_more_info_hook = 0; */
277   deprecated_query_hook = 0;
278   deprecated_readline_begin_hook = 0;
279   deprecated_readline_hook = 0;
280   deprecated_readline_end_hook = 0;
281   deprecated_context_hook = 0;
282   deprecated_call_command_hook = 0;
283   deprecated_error_begin_hook = 0;
284 }
285 
286 static void
interpreter_exec_cmd(const char * args,int from_tty)287 interpreter_exec_cmd (const char *args, int from_tty)
288 {
289   struct interp *interp_to_use;
290   unsigned int nrules;
291   unsigned int i;
292 
293   /* Interpreters may clobber stdout/stderr (e.g.  in mi_interp::resume at time
294      of writing), preserve their state here.  */
295   scoped_restore save_stdout = make_scoped_restore (&gdb_stdout);
296   scoped_restore save_stderr = make_scoped_restore (&gdb_stderr);
297   scoped_restore save_stdlog = make_scoped_restore (&gdb_stdlog);
298   scoped_restore save_stdtarg = make_scoped_restore (&gdb_stdtarg);
299 
300   if (args == NULL)
301     error_no_arg (_("interpreter-exec command"));
302 
303   gdb_argv prules (args);
304   nrules = prules.count ();
305 
306   if (nrules < 2)
307     error (_("Usage: interpreter-exec INTERPRETER COMMAND..."));
308 
309   interp *old_interp = current_ui->current_interpreter;
310 
311   interp_to_use = interp_lookup (current_ui, prules[0]);
312   if (interp_to_use == NULL)
313     error (_("Could not find interpreter \"%s\"."), prules[0]);
314 
315   interp_set (interp_to_use, false);
316   SCOPE_EXIT
317     {
318       interp_set (old_interp, false);
319     };
320 
321   for (i = 1; i < nrules; i++)
322     interp_exec (interp_to_use, prules[i]);
323 }
324 
325 /* See interps.h.  */
326 
327 void
interpreter_completer(struct cmd_list_element * ignore,completion_tracker & tracker,const char * text,const char * word)328 interpreter_completer (struct cmd_list_element *ignore,
329                            completion_tracker &tracker,
330                            const char *text, const char *word)
331 {
332   int textlen = strlen (text);
333 
334   for (const interp_factory &interp : interpreter_factories)
335     {
336       if (strncmp (interp.name, text, textlen) == 0)
337           {
338             tracker.add_completion
339               (make_completion_match_str (interp.name, text, word));
340           }
341     }
342 }
343 
344 struct interp *
top_level_interpreter(void)345 top_level_interpreter (void)
346 {
347   return current_ui->top_level_interpreter;
348 }
349 
350 /* See interps.h.  */
351 
352 struct interp *
current_interpreter(void)353 current_interpreter (void)
354 {
355   return current_ui->current_interpreter;
356 }
357 
358 /* Helper interps_notify_* functions.  Call METHOD on the top-level interpreter
359    of all UIs.  */
360 
361 template <typename MethodType, typename ...Args>
362 void
interps_notify(MethodType method,Args &&...args)363 interps_notify (MethodType method, Args&&... args)
364 {
365   SWITCH_THRU_ALL_UIS ()
366     {
367       interp *tli = top_level_interpreter ();
368       if (tli != nullptr)
369           (tli->*method) (std::forward<Args> (args)...);
370     }
371 }
372 
373 /* See interps.h.  */
374 
375 void
interps_notify_signal_received(gdb_signal sig)376 interps_notify_signal_received (gdb_signal sig)
377 {
378   interps_notify (&interp::on_signal_received, sig);
379 }
380 
381 /* See interps.h.  */
382 
383 void
interps_notify_signal_exited(gdb_signal sig)384 interps_notify_signal_exited (gdb_signal sig)
385 {
386   interps_notify (&interp::on_signal_exited, sig);
387 }
388 
389 /* See interps.h.  */
390 
391 void
interps_notify_no_history()392 interps_notify_no_history ()
393 {
394   interps_notify (&interp::on_no_history);
395 }
396 
397 /* See interps.h.  */
398 
399 void
interps_notify_normal_stop(bpstat * bs,int print_frame)400 interps_notify_normal_stop (bpstat *bs, int print_frame)
401 {
402   interps_notify (&interp::on_normal_stop, bs, print_frame);
403 }
404 
405 /* See interps.h.  */
406 
407 void
interps_notify_exited(int status)408 interps_notify_exited (int status)
409 {
410   interps_notify (&interp::on_exited, status);
411 }
412 
413 /* See interps.h.  */
414 
415 void
interps_notify_user_selected_context_changed(user_selected_what selection)416 interps_notify_user_selected_context_changed (user_selected_what selection)
417 {
418   interps_notify (&interp::on_user_selected_context_changed, selection);
419 }
420 
421 /* See interps.h.  */
422 
423 void
interps_notify_new_thread(thread_info * t)424 interps_notify_new_thread (thread_info *t)
425 {
426   interps_notify (&interp::on_new_thread, t);
427 }
428 
429 /* See interps.h.  */
430 
431 void
interps_notify_thread_exited(thread_info * t,std::optional<ULONGEST> exit_code,int silent)432 interps_notify_thread_exited (thread_info *t,
433                                     std::optional<ULONGEST> exit_code,
434                                     int silent)
435 {
436   interps_notify (&interp::on_thread_exited, t, exit_code, silent);
437 }
438 
439 /* See interps.h.  */
440 
441 void
interps_notify_inferior_added(inferior * inf)442 interps_notify_inferior_added (inferior *inf)
443 {
444   interps_notify (&interp::on_inferior_added, inf);
445 }
446 
447 /* See interps.h.  */
448 
449 void
interps_notify_inferior_appeared(inferior * inf)450 interps_notify_inferior_appeared (inferior *inf)
451 {
452   interps_notify (&interp::on_inferior_appeared, inf);
453 }
454 
455 /* See interps.h.  */
456 
457 void
interps_notify_inferior_disappeared(inferior * inf)458 interps_notify_inferior_disappeared (inferior *inf)
459 {
460   interps_notify (&interp::on_inferior_disappeared, inf);
461 }
462 
463 /* See interps.h.  */
464 
465 void
interps_notify_inferior_removed(inferior * inf)466 interps_notify_inferior_removed (inferior *inf)
467 {
468   interps_notify (&interp::on_inferior_removed, inf);
469 }
470 
471 /* See interps.h.  */
472 
473 void
interps_notify_record_changed(inferior * inf,int started,const char * method,const char * format)474 interps_notify_record_changed (inferior *inf, int started, const char *method,
475                                      const char *format)
476 {
477   interps_notify (&interp::on_record_changed, inf, started, method, format);
478 }
479 
480 /* See interps.h.  */
481 
482 void
interps_notify_target_resumed(ptid_t ptid)483 interps_notify_target_resumed (ptid_t ptid)
484 {
485   interps_notify (&interp::on_target_resumed, ptid);
486 }
487 
488 /* See interps.h.  */
489 
490 void
interps_notify_solib_loaded(const solib & so)491 interps_notify_solib_loaded (const solib &so)
492 {
493   interps_notify (&interp::on_solib_loaded, so);
494 }
495 
496 /* See interps.h.  */
497 
498 void
interps_notify_solib_unloaded(const solib & so)499 interps_notify_solib_unloaded (const solib &so)
500 {
501   interps_notify (&interp::on_solib_unloaded, so);
502 }
503 
504 /* See interps.h.  */
505 
506 void
interps_notify_traceframe_changed(int tfnum,int tpnum)507 interps_notify_traceframe_changed (int tfnum, int tpnum)
508 {
509   interps_notify (&interp::on_traceframe_changed, tfnum, tpnum);
510 }
511 
512 /* See interps.h.  */
513 
514 void
interps_notify_tsv_created(const trace_state_variable * tsv)515 interps_notify_tsv_created (const trace_state_variable *tsv)
516 {
517   interps_notify (&interp::on_tsv_created, tsv);
518 }
519 
520 /* See interps.h.  */
521 
522 void
interps_notify_tsv_deleted(const trace_state_variable * tsv)523 interps_notify_tsv_deleted (const trace_state_variable *tsv)
524 {
525   interps_notify (&interp::on_tsv_deleted, tsv);
526 }
527 
528 /* See interps.h.  */
529 
530 void
interps_notify_tsv_modified(const trace_state_variable * tsv)531 interps_notify_tsv_modified (const trace_state_variable *tsv)
532 {
533   interps_notify (&interp::on_tsv_modified, tsv);
534 }
535 
536 /* See interps.h.  */
537 
538 void
interps_notify_breakpoint_created(breakpoint * b)539 interps_notify_breakpoint_created (breakpoint *b)
540 {
541   interps_notify (&interp::on_breakpoint_created, b);
542 }
543 
544 /* See interps.h.  */
545 
546 void
interps_notify_breakpoint_deleted(breakpoint * b)547 interps_notify_breakpoint_deleted (breakpoint *b)
548 {
549   interps_notify (&interp::on_breakpoint_deleted, b);
550 }
551 
552 /* See interps.h.  */
553 
554 void
interps_notify_breakpoint_modified(breakpoint * b)555 interps_notify_breakpoint_modified (breakpoint *b)
556 {
557   interps_notify (&interp::on_breakpoint_modified, b);
558 }
559 
560 /* See interps.h.  */
561 
562 void
interps_notify_param_changed(const char * param,const char * value)563 interps_notify_param_changed (const char *param, const char *value)
564 {
565   interps_notify (&interp::on_param_changed, param, value);
566 }
567 
568 /* See interps.h.  */
569 
570 void
interps_notify_memory_changed(inferior * inf,CORE_ADDR addr,ssize_t len,const bfd_byte * data)571 interps_notify_memory_changed (inferior *inf, CORE_ADDR addr, ssize_t len,
572                                      const bfd_byte *data)
573 {
574   interps_notify (&interp::on_memory_changed, inf, addr, len, data);
575 }
576 
577 /* This just adds the "interpreter-exec" command.  */
578 void _initialize_interpreter ();
579 void
_initialize_interpreter()580 _initialize_interpreter ()
581 {
582   struct cmd_list_element *c;
583 
584   c = add_cmd ("interpreter-exec", class_support,
585                  interpreter_exec_cmd, _("\
586 Execute a command in an interpreter.\n\
587 Usage: interpreter-exec INTERPRETER COMMAND...\n\
588 The first argument is the name of the interpreter to use.\n\
589 The following arguments are the commands to execute.\n\
590 A command can have arguments, separated by spaces.\n\
591 These spaces must be escaped using \\ or the command\n\
592 and its arguments must be enclosed in double quotes."), &cmdlist);
593   set_cmd_completer (c, interpreter_completer);
594 }
595