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