Change regcache list to be an hash map
[deliverable/binutils-gdb.git] / gdb / inferior.c
CommitLineData
b77209e0
PA
1/* Multi-process control for GDB, the GNU debugger.
2
b811d2c2 3 Copyright (C) 2008-2020 Free Software Foundation, Inc.
b77209e0
PA
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"
6c95b8df 21#include "exec.h"
b77209e0
PA
22#include "inferior.h"
23#include "target.h"
24#include "command.h"
06da564e 25#include "completer.h"
b77209e0
PA
26#include "gdbcmd.h"
27#include "gdbthread.h"
28#include "ui-out.h"
76727919 29#include "observable.h"
6c95b8df
PA
30#include "gdbcore.h"
31#include "symfile.h"
268a13a5 32#include "gdbsupport/environ.h"
c82c0b55 33#include "cli/cli-utils.h"
be34f849 34#include "continuations.h"
6ecd4729
PA
35#include "arch-utils.h"
36#include "target-descriptions.h"
47902076 37#include "readline/tilde.h"
5ed8105e 38#include "progspace-and-thread.h"
b77209e0 39
8e260fc0
TT
40/* Keep a registry of per-inferior data-pointers required by other GDB
41 modules. */
42
6b81941e 43DEFINE_REGISTRY (inferior, REGISTRY_ACCESS_FIELD)
6c95b8df
PA
44
45struct inferior *inferior_list = NULL;
b77209e0
PA
46static int highest_inferior_num;
47
f67c0c91 48/* See inferior.h. */
491144b5 49bool print_inferior_events = true;
b77209e0 50
3a3fd0fd
PA
51/* The Current Inferior. This is a strong reference. I.e., whenever
52 an inferior is the current inferior, its refcount is
53 incremented. */
6c95b8df
PA
54static struct inferior *current_inferior_ = NULL;
55
b77209e0
PA
56struct inferior*
57current_inferior (void)
58{
6c95b8df
PA
59 return current_inferior_;
60}
61
62void
63set_current_inferior (struct inferior *inf)
64{
65 /* There's always an inferior. */
66 gdb_assert (inf != NULL);
67
3a3fd0fd
PA
68 inf->incref ();
69 current_inferior_->decref ();
6c95b8df
PA
70 current_inferior_ = inf;
71}
72
089354bb
SM
73private_inferior::~private_inferior () = default;
74
0550c955 75inferior::~inferior ()
b77209e0 76{
0550c955
PA
77 inferior *inf = this;
78
e0ba6746 79 discard_all_inferior_continuations (inf);
6c95b8df 80 inferior_free_data (inf);
3f81c18a 81 xfree (inf->args);
6ecd4729 82 target_desc_info_free (inf->tdesc_info);
0550c955
PA
83}
84
85inferior::inferior (int pid_)
86 : num (++highest_inferior_num),
87 pid (pid_),
9a6c7d9c 88 environment (gdb_environ::from_host_environ ()),
0550c955
PA
89 registry_data ()
90{
0550c955 91 inferior_alloc_data (this);
5b6d1e4f
PA
92
93 m_target_stack.push (get_dummy_target ());
b77209e0
PA
94}
95
05779d57
PA
96void
97inferior::set_tty (const char *terminal_name)
98{
99 if (terminal_name != nullptr && *terminal_name != '\0')
100 m_terminal = make_unique_xstrdup (terminal_name);
101 else
102 m_terminal = NULL;
103}
104
105const char *
106inferior::tty ()
107{
108 return m_terminal.get ();
109}
110
b77209e0
PA
111struct inferior *
112add_inferior_silent (int pid)
113{
0550c955 114 inferior *inf = new inferior (pid);
b05b1202
PA
115
116 if (inferior_list == NULL)
117 inferior_list = inf;
118 else
119 {
0550c955 120 inferior *last;
b05b1202
PA
121
122 for (last = inferior_list; last->next != NULL; last = last->next)
123 ;
124 last->next = inf;
125 }
b77209e0 126
76727919 127 gdb::observers::inferior_added.notify (inf);
a79b8f6e 128
6c95b8df
PA
129 if (pid != 0)
130 inferior_appeared (inf, pid);
a562dc8f 131
b77209e0
PA
132 return inf;
133}
134
135struct inferior *
136add_inferior (int pid)
137{
138 struct inferior *inf = add_inferior_silent (pid);
139
140 if (print_inferior_events)
151bb4a5
PA
141 {
142 if (pid != 0)
143 printf_unfiltered (_("[New inferior %d (%s)]\n"),
144 inf->num,
a068643d 145 target_pid_to_str (ptid_t (pid)).c_str ());
151bb4a5
PA
146 else
147 printf_unfiltered (_("[New inferior %d]\n"), inf->num);
148 }
b77209e0
PA
149
150 return inf;
151}
152
a79b8f6e 153void
7a41607e 154delete_inferior (struct inferior *todel)
b77209e0
PA
155{
156 struct inferior *inf, *infprev;
b77209e0
PA
157
158 infprev = NULL;
159
160 for (inf = inferior_list; inf; infprev = inf, inf = inf->next)
6c95b8df 161 if (inf == todel)
b77209e0
PA
162 break;
163
164 if (!inf)
165 return;
166
08036331
PA
167 for (thread_info *tp : inf->threads_safe ())
168 delete_thread_silent (tp);
4a92f99b 169
7e1789f5
PA
170 if (infprev)
171 infprev->next = inf->next;
172 else
173 inferior_list = inf->next;
174
76727919 175 gdb::observers::inferior_removed.notify (inf);
a79b8f6e 176
7a41607e
SM
177 /* If this program space is rendered useless, remove it. */
178 if (program_space_empty_p (inf->pspace))
381ce63f 179 delete inf->pspace;
ef3f321b 180
0550c955 181 delete inf;
ef3f321b
SM
182}
183
6c95b8df
PA
184/* If SILENT then be quiet -- don't announce a inferior exit, or the
185 exit of its threads. */
186
187static void
188exit_inferior_1 (struct inferior *inftoex, int silent)
189{
190 struct inferior *inf;
6c95b8df
PA
191
192 for (inf = inferior_list; inf; inf = inf->next)
193 if (inf == inftoex)
194 break;
195
196 if (!inf)
197 return;
198
08036331
PA
199 for (thread_info *tp : inf->threads_safe ())
200 {
201 if (silent)
202 delete_thread_silent (tp);
203 else
204 delete_thread (tp);
205 }
6c95b8df 206
b930cab1
SM
207 inf->thread_map.clear ();
208
76727919 209 gdb::observers::inferior_exit.notify (inf);
6c95b8df
PA
210
211 inf->pid = 0;
9ab8741a 212 inf->fake_pid_p = false;
ef4a3395
PA
213 inf->priv = NULL;
214
6c95b8df
PA
215 if (inf->vfork_parent != NULL)
216 {
217 inf->vfork_parent->vfork_child = NULL;
218 inf->vfork_parent = NULL;
219 }
68c9da30
PA
220 if (inf->vfork_child != NULL)
221 {
222 inf->vfork_child->vfork_parent = NULL;
223 inf->vfork_child = NULL;
224 }
8cf64490 225
68c9da30 226 inf->pending_detach = 0;
85046ae2 227 /* Reset it. */
ee841dd8 228 inf->control = inferior_control_state (NO_STOP_QUIETLY);
66452beb
PW
229
230 /* Clear the register cache and the frame cache. */
231 registers_changed ();
232 reinit_frame_cache ();
6c95b8df
PA
233}
234
235void
00431a78 236exit_inferior (inferior *inf)
6c95b8df 237{
6c95b8df 238 exit_inferior_1 (inf, 0);
6c95b8df
PA
239}
240
00431a78
PA
241void
242exit_inferior_silent (inferior *inf)
243{
244 exit_inferior_1 (inf, 1);
245}
246
bc09b0c1
SM
247/* See inferior.h. */
248
b77209e0 249void
bc09b0c1 250detach_inferior (inferior *inf)
b77209e0 251{
bc09b0c1
SM
252 /* Save the pid, since exit_inferior_1 will reset it. */
253 int pid = inf->pid;
abbb1732 254
3b462ec2 255 exit_inferior_1 (inf, 0);
b77209e0
PA
256
257 if (print_inferior_events)
f67c0c91
SDJ
258 printf_unfiltered (_("[Inferior %d (%s) detached]\n"),
259 inf->num,
a068643d 260 target_pid_to_str (ptid_t (pid)).c_str ());
b77209e0
PA
261}
262
6c95b8df
PA
263void
264inferior_appeared (struct inferior *inf, int pid)
265{
08036331
PA
266 /* If this is the first inferior with threads, reset the global
267 thread id. */
873657b9 268 delete_exited_threads ();
08036331
PA
269 if (!any_thread_p ())
270 init_thread_list ();
271
6c95b8df 272 inf->pid = pid;
2ddf4301
SM
273 inf->has_exit_code = 0;
274 inf->exit_code = 0;
6c95b8df 275
76727919 276 gdb::observers::inferior_appeared.notify (inf);
6c95b8df
PA
277}
278
6c95b8df 279struct inferior *
b77209e0
PA
280find_inferior_id (int num)
281{
08036331 282 for (inferior *inf : all_inferiors ())
b77209e0
PA
283 if (inf->num == num)
284 return inf;
285
286 return NULL;
287}
288
289struct inferior *
5b6d1e4f 290find_inferior_pid (process_stratum_target *targ, int pid)
b77209e0 291{
6c95b8df
PA
292 /* Looking for inferior pid == 0 is always wrong, and indicative of
293 a bug somewhere else. There may be more than one with pid == 0,
294 for instance. */
295 gdb_assert (pid != 0);
296
5b6d1e4f 297 for (inferior *inf : all_inferiors (targ))
b77209e0
PA
298 if (inf->pid == pid)
299 return inf;
300
301 return NULL;
302}
303
c9657e70
SM
304/* See inferior.h */
305
306struct inferior *
5b6d1e4f 307find_inferior_ptid (process_stratum_target *targ, ptid_t ptid)
c9657e70 308{
5b6d1e4f 309 return find_inferior_pid (targ, ptid.pid ());
c9657e70
SM
310}
311
32990ada 312/* See inferior.h. */
6c95b8df
PA
313
314struct inferior *
315find_inferior_for_program_space (struct program_space *pspace)
316{
08036331 317 struct inferior *cur_inf = current_inferior ();
32990ada 318
08036331
PA
319 if (cur_inf->pspace == pspace)
320 return cur_inf;
6c95b8df 321
08036331
PA
322 for (inferior *inf : all_inferiors ())
323 if (inf->pspace == pspace)
324 return inf;
6c95b8df
PA
325
326 return NULL;
327}
328
b77209e0
PA
329int
330have_inferiors (void)
331{
08036331
PA
332 for (inferior *inf ATTRIBUTE_UNUSED : all_non_exited_inferiors ())
333 return 1;
6c95b8df
PA
334
335 return 0;
b77209e0
PA
336}
337
8020350c
DB
338/* Return the number of live inferiors. We account for the case
339 where an inferior might have a non-zero pid but no threads, as
340 in the middle of a 'mourn' operation. */
341
c35b1492 342int
5b6d1e4f 343number_of_live_inferiors (process_stratum_target *proc_target)
c35b1492 344{
8020350c 345 int num_inf = 0;
6c95b8df 346
5b6d1e4f 347 for (inferior *inf : all_non_exited_inferiors (proc_target))
5018ce90 348 if (inf->has_execution ())
08036331
PA
349 for (thread_info *tp ATTRIBUTE_UNUSED : inf->non_exited_threads ())
350 {
351 /* Found a live thread in this inferior, go to the next
352 inferior. */
353 ++num_inf;
354 break;
355 }
cd2effb2 356
8020350c
DB
357 return num_inf;
358}
359
360/* Return true if there is at least one live inferior. */
361
362int
363have_live_inferiors (void)
364{
5b6d1e4f 365 return number_of_live_inferiors (NULL) > 0;
6c95b8df
PA
366}
367
bed8455c
DE
368/* Prune away any unused inferiors, and then prune away no longer used
369 program spaces. */
6c95b8df
PA
370
371void
372prune_inferiors (void)
373{
908641f5 374 inferior *ss;
6c95b8df
PA
375
376 ss = inferior_list;
6c95b8df
PA
377 while (ss)
378 {
3a3fd0fd 379 if (!ss->deletable ()
6c95b8df
PA
380 || !ss->removable
381 || ss->pid != 0)
382 {
908641f5 383 ss = ss->next;
6c95b8df
PA
384 continue;
385 }
386
908641f5 387 inferior *ss_next = ss->next;
7a41607e 388 delete_inferior (ss);
908641f5 389 ss = ss_next;
6c95b8df 390 }
6c95b8df
PA
391}
392
393/* Simply returns the count of inferiors. */
394
395int
396number_of_inferiors (void)
397{
08036331
PA
398 auto rng = all_inferiors ();
399 return std::distance (rng.begin (), rng.end ());
c35b1492
PA
400}
401
db2b9fdd
PA
402/* Converts an inferior process id to a string. Like
403 target_pid_to_str, but special cases the null process. */
404
a068643d 405static std::string
db2b9fdd
PA
406inferior_pid_to_str (int pid)
407{
408 if (pid != 0)
f2907e49 409 return target_pid_to_str (ptid_t (pid));
db2b9fdd
PA
410 else
411 return _("<null>");
412}
413
4034d0ff
AT
414/* See inferior.h. */
415
416void
417print_selected_inferior (struct ui_out *uiout)
418{
4034d0ff 419 struct inferior *inf = current_inferior ();
53488a6e 420 const char *filename = inf->pspace->pspace_exec_filename;
112e8700 421
53488a6e
TS
422 if (filename == NULL)
423 filename = _("<noexec>");
112e8700
SM
424
425 uiout->message (_("[Switching to inferior %d [%s] (%s)]\n"),
a068643d 426 inf->num, inferior_pid_to_str (inf->pid).c_str (), filename);
4034d0ff
AT
427}
428
121b3efd
PA
429/* Helper for print_inferior. Returns the 'connection-id' string for
430 PROC_TARGET. */
431
432static std::string
433uiout_field_connection (process_stratum_target *proc_target)
434{
435 if (proc_target == NULL)
436 {
437 return {};
438 }
439 else if (proc_target->connection_string () != NULL)
440 {
441 return string_printf ("%d (%s %s)",
442 proc_target->connection_number,
443 proc_target->shortname (),
444 proc_target->connection_string ());
445 }
446 else
447 {
448 return string_printf ("%d (%s)",
449 proc_target->connection_number,
450 proc_target->shortname ());
451 }
452}
453
b77209e0
PA
454/* Prints the list of inferiors and their details on UIOUT. This is a
455 version of 'info_inferior_command' suitable for use from MI.
456
c82c0b55
MS
457 If REQUESTED_INFERIORS is not NULL, it's a list of GDB ids of the
458 inferiors that should be printed. Otherwise, all inferiors are
459 printed. */
460
461static void
1d12d88f 462print_inferior (struct ui_out *uiout, const char *requested_inferiors)
b77209e0 463{
8bb318c6 464 int inf_count = 0;
121b3efd 465 size_t connection_id_len = 20;
b77209e0 466
8bb318c6 467 /* Compute number of inferiors we will print. */
08036331 468 for (inferior *inf : all_inferiors ())
8bb318c6 469 {
c82c0b55 470 if (!number_is_in_list (requested_inferiors, inf->num))
8bb318c6
TT
471 continue;
472
121b3efd
PA
473 std::string conn = uiout_field_connection (inf->process_target ());
474 if (connection_id_len < conn.size ())
475 connection_id_len = conn.size ();
476
8bb318c6
TT
477 ++inf_count;
478 }
479
480 if (inf_count == 0)
481 {
112e8700 482 uiout->message ("No inferiors.\n");
8bb318c6
TT
483 return;
484 }
485
121b3efd 486 ui_out_emit_table table_emitter (uiout, 5, inf_count, "inferiors");
112e8700
SM
487 uiout->table_header (1, ui_left, "current", "");
488 uiout->table_header (4, ui_left, "number", "Num");
489 uiout->table_header (17, ui_left, "target-id", "Description");
121b3efd
PA
490 uiout->table_header (connection_id_len, ui_left,
491 "connection-id", "Connection");
112e8700 492 uiout->table_header (17, ui_left, "exec", "Executable");
b77209e0 493
112e8700 494 uiout->table_body ();
d9ebdab7
TBA
495
496 /* Restore the current thread after the loop because we switch the
497 inferior in the loop. */
498 scoped_restore_current_pspace_and_thread restore_pspace_thread;
499 inferior *current_inf = current_inferior ();
08036331 500 for (inferior *inf : all_inferiors ())
b77209e0 501 {
c82c0b55 502 if (!number_is_in_list (requested_inferiors, inf->num))
b77209e0
PA
503 continue;
504
2e783024 505 ui_out_emit_tuple tuple_emitter (uiout, NULL);
b77209e0 506
d9ebdab7 507 if (inf == current_inf)
112e8700 508 uiout->field_string ("current", "*");
b77209e0 509 else
112e8700 510 uiout->field_skip ("current");
b77209e0 511
381befee 512 uiout->field_signed ("number", inf->num);
6c95b8df 513
d9ebdab7
TBA
514 /* Because target_pid_to_str uses current_top_target,
515 switch the inferior. */
516 switch_to_inferior_no_thread (inf);
517
112e8700 518 uiout->field_string ("target-id", inferior_pid_to_str (inf->pid));
6c95b8df 519
121b3efd
PA
520 std::string conn = uiout_field_connection (inf->process_target ());
521 uiout->field_string ("connection-id", conn.c_str ());
522
1f0c4988 523 if (inf->pspace->pspace_exec_filename != NULL)
112e8700 524 uiout->field_string ("exec", inf->pspace->pspace_exec_filename);
6c95b8df 525 else
112e8700 526 uiout->field_skip ("exec");
6c95b8df
PA
527
528 /* Print extra info that isn't really fit to always present in
529 tabular form. Currently we print the vfork parent/child
530 relationships, if any. */
531 if (inf->vfork_parent)
532 {
112e8700 533 uiout->text (_("\n\tis vfork child of inferior "));
381befee 534 uiout->field_signed ("vfork-parent", inf->vfork_parent->num);
6c95b8df
PA
535 }
536 if (inf->vfork_child)
537 {
112e8700 538 uiout->text (_("\n\tis vfork parent of inferior "));
381befee 539 uiout->field_signed ("vfork-child", inf->vfork_child->num);
6c95b8df 540 }
b77209e0 541
112e8700 542 uiout->text ("\n");
b77209e0 543 }
b77209e0
PA
544}
545
2277426b 546static void
e503b191 547detach_inferior_command (const char *args, int from_tty)
2277426b 548{
2277426b 549 if (!args || !*args)
af624141 550 error (_("Requires argument (inferior id(s) to detach)"));
2277426b 551
bfd28288
PA
552 number_or_range_parser parser (args);
553 while (!parser.finished ())
af624141 554 {
bfd28288 555 int num = parser.get_number ();
2277426b 556
00431a78
PA
557 inferior *inf = find_inferior_id (num);
558 if (inf == NULL)
af624141
MS
559 {
560 warning (_("Inferior ID %d not known."), num);
561 continue;
562 }
2277426b 563
00431a78 564 if (inf->pid == 0)
e3ae3c43
PP
565 {
566 warning (_("Inferior ID %d is not running."), num);
567 continue;
568 }
2277426b 569
00431a78
PA
570 thread_info *tp = any_thread_of_inferior (inf);
571 if (tp == NULL)
af624141
MS
572 {
573 warning (_("Inferior ID %d has no threads."), num);
574 continue;
575 }
2277426b 576
00431a78 577 switch_to_thread (tp);
2277426b 578
af624141
MS
579 detach_command (NULL, from_tty);
580 }
2277426b
PA
581}
582
583static void
e503b191 584kill_inferior_command (const char *args, int from_tty)
2277426b 585{
2277426b 586 if (!args || !*args)
af624141 587 error (_("Requires argument (inferior id(s) to kill)"));
2277426b 588
bfd28288
PA
589 number_or_range_parser parser (args);
590 while (!parser.finished ())
af624141 591 {
bfd28288 592 int num = parser.get_number ();
2277426b 593
00431a78
PA
594 inferior *inf = find_inferior_id (num);
595 if (inf == NULL)
af624141
MS
596 {
597 warning (_("Inferior ID %d not known."), num);
598 continue;
599 }
2277426b 600
00431a78 601 if (inf->pid == 0)
e3ae3c43
PP
602 {
603 warning (_("Inferior ID %d is not running."), num);
604 continue;
605 }
2277426b 606
00431a78
PA
607 thread_info *tp = any_thread_of_inferior (inf);
608 if (tp == NULL)
af624141
MS
609 {
610 warning (_("Inferior ID %d has no threads."), num);
611 continue;
612 }
2277426b 613
00431a78 614 switch_to_thread (tp);
2277426b 615
af624141
MS
616 target_kill ();
617 }
2277426b
PA
618
619 bfd_cache_close_all ();
620}
621
db2d40f7
PA
622/* See inferior.h. */
623
624void
625switch_to_inferior_no_thread (inferior *inf)
626{
627 set_current_inferior (inf);
628 switch_to_no_thread ();
629 set_current_program_space (inf->pspace);
630}
631
2277426b 632static void
e503b191 633inferior_command (const char *args, int from_tty)
2277426b 634{
6c95b8df
PA
635 struct inferior *inf;
636 int num;
2277426b
PA
637
638 num = parse_and_eval_long (args);
639
6c95b8df
PA
640 inf = find_inferior_id (num);
641 if (inf == NULL)
2277426b
PA
642 error (_("Inferior ID %d not known."), num);
643
6c95b8df 644 if (inf->pid != 0)
2277426b 645 {
00431a78 646 if (inf != current_inferior ())
6c95b8df 647 {
00431a78
PA
648 thread_info *tp = any_thread_of_inferior (inf);
649 if (tp == NULL)
6c95b8df 650 error (_("Inferior has no threads."));
2277426b 651
00431a78 652 switch_to_thread (tp);
6c95b8df
PA
653 }
654
76727919 655 gdb::observers::user_selected_context_changed.notify
4034d0ff
AT
656 (USER_SELECTED_INFERIOR
657 | USER_SELECTED_THREAD
658 | USER_SELECTED_FRAME);
2277426b 659 }
6c95b8df
PA
660 else
661 {
db2d40f7 662 switch_to_inferior_no_thread (inf);
2277426b 663
76727919
TT
664 gdb::observers::user_selected_context_changed.notify
665 (USER_SELECTED_INFERIOR);
2277426b
PA
666 }
667}
668
b77209e0
PA
669/* Print information about currently known inferiors. */
670
671static void
1d12d88f 672info_inferiors_command (const char *args, int from_tty)
b77209e0 673{
79a45e25 674 print_inferior (current_uiout, args);
b77209e0
PA
675}
676
6c95b8df
PA
677/* remove-inferior ID */
678
70221824 679static void
0b39b52e 680remove_inferior_command (const char *args, int from_tty)
6c95b8df 681{
af624141
MS
682 if (args == NULL || *args == '\0')
683 error (_("Requires an argument (inferior id(s) to remove)"));
6c95b8df 684
bfd28288
PA
685 number_or_range_parser parser (args);
686 while (!parser.finished ())
af624141 687 {
bfd28288
PA
688 int num = parser.get_number ();
689 struct inferior *inf = find_inferior_id (num);
6c95b8df 690
af624141
MS
691 if (inf == NULL)
692 {
693 warning (_("Inferior ID %d not known."), num);
694 continue;
695 }
696
3a3fd0fd 697 if (!inf->deletable ())
af624141 698 {
eb2332d7 699 warning (_("Can not remove current inferior %d."), num);
af624141
MS
700 continue;
701 }
8fa067af 702
af624141
MS
703 if (inf->pid != 0)
704 {
705 warning (_("Can not remove active inferior %d."), num);
706 continue;
707 }
6c95b8df 708
7a41607e 709 delete_inferior (inf);
af624141 710 }
6c95b8df
PA
711}
712
a79b8f6e
VP
713struct inferior *
714add_inferior_with_spaces (void)
715{
716 struct address_space *aspace;
717 struct program_space *pspace;
718 struct inferior *inf;
6ecd4729 719 struct gdbarch_info info;
a79b8f6e
VP
720
721 /* If all inferiors share an address space on this system, this
722 doesn't really return a new address space; otherwise, it
723 really does. */
724 aspace = maybe_new_address_space ();
564b1e3f 725 pspace = new program_space (aspace);
a79b8f6e
VP
726 inf = add_inferior (0);
727 inf->pspace = pspace;
728 inf->aspace = pspace->aspace;
729
6ecd4729
PA
730 /* Setup the inferior's initial arch, based on information obtained
731 from the global "set ..." options. */
732 gdbarch_info_init (&info);
733 inf->gdbarch = gdbarch_find_by_info (info);
734 /* The "set ..." options reject invalid settings, so we should
735 always have a valid arch by now. */
736 gdb_assert (inf->gdbarch != NULL);
737
a79b8f6e
VP
738 return inf;
739}
6c95b8df 740
5b6d1e4f
PA
741/* Switch to inferior NEW_INF, a new inferior, and unless
742 NO_CONNECTION is true, push the process_stratum_target of ORG_INF
743 to NEW_INF. */
744
745static void
746switch_to_inferior_and_push_target (inferior *new_inf,
747 bool no_connection, inferior *org_inf)
748{
749 process_stratum_target *proc_target = org_inf->process_target ();
750
751 /* Switch over temporarily, while reading executable and
752 symbols. */
753 switch_to_inferior_no_thread (new_inf);
754
755 /* Reuse the target for new inferior. */
756 if (!no_connection && proc_target != NULL)
121b3efd
PA
757 {
758 push_target (proc_target);
759 if (proc_target->connection_string () != NULL)
760 printf_filtered (_("Added inferior %d on connection %d (%s %s)\n"),
761 new_inf->num,
762 proc_target->connection_number,
763 proc_target->shortname (),
764 proc_target->connection_string ());
765 else
766 printf_filtered (_("Added inferior %d on connection %d (%s)\n"),
767 new_inf->num,
768 proc_target->connection_number,
769 proc_target->shortname ());
770 }
771 else
772 printf_filtered (_("Added inferior %d\n"), new_inf->num);
5b6d1e4f
PA
773}
774
775/* add-inferior [-copies N] [-exec FILENAME] [-no-connection] */
6c95b8df 776
70221824 777static void
0b39b52e 778add_inferior_command (const char *args, int from_tty)
6c95b8df
PA
779{
780 int i, copies = 1;
773a1edc 781 gdb::unique_xmalloc_ptr<char> exec;
ecf45d2c 782 symfile_add_flags add_flags = 0;
5b6d1e4f 783 bool no_connection = false;
6c95b8df 784
ecf45d2c
SL
785 if (from_tty)
786 add_flags |= SYMFILE_VERBOSE;
787
6c95b8df
PA
788 if (args)
789 {
773a1edc 790 gdb_argv built_argv (args);
6c95b8df 791
773a1edc 792 for (char **argv = built_argv.get (); *argv != NULL; argv++)
6c95b8df
PA
793 {
794 if (**argv == '-')
795 {
796 if (strcmp (*argv, "-copies") == 0)
797 {
798 ++argv;
799 if (!*argv)
800 error (_("No argument to -copies"));
801 copies = parse_and_eval_long (*argv);
802 }
5b6d1e4f
PA
803 else if (strcmp (*argv, "-no-connection") == 0)
804 no_connection = true;
6c95b8df
PA
805 else if (strcmp (*argv, "-exec") == 0)
806 {
807 ++argv;
808 if (!*argv)
809 error (_("No argument to -exec"));
773a1edc 810 exec.reset (tilde_expand (*argv));
6c95b8df
PA
811 }
812 }
813 else
814 error (_("Invalid argument"));
815 }
816 }
817
5b6d1e4f
PA
818 inferior *orginf = current_inferior ();
819
5ed8105e 820 scoped_restore_current_pspace_and_thread restore_pspace_thread;
6c95b8df
PA
821
822 for (i = 0; i < copies; ++i)
823 {
5b6d1e4f 824 inferior *inf = add_inferior_with_spaces ();
6c95b8df 825
5b6d1e4f 826 switch_to_inferior_and_push_target (inf, no_connection, orginf);
6c95b8df
PA
827
828 if (exec != NULL)
829 {
773a1edc
TT
830 exec_file_attach (exec.get (), from_tty);
831 symbol_file_add_main (exec.get (), add_flags);
6c95b8df
PA
832 }
833 }
6c95b8df
PA
834}
835
5b6d1e4f 836/* clone-inferior [-copies N] [ID] [-no-connection] */
6c95b8df 837
70221824 838static void
0b39b52e 839clone_inferior_command (const char *args, int from_tty)
6c95b8df
PA
840{
841 int i, copies = 1;
6c95b8df 842 struct inferior *orginf = NULL;
5b6d1e4f 843 bool no_connection = false;
6c95b8df
PA
844
845 if (args)
846 {
773a1edc 847 gdb_argv built_argv (args);
6c95b8df 848
773a1edc 849 char **argv = built_argv.get ();
6c95b8df
PA
850 for (; *argv != NULL; argv++)
851 {
852 if (**argv == '-')
853 {
854 if (strcmp (*argv, "-copies") == 0)
855 {
856 ++argv;
857 if (!*argv)
858 error (_("No argument to -copies"));
859 copies = parse_and_eval_long (*argv);
860
861 if (copies < 0)
862 error (_("Invalid copies number"));
863 }
5b6d1e4f
PA
864 else if (strcmp (*argv, "-no-connection") == 0)
865 no_connection = true;
6c95b8df
PA
866 }
867 else
868 {
869 if (orginf == NULL)
870 {
871 int num;
872
873 /* The first non-option (-) argument specified the
874 program space ID. */
875 num = parse_and_eval_long (*argv);
876 orginf = find_inferior_id (num);
877
878 if (orginf == NULL)
879 error (_("Inferior ID %d not known."), num);
880 continue;
881 }
882 else
883 error (_("Invalid argument"));
884 }
885 }
886 }
887
888 /* If no inferior id was specified, then the user wants to clone the
889 current inferior. */
890 if (orginf == NULL)
891 orginf = current_inferior ();
892
5ed8105e 893 scoped_restore_current_pspace_and_thread restore_pspace_thread;
6c95b8df
PA
894
895 for (i = 0; i < copies; ++i)
896 {
897 struct address_space *aspace;
898 struct program_space *pspace;
899 struct inferior *inf;
900
901 /* If all inferiors share an address space on this system, this
902 doesn't really return a new address space; otherwise, it
903 really does. */
904 aspace = maybe_new_address_space ();
564b1e3f 905 pspace = new program_space (aspace);
6c95b8df
PA
906 inf = add_inferior (0);
907 inf->pspace = pspace;
908 inf->aspace = pspace->aspace;
6ecd4729
PA
909 inf->gdbarch = orginf->gdbarch;
910
5b6d1e4f
PA
911 switch_to_inferior_and_push_target (inf, no_connection, orginf);
912
6ecd4729
PA
913 /* If the original inferior had a user specified target
914 description, make the clone use it too. */
915 if (target_desc_info_from_user_p (inf->tdesc_info))
916 copy_inferior_target_desc_info (inf, orginf);
6c95b8df 917
6c95b8df
PA
918 clone_program_space (pspace, orginf->pspace);
919 }
6c95b8df
PA
920}
921
b77209e0
PA
922/* Print notices when new inferiors are created and die. */
923static void
924show_print_inferior_events (struct ui_file *file, int from_tty,
925 struct cmd_list_element *c, const char *value)
926{
927 fprintf_filtered (file, _("Printing of inferior events is %s.\n"), value);
928}
929
e3940304
PA
930/* Return a new value for the selected inferior's id. */
931
932static struct value *
933inferior_id_make_value (struct gdbarch *gdbarch, struct internalvar *var,
934 void *ignore)
935{
936 struct inferior *inf = current_inferior ();
937
938 return value_from_longest (builtin_type (gdbarch)->builtin_int, inf->num);
939}
940
941/* Implementation of `$_inferior' variable. */
942
943static const struct internalvar_funcs inferior_funcs =
944{
945 inferior_id_make_value,
946 NULL,
947 NULL
948};
949
6c95b8df
PA
950\f
951
6c95b8df
PA
952void
953initialize_inferiors (void)
954{
06da564e
EZ
955 struct cmd_list_element *c = NULL;
956
6c95b8df
PA
957 /* There's always one inferior. Note that this function isn't an
958 automatic _initialize_foo function, since other _initialize_foo
959 routines may need to install their per-inferior data keys. We
960 can only allocate an inferior when all those modules have done
961 that. Do this after initialize_progspace, due to the
962 current_program_space reference. */
f67c0c91 963 current_inferior_ = add_inferior_silent (0);
3a3fd0fd 964 current_inferior_->incref ();
6c95b8df
PA
965 current_inferior_->pspace = current_program_space;
966 current_inferior_->aspace = current_program_space->aspace;
6ecd4729
PA
967 /* The architecture will be initialized shortly, by
968 initialize_current_architecture. */
6c95b8df 969
a3c25011
TT
970 add_info ("inferiors", info_inferiors_command,
971 _("Print a list of inferiors being managed.\n\
972Usage: info inferiors [ID]...\n\
973If IDs are specified, the list is limited to just those inferiors.\n\
974By default all inferiors are displayed."));
b77209e0 975
06da564e 976 c = add_com ("add-inferior", no_class, add_inferior_command, _("\
6c95b8df 977Add a new inferior.\n\
5b6d1e4f 978Usage: add-inferior [-copies N] [-exec FILENAME] [-no-connection]\n\
af624141 979N is the optional number of inferiors to add, default is 1.\n\
6c95b8df 980FILENAME is the file name of the executable to use\n\
5b6d1e4f
PA
981as main program.\n\
982By default, the new inferior inherits the current inferior's connection.\n\
983If -no-connection is specified, the new inferior begins with\n\
984no target connection yet."));
06da564e 985 set_cmd_completer (c, filename_completer);
6c95b8df 986
af624141
MS
987 add_com ("remove-inferiors", no_class, remove_inferior_command, _("\
988Remove inferior ID (or list of IDs).\n\
989Usage: remove-inferiors ID..."));
6c95b8df
PA
990
991 add_com ("clone-inferior", no_class, clone_inferior_command, _("\
992Clone inferior ID.\n\
5b6d1e4f
PA
993Usage: clone-inferior [-copies N] [-no-connection] [ID]\n\
994Add N copies of inferior ID. The new inferiors have the same\n\
6c95b8df
PA
995executable loaded as the copied inferior. If -copies is not specified,\n\
996adds 1 copy. If ID is not specified, it is the current inferior\n\
5b6d1e4f
PA
997that is cloned.\n\
998By default, the new inferiors inherit the copied inferior's connection.\n\
999If -no-connection is specified, the new inferiors begin with\n\
1000no target connection yet."));
2277426b 1001
af624141 1002 add_cmd ("inferiors", class_run, detach_inferior_command, _("\
a3c25011
TT
1003Detach from inferior ID (or list of IDS).\n\
1004Usage; detach inferiors ID..."),
2277426b
PA
1005 &detachlist);
1006
af624141 1007 add_cmd ("inferiors", class_run, kill_inferior_command, _("\
a3c25011
TT
1008Kill inferior ID (or list of IDs).\n\
1009Usage: kill inferiors ID..."),
2277426b
PA
1010 &killlist);
1011
1012 add_cmd ("inferior", class_run, inferior_command, _("\
1013Use this command to switch between inferiors.\n\
a3c25011 1014Usage: inferior ID\n\
2277426b
PA
1015The new inferior ID must be currently known."),
1016 &cmdlist);
6c95b8df
PA
1017
1018 add_setshow_boolean_cmd ("inferior-events", no_class,
1019 &print_inferior_events, _("\
e3abbe7e
PW
1020Set printing of inferior events (such as inferior start and exit)."), _("\
1021Show printing of inferior events (such as inferior start and exit)."), NULL,
6c95b8df
PA
1022 NULL,
1023 show_print_inferior_events,
1024 &setprintlist, &showprintlist);
1025
e3940304 1026 create_internalvar_type_lazy ("_inferior", &inferior_funcs, NULL);
b77209e0 1027}
This page took 1.088725 seconds and 4 git commands to generate.