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