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