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