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