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