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