]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/progspace.c
[gdb] Fix segfault in for_each_block, part 1
[thirdparty/binutils-gdb.git] / gdb / progspace.c
CommitLineData
6c95b8df
PA
1/* Program and address space management, for GDB, the GNU debugger.
2
213516ef 3 Copyright (C) 2009-2023 Free Software Foundation, Inc.
6c95b8df
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"
21#include "gdbcmd.h"
22#include "objfiles.h"
23#include "arch-utils.h"
24#include "gdbcore.h"
25#include "solib.h"
343cc952 26#include "solist.h"
6c95b8df 27#include "gdbthread.h"
00431a78 28#include "inferior.h"
d0801dd8 29#include <algorithm>
972f7a4b 30#include "cli/cli-style.h"
59912fb2 31#include "observable.h"
6c95b8df
PA
32
33/* The last program space number assigned. */
6bd434d6 34static int last_program_space_num = 0;
6c95b8df
PA
35
36/* The head of the program spaces list. */
94c93c35 37std::vector<struct program_space *> program_spaces;
6c95b8df
PA
38
39/* Pointer to the current program space. */
40struct program_space *current_program_space;
41
42/* The last address space number assigned. */
43static int highest_address_space_num;
44
8e260fc0
TT
45\f
46
6c95b8df
PA
47/* Create a new address space object, and add it to the list. */
48
b382c166
TT
49address_space::address_space ()
50 : m_num (++highest_address_space_num)
6c95b8df 51{
6c95b8df
PA
52}
53
54/* Maybe create a new address space object, and add it to the list, or
55 return a pointer to an existing address space, in case inferiors
56 share an address space on this target system. */
57
f9582a22
TV
58address_space_ref_ptr
59maybe_new_address_space ()
6c95b8df 60{
99d9c3b9
SM
61 int shared_aspace
62 = gdbarch_has_shared_address_space (current_inferior ()->arch ());
6c95b8df
PA
63
64 if (shared_aspace)
65 {
66 /* Just return the first in the list. */
94c93c35 67 return program_spaces[0]->aspace;
6c95b8df
PA
68 }
69
f9582a22 70 return new_address_space ();
6c95b8df
PA
71}
72
73/* Start counting over from scratch. */
74
75static void
76init_address_spaces (void)
77{
78 highest_address_space_num = 0;
79}
80
81\f
82
381ce63f
PA
83/* Remove a program space from the program spaces list. */
84
85static void
86remove_program_space (program_space *pspace)
87{
381ce63f
PA
88 gdb_assert (pspace != NULL);
89
94c93c35
TT
90 auto iter = std::find (program_spaces.begin (), program_spaces.end (),
91 pspace);
92 gdb_assert (iter != program_spaces.end ());
93 program_spaces.erase (iter);
381ce63f
PA
94}
95
96/* See progspace.h. */
97
f9582a22 98program_space::program_space (address_space_ref_ptr aspace_)
381ce63f 99 : num (++last_program_space_num),
f9582a22 100 aspace (std::move (aspace_))
381ce63f 101{
94c93c35 102 program_spaces.push_back (this);
59912fb2 103 gdb::observers::new_program_space.notify (this);
381ce63f
PA
104}
105
106/* See progspace.h. */
6c95b8df 107
564b1e3f 108program_space::~program_space ()
6c95b8df 109{
564b1e3f 110 gdb_assert (this != current_program_space);
6c95b8df 111
59912fb2 112 gdb::observers::free_program_space.notify (this);
381ce63f
PA
113 remove_program_space (this);
114
5ed8105e
PA
115 scoped_restore_current_program_space restore_pspace;
116
564b1e3f 117 set_current_program_space (this);
6c95b8df 118
564b1e3f 119 breakpoint_program_space_exit (this);
6c95b8df 120 no_shared_libraries (NULL, 0);
6c95b8df 121 free_all_objfiles ();
f3c469b9
PA
122 /* Defer breakpoint re-set because we don't want to create new
123 locations for this pspace which we're tearing down. */
124 clear_symtab_users (SYMFILE_DEFER_BP_RESET);
6c95b8df
PA
125}
126
7cac64af
TT
127/* See progspace.h. */
128
343cc952
TT
129void
130program_space::free_all_objfiles ()
131{
343cc952 132 /* Any objfile reference would become stale. */
3fe0dfd1 133 for (const shobj &so : current_program_space->solibs ())
8971d278 134 gdb_assert (so.objfile == NULL);
343cc952
TT
135
136 while (!objfiles_list.empty ())
137 objfiles_list.front ()->unlink ();
343cc952
TT
138}
139
140/* See progspace.h. */
141
7cac64af 142void
e2904e1f 143program_space::add_objfile (std::unique_ptr<objfile> &&objfile,
7d7167ce 144 struct objfile *before)
7cac64af 145{
d0801dd8 146 if (before == nullptr)
7d7167ce 147 objfiles_list.push_back (std::move (objfile));
d0801dd8 148 else
7cac64af 149 {
7d7167ce 150 auto iter = std::find_if (objfiles_list.begin (), objfiles_list.end (),
e2904e1f 151 [=] (const std::unique_ptr<::objfile> &objf)
7d7167ce
TT
152 {
153 return objf.get () == before;
154 });
d0801dd8 155 gdb_assert (iter != objfiles_list.end ());
7d7167ce 156 objfiles_list.insert (iter, std::move (objfile));
7cac64af 157 }
7cac64af
TT
158}
159
23452926
TT
160/* See progspace.h. */
161
162void
163program_space::remove_objfile (struct objfile *objfile)
164{
27c7b875
PA
165 /* Removing an objfile from the objfile list invalidates any frame
166 that was built using frame info found in the objfile. Reinit the
167 frame cache to get rid of any frame that might otherwise
168 reference stale info. */
169 reinit_frame_cache ();
170
7d7167ce 171 auto iter = std::find_if (objfiles_list.begin (), objfiles_list.end (),
e2904e1f 172 [=] (const std::unique_ptr<::objfile> &objf)
7d7167ce
TT
173 {
174 return objf.get () == objfile;
175 });
d0801dd8
TT
176 gdb_assert (iter != objfiles_list.end ());
177 objfiles_list.erase (iter);
23452926 178
d0801dd8
TT
179 if (objfile == symfile_object_file)
180 symfile_object_file = NULL;
deeafabb
TT
181}
182
a1fd1ac9
TT
183/* See progspace.h. */
184
27b2eff1
TT
185struct objfile *
186program_space::objfile_for_address (CORE_ADDR address)
187{
188 for (auto iter : objfiles ())
189 {
190 /* Don't check separate debug objfiles. */
191 if (iter->separate_debug_objfile_backlink != nullptr)
192 continue;
193 if (is_addr_in_objfile (address, iter))
194 return iter;
195 }
196 return nullptr;
197}
198
199/* See progspace.h. */
200
8a4f1402
TT
201void
202program_space::exec_close ()
203{
19f6550e 204 if (ebfd != nullptr)
8a4f1402 205 {
8a4f1402 206 /* Removing target sections may close the exec_ops target.
7e10abd1 207 Clear ebfd before doing so to prevent recursion. */
0e17d3fc 208 bfd *saved_ebfd = ebfd.get ();
19f6550e 209 ebfd.reset (nullptr);
8a4f1402
TT
210 ebfd_mtime = 0;
211
0e17d3fc 212 remove_target_sections (saved_ebfd);
8a4f1402
TT
213
214 exec_filename.reset (nullptr);
215 }
216}
217
6c95b8df
PA
218/* Copies program space SRC to DEST. Copies the main executable file,
219 and the main symbol file. Returns DEST. */
220
221struct program_space *
222clone_program_space (struct program_space *dest, struct program_space *src)
223{
5ed8105e 224 scoped_restore_current_program_space restore_pspace;
6c95b8df
PA
225
226 set_current_program_space (dest);
227
c20cb686
TT
228 if (src->exec_filename != NULL)
229 exec_file_attach (src->exec_filename.get (), 0);
6c95b8df
PA
230
231 if (src->symfile_object_file != NULL)
b2e586e8
SM
232 symbol_file_add_main (objfile_name (src->symfile_object_file),
233 SYMFILE_DEFER_BP_RESET);
6c95b8df 234
6c95b8df
PA
235 return dest;
236}
237
238/* Sets PSPACE as the current program space. It is the caller's
239 responsibility to make sure that the currently selected
240 inferior/thread matches the selected program space. */
241
242void
243set_current_program_space (struct program_space *pspace)
244{
245 if (current_program_space == pspace)
246 return;
247
248 gdb_assert (pspace != NULL);
249
250 current_program_space = pspace;
251
252 /* Different symbols change our view of the frame chain. */
253 reinit_frame_cache ();
254}
255
6c95b8df
PA
256/* Returns true iff there's no inferior bound to PSPACE. */
257
004eecfd
TT
258bool
259program_space::empty ()
6c95b8df 260{
004eecfd 261 return find_inferior_for_program_space (this) == nullptr;
6c95b8df
PA
262}
263
6c95b8df
PA
264/* Prints the list of program spaces and their details on UIOUT. If
265 REQUESTED is not -1, it's the ID of the pspace that should be
266 printed. Otherwise, all spaces are printed. */
267
268static void
269print_program_space (struct ui_out *uiout, int requested)
270{
6c95b8df 271 int count = 0;
6c95b8df 272
5d80df4a
AB
273 /* Start with a minimum width of 17 for the executable name column. */
274 size_t longest_exec_name = 17;
275
6c95b8df 276 /* Compute number of pspaces we will print. */
94c93c35 277 for (struct program_space *pspace : program_spaces)
6c95b8df
PA
278 {
279 if (requested != -1 && pspace->num != requested)
280 continue;
281
5d80df4a
AB
282 if (pspace->exec_filename != nullptr)
283 longest_exec_name = std::max (strlen (pspace->exec_filename.get ()),
284 longest_exec_name);
285
6c95b8df
PA
286 ++count;
287 }
288
289 /* There should always be at least one. */
290 gdb_assert (count > 0);
291
5d80df4a 292 ui_out_emit_table table_emitter (uiout, 4, count, "pspaces");
112e8700
SM
293 uiout->table_header (1, ui_left, "current", "");
294 uiout->table_header (4, ui_left, "id", "Id");
5d80df4a
AB
295 uiout->table_header (longest_exec_name, ui_left, "exec", "Executable");
296 uiout->table_header (17, ui_left, "core", "Core File");
112e8700 297 uiout->table_body ();
6c95b8df 298
94c93c35 299 for (struct program_space *pspace : program_spaces)
6c95b8df 300 {
6c95b8df
PA
301 int printed_header;
302
303 if (requested != -1 && requested != pspace->num)
304 continue;
305
2e783024 306 ui_out_emit_tuple tuple_emitter (uiout, NULL);
6c95b8df
PA
307
308 if (pspace == current_program_space)
112e8700 309 uiout->field_string ("current", "*");
6c95b8df 310 else
112e8700 311 uiout->field_skip ("current");
6c95b8df 312
381befee 313 uiout->field_signed ("id", pspace->num);
6c95b8df 314
c20cb686 315 if (pspace->exec_filename != nullptr)
972f7a4b
TT
316 uiout->field_string ("exec", pspace->exec_filename.get (),
317 file_name_style.style ());
6c95b8df 318 else
112e8700 319 uiout->field_skip ("exec");
6c95b8df 320
5d80df4a
AB
321 if (pspace->cbfd != nullptr)
322 uiout->field_string ("core", bfd_get_filename (pspace->cbfd.get ()),
323 file_name_style.style ());
324 else
325 uiout->field_skip ("core");
326
6c95b8df
PA
327 /* Print extra info that doesn't really fit in tabular form.
328 Currently, we print the list of inferiors bound to a pspace.
329 There can be more than one inferior bound to the same pspace,
330 e.g., both parent/child inferiors in a vfork, or, on targets
331 that share pspaces between inferiors. */
332 printed_header = 0;
f7c7700d
PA
333
334 /* We're going to switch inferiors. */
335 scoped_restore_current_thread restore_thread;
336
337 for (inferior *inf : all_inferiors ())
6c95b8df
PA
338 if (inf->pspace == pspace)
339 {
f7c7700d
PA
340 /* Switch to inferior in order to call target methods. */
341 switch_to_inferior_no_thread (inf);
342
6c95b8df
PA
343 if (!printed_header)
344 {
345 printed_header = 1;
6cb06a8c
TT
346 gdb_printf ("\n\tBound inferiors: ID %d (%s)",
347 inf->num,
348 target_pid_to_str (ptid_t (inf->pid)).c_str ());
6c95b8df
PA
349 }
350 else
6cb06a8c
TT
351 gdb_printf (", ID %d (%s)",
352 inf->num,
353 target_pid_to_str (ptid_t (inf->pid)).c_str ());
6c95b8df
PA
354 }
355
112e8700 356 uiout->text ("\n");
6c95b8df 357 }
6c95b8df
PA
358}
359
360/* Boolean test for an already-known program space id. */
361
362static int
363valid_program_space_id (int num)
364{
94c93c35 365 for (struct program_space *pspace : program_spaces)
6c95b8df
PA
366 if (pspace->num == num)
367 return 1;
368
369 return 0;
370}
371
372/* If ARGS is NULL or empty, print information about all program
373 spaces. Otherwise, ARGS is a text representation of a LONG
374 indicating which the program space to print information about. */
375
376static void
9c504b5d 377maintenance_info_program_spaces_command (const char *args, int from_tty)
6c95b8df
PA
378{
379 int requested = -1;
380
381 if (args && *args)
382 {
383 requested = parse_and_eval_long (args);
384 if (!valid_program_space_id (requested))
385 error (_("program space ID %d not known."), requested);
386 }
387
79a45e25 388 print_program_space (current_uiout, requested);
6c95b8df
PA
389}
390
6c95b8df
PA
391/* Update all program spaces matching to address spaces. The user may
392 have created several program spaces, and loaded executables into
393 them before connecting to the target interface that will create the
394 inferiors. All that happens before GDB has a chance to know if the
395 inferiors will share an address space or not. Call this after
396 having connected to the target interface and having fetched the
397 target description, to fixup the program/address spaces mappings.
398
399 It is assumed that there are no bound inferiors yet, otherwise,
400 they'd be left with stale referenced to released aspaces. */
401
402void
403update_address_spaces (void)
404{
99d9c3b9
SM
405 int shared_aspace
406 = gdbarch_has_shared_address_space (current_inferior ()->arch ());
6c95b8df
PA
407
408 init_address_spaces ();
409
7e9af34a 410 if (shared_aspace)
6c95b8df 411 {
f9582a22 412 address_space_ref_ptr aspace = new_address_space ();
ad3bbd48 413
94c93c35 414 for (struct program_space *pspace : program_spaces)
7e9af34a 415 pspace->aspace = aspace;
6c95b8df 416 }
7e9af34a 417 else
94c93c35 418 for (struct program_space *pspace : program_spaces)
f9582a22 419 pspace->aspace = new_address_space ();
7e9af34a 420
08bdefb5 421 for (inferior *inf : all_inferiors ())
99d9c3b9 422 if (gdbarch_has_global_solist (current_inferior ()->arch ()))
7e9af34a
DJ
423 inf->aspace = maybe_new_address_space ();
424 else
425 inf->aspace = inf->pspace->aspace;
6c95b8df
PA
426}
427
6c95b8df
PA
428\f
429
edcc5120
TT
430/* See progspace.h. */
431
432void
e39fb971 433program_space::clear_solib_cache ()
edcc5120 434{
e39fb971
TT
435 added_solibs.clear ();
436 deleted_solibs.clear ();
edcc5120
TT
437}
438
439\f
440
6c95b8df
PA
441void
442initialize_progspace (void)
443{
444 add_cmd ("program-spaces", class_maintenance,
3e43a32a
MS
445 maintenance_info_program_spaces_command,
446 _("Info about currently known program spaces."),
6c95b8df
PA
447 &maintenanceinfolist);
448
449 /* There's always one program space. Note that this function isn't
450 an automatic _initialize_foo function, since other
451 _initialize_foo routines may need to install their per-pspace
452 data keys. We can only allocate a progspace when all those
453 modules have done that. Do this before
7e10abd1
TT
454 initialize_current_architecture, because that accesses the ebfd
455 of current_program_space. */
f9582a22 456 current_program_space = new program_space (new_address_space ());
6c95b8df 457}