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