]> Git Repo - binutils.git/blob - gdb/progspace.c
Update copyright year range in all GDB files.
[binutils.git] / gdb / progspace.c
1 /* Program and address space management, for GDB, the GNU debugger.
2
3    Copyright (C) 2009-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 "gdbcmd.h"
22 #include "objfiles.h"
23 #include "arch-utils.h"
24 #include "gdbcore.h"
25 #include "solib.h"
26 #include "solist.h"
27 #include "gdbthread.h"
28 #include "inferior.h"
29 #include <algorithm>
30
31 /* The last program space number assigned.  */
32 int last_program_space_num = 0;
33
34 /* The head of the program spaces list.  */
35 struct program_space *program_spaces;
36
37 /* Pointer to the current program space.  */
38 struct program_space *current_program_space;
39
40 /* The last address space number assigned.  */
41 static int highest_address_space_num;
42
43 \f
44
45 /* Keep a registry of per-program_space data-pointers required by other GDB
46    modules.  */
47
48 DEFINE_REGISTRY (program_space, REGISTRY_ACCESS_FIELD)
49
50 /* Keep a registry of per-address_space data-pointers required by other GDB
51    modules.  */
52
53 DEFINE_REGISTRY (address_space, REGISTRY_ACCESS_FIELD)
54
55 \f
56
57 /* Create a new address space object, and add it to the list.  */
58
59 struct address_space *
60 new_address_space (void)
61 {
62   struct address_space *aspace;
63
64   aspace = XCNEW (struct address_space);
65   aspace->num = ++highest_address_space_num;
66   address_space_alloc_data (aspace);
67
68   return aspace;
69 }
70
71 /* Maybe create a new address space object, and add it to the list, or
72    return a pointer to an existing address space, in case inferiors
73    share an address space on this target system.  */
74
75 struct address_space *
76 maybe_new_address_space (void)
77 {
78   int shared_aspace = gdbarch_has_shared_address_space (target_gdbarch ());
79
80   if (shared_aspace)
81     {
82       /* Just return the first in the list.  */
83       return program_spaces->aspace;
84     }
85
86   return new_address_space ();
87 }
88
89 static void
90 free_address_space (struct address_space *aspace)
91 {
92   address_space_free_data (aspace);
93   xfree (aspace);
94 }
95
96 int
97 address_space_num (struct address_space *aspace)
98 {
99   return aspace->num;
100 }
101
102 /* Start counting over from scratch.  */
103
104 static void
105 init_address_spaces (void)
106 {
107   highest_address_space_num = 0;
108 }
109
110 \f
111
112 /* Adds a new empty program space to the program space list, and binds
113    it to ASPACE.  Returns the pointer to the new object.  */
114
115 program_space::program_space (address_space *aspace_)
116 : num (++last_program_space_num), aspace (aspace_)
117 {
118   program_space_alloc_data (this);
119
120   if (program_spaces == NULL)
121     program_spaces = this;
122   else
123     {
124       struct program_space *last;
125
126       for (last = program_spaces; last->next != NULL; last = last->next)
127         ;
128       last->next = this;
129     }
130 }
131
132 /* Releases program space PSPACE, and all its contents (shared
133    libraries, objfiles, and any other references to the PSPACE in
134    other modules).  It is an internal error to call this when PSPACE
135    is the current program space, since there should always be a
136    program space.  */
137
138 program_space::~program_space ()
139 {
140   gdb_assert (this != current_program_space);
141
142   scoped_restore_current_program_space restore_pspace;
143
144   set_current_program_space (this);
145
146   breakpoint_program_space_exit (this);
147   no_shared_libraries (NULL, 0);
148   exec_close ();
149   free_all_objfiles ();
150   if (!gdbarch_has_shared_address_space (target_gdbarch ()))
151     free_address_space (this->aspace);
152   clear_section_table (&this->target_sections);
153   clear_program_space_solib_cache (this);
154     /* Discard any data modules have associated with the PSPACE.  */
155   program_space_free_data (this);
156 }
157
158 /* See progspace.h.  */
159
160 void
161 program_space::free_all_objfiles ()
162 {
163   struct so_list *so;
164
165   /* Any objfile reference would become stale.  */
166   for (so = master_so_list (); so; so = so->next)
167     gdb_assert (so->objfile == NULL);
168
169   while (!objfiles_list.empty ())
170     objfiles_list.front ()->unlink ();
171
172   clear_symtab_users (0);
173 }
174
175 /* See progspace.h.  */
176
177 void
178 program_space::add_objfile (std::shared_ptr<objfile> &&objfile,
179                             struct objfile *before)
180 {
181   if (before == nullptr)
182     objfiles_list.push_back (std::move (objfile));
183   else
184     {
185       auto iter = std::find_if (objfiles_list.begin (), objfiles_list.end (),
186                                 [=] (const std::shared_ptr<::objfile> &objf)
187                                 {
188                                   return objf.get () == before;
189                                 });
190       gdb_assert (iter != objfiles_list.end ());
191       objfiles_list.insert (iter, std::move (objfile));
192     }
193 }
194
195 /* See progspace.h.  */
196
197 void
198 program_space::remove_objfile (struct objfile *objfile)
199 {
200   auto iter = std::find_if (objfiles_list.begin (), objfiles_list.end (),
201                             [=] (const std::shared_ptr<::objfile> &objf)
202                             {
203                               return objf.get () == objfile;
204                             });
205   gdb_assert (iter != objfiles_list.end ());
206   objfiles_list.erase (iter);
207
208   if (objfile == symfile_object_file)
209     symfile_object_file = NULL;
210 }
211
212 /* Copies program space SRC to DEST.  Copies the main executable file,
213    and the main symbol file.  Returns DEST.  */
214
215 struct program_space *
216 clone_program_space (struct program_space *dest, struct program_space *src)
217 {
218   scoped_restore_current_program_space restore_pspace;
219
220   set_current_program_space (dest);
221
222   if (src->pspace_exec_filename != NULL)
223     exec_file_attach (src->pspace_exec_filename, 0);
224
225   if (src->symfile_object_file != NULL)
226     symbol_file_add_main (objfile_name (src->symfile_object_file),
227                           SYMFILE_DEFER_BP_RESET);
228
229   return dest;
230 }
231
232 /* Sets PSPACE as the current program space.  It is the caller's
233    responsibility to make sure that the currently selected
234    inferior/thread matches the selected program space.  */
235
236 void
237 set_current_program_space (struct program_space *pspace)
238 {
239   if (current_program_space == pspace)
240     return;
241
242   gdb_assert (pspace != NULL);
243
244   current_program_space = pspace;
245
246   /* Different symbols change our view of the frame chain.  */
247   reinit_frame_cache ();
248 }
249
250 /* Returns true iff there's no inferior bound to PSPACE.  */
251
252 int
253 program_space_empty_p (struct program_space *pspace)
254 {
255   if (find_inferior_for_program_space (pspace) != NULL)
256       return 0;
257
258   return 1;
259 }
260
261 /* Remove a program space from the program spaces list and release it.  It is
262    an error to call this function while PSPACE is the current program space. */
263
264 void
265 delete_program_space (struct program_space *pspace)
266 {
267   struct program_space *ss, **ss_link;
268   gdb_assert (pspace != NULL);
269   gdb_assert (pspace != current_program_space);
270
271   ss = program_spaces;
272   ss_link = &program_spaces;
273   while (ss != NULL)
274     {
275       if (ss == pspace)
276         {
277           *ss_link = ss->next;
278           break;
279         }
280
281       ss_link = &ss->next;
282       ss = *ss_link;
283     }
284
285   delete pspace;
286 }
287
288 /* Prints the list of program spaces and their details on UIOUT.  If
289    REQUESTED is not -1, it's the ID of the pspace that should be
290    printed.  Otherwise, all spaces are printed.  */
291
292 static void
293 print_program_space (struct ui_out *uiout, int requested)
294 {
295   struct program_space *pspace;
296   int count = 0;
297
298   /* Compute number of pspaces we will print.  */
299   ALL_PSPACES (pspace)
300     {
301       if (requested != -1 && pspace->num != requested)
302         continue;
303
304       ++count;
305     }
306
307   /* There should always be at least one.  */
308   gdb_assert (count > 0);
309
310   ui_out_emit_table table_emitter (uiout, 3, count, "pspaces");
311   uiout->table_header (1, ui_left, "current", "");
312   uiout->table_header (4, ui_left, "id", "Id");
313   uiout->table_header (17, ui_left, "exec", "Executable");
314   uiout->table_body ();
315
316   ALL_PSPACES (pspace)
317     {
318       struct inferior *inf;
319       int printed_header;
320
321       if (requested != -1 && requested != pspace->num)
322         continue;
323
324       ui_out_emit_tuple tuple_emitter (uiout, NULL);
325
326       if (pspace == current_program_space)
327         uiout->field_string ("current", "*");
328       else
329         uiout->field_skip ("current");
330
331       uiout->field_signed ("id", pspace->num);
332
333       if (pspace->pspace_exec_filename)
334         uiout->field_string ("exec", pspace->pspace_exec_filename);
335       else
336         uiout->field_skip ("exec");
337
338       /* Print extra info that doesn't really fit in tabular form.
339          Currently, we print the list of inferiors bound to a pspace.
340          There can be more than one inferior bound to the same pspace,
341          e.g., both parent/child inferiors in a vfork, or, on targets
342          that share pspaces between inferiors.  */
343       printed_header = 0;
344       for (inf = inferior_list; inf; inf = inf->next)
345         if (inf->pspace == pspace)
346           {
347             if (!printed_header)
348               {
349                 printed_header = 1;
350                 printf_filtered ("\n\tBound inferiors: ID %d (%s)",
351                                  inf->num,
352                                  target_pid_to_str (ptid_t (inf->pid)).c_str ());
353               }
354             else
355               printf_filtered (", ID %d (%s)",
356                                inf->num,
357                                target_pid_to_str (ptid_t (inf->pid)).c_str ());
358           }
359
360       uiout->text ("\n");
361     }
362 }
363
364 /* Boolean test for an already-known program space id.  */
365
366 static int
367 valid_program_space_id (int num)
368 {
369   struct program_space *pspace;
370
371   ALL_PSPACES (pspace)
372     if (pspace->num == num)
373       return 1;
374
375   return 0;
376 }
377
378 /* If ARGS is NULL or empty, print information about all program
379    spaces.  Otherwise, ARGS is a text representation of a LONG
380    indicating which the program space to print information about.  */
381
382 static void
383 maintenance_info_program_spaces_command (const char *args, int from_tty)
384 {
385   int requested = -1;
386
387   if (args && *args)
388     {
389       requested = parse_and_eval_long (args);
390       if (!valid_program_space_id (requested))
391         error (_("program space ID %d not known."), requested);
392     }
393
394   print_program_space (current_uiout, requested);
395 }
396
397 /* Simply returns the count of program spaces.  */
398
399 int
400 number_of_program_spaces (void)
401 {
402   struct program_space *pspace;
403   int count = 0;
404
405   ALL_PSPACES (pspace)
406     count++;
407
408   return count;
409 }
410
411 /* Update all program spaces matching to address spaces.  The user may
412    have created several program spaces, and loaded executables into
413    them before connecting to the target interface that will create the
414    inferiors.  All that happens before GDB has a chance to know if the
415    inferiors will share an address space or not.  Call this after
416    having connected to the target interface and having fetched the
417    target description, to fixup the program/address spaces mappings.
418
419    It is assumed that there are no bound inferiors yet, otherwise,
420    they'd be left with stale referenced to released aspaces.  */
421
422 void
423 update_address_spaces (void)
424 {
425   int shared_aspace = gdbarch_has_shared_address_space (target_gdbarch ());
426   struct program_space *pspace;
427   struct inferior *inf;
428
429   init_address_spaces ();
430
431   if (shared_aspace)
432     {
433       struct address_space *aspace = new_address_space ();
434
435       free_address_space (current_program_space->aspace);
436       ALL_PSPACES (pspace)
437         pspace->aspace = aspace;
438     }
439   else
440     ALL_PSPACES (pspace)
441       {
442         free_address_space (pspace->aspace);
443         pspace->aspace = new_address_space ();
444       }
445
446   for (inf = inferior_list; inf; inf = inf->next)
447     if (gdbarch_has_global_solist (target_gdbarch ()))
448       inf->aspace = maybe_new_address_space ();
449     else
450       inf->aspace = inf->pspace->aspace;
451 }
452
453 \f
454
455 /* See progspace.h.  */
456
457 void
458 clear_program_space_solib_cache (struct program_space *pspace)
459 {
460   pspace->added_solibs.clear ();
461   pspace->deleted_solibs.clear ();
462 }
463
464 \f
465
466 void
467 initialize_progspace (void)
468 {
469   add_cmd ("program-spaces", class_maintenance,
470            maintenance_info_program_spaces_command,
471            _("Info about currently known program spaces."),
472            &maintenanceinfolist);
473
474   /* There's always one program space.  Note that this function isn't
475      an automatic _initialize_foo function, since other
476      _initialize_foo routines may need to install their per-pspace
477      data keys.  We can only allocate a progspace when all those
478      modules have done that.  Do this before
479      initialize_current_architecture, because that accesses exec_bfd,
480      which in turn dereferences current_program_space.  */
481   current_program_space = new program_space (new_address_space ());
482 }
This page took 0.052323 seconds and 4 git commands to generate.