X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fobjfiles.c;h=90c4650bd47bec55dfdebab523dbc41f07e16869;hb=fd3619828e94a24a92cddec42cbc0ab33352eeb4;hp=255a3d636d15fa35f43ddc2d81c7786b0542b9b1;hpb=8d7bcccb82d9a7efccd75d9552d007c62031e855;p=binutils-gdb.git diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 255a3d636d1..90c4650bd47 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -52,7 +52,7 @@ #include "solist.h" #include "gdb_bfd.h" #include "btrace.h" -#include "common/pathstuff.h" +#include "gdbsupport/pathstuff.h" #include @@ -66,30 +66,30 @@ DEFINE_REGISTRY (objfile, REGISTRY_ACCESS_FIELD) struct objfile_pspace_info { - struct obj_section **sections; - int num_sections; + objfile_pspace_info () = default; + ~objfile_pspace_info (); + + struct obj_section **sections = nullptr; + int num_sections = 0; /* Nonzero if object files have been added since the section map was last updated. */ - int new_objfiles_available; + int new_objfiles_available = 0; /* Nonzero if the section map MUST be updated before use. */ - int section_map_dirty; + int section_map_dirty = 0; /* Nonzero if section map updates should be inhibited if possible. */ - int inhibit_updates; + int inhibit_updates = 0; }; /* Per-program-space data key. */ -static const struct program_space_data *objfiles_pspace_data; +static const struct program_space_key + objfiles_pspace_data; -static void -objfiles_pspace_data_cleanup (struct program_space *pspace, void *arg) +objfile_pspace_info::~objfile_pspace_info () { - struct objfile_pspace_info *info = (struct objfile_pspace_info *) arg; - - xfree (info->sections); - xfree (info); + xfree (sections); } /* Get the current svr4 data. If none is found yet, add it now. This @@ -100,13 +100,9 @@ get_objfile_pspace_data (struct program_space *pspace) { struct objfile_pspace_info *info; - info = ((struct objfile_pspace_info *) - program_space_data (pspace, objfiles_pspace_data)); + info = objfiles_pspace_data.get (pspace); if (info == NULL) - { - info = XCNEW (struct objfile_pspace_info); - set_program_space_data (pspace, objfiles_pspace_data, info); - } + info = objfiles_pspace_data.emplace (pspace); return info; } @@ -115,15 +111,17 @@ get_objfile_pspace_data (struct program_space *pspace) /* Per-BFD data key. */ -static const struct bfd_data *objfiles_bfd_data; +static const struct bfd_key objfiles_bfd_data; + +objfile_per_bfd_storage::~objfile_per_bfd_storage () +{ +} /* Create the per-BFD storage object for OBJFILE. If ABFD is not NULL, and it already has a per-BFD storage object, use that. - Otherwise, allocate a new per-BFD storage object. If ABFD is not - NULL, the object is allocated on the BFD; otherwise it is allocated - on OBJFILE's obstack. Note that it is not safe to call this - multiple times for a given OBJFILE -- it can only be called when - allocating or re-initializing OBJFILE. */ + Otherwise, allocate a new per-BFD storage object. Note that it is + not safe to call this multiple times for a given OBJFILE -- it can + only be called when allocating or re-initializing OBJFILE. */ static struct objfile_per_bfd_storage * get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd) @@ -131,61 +129,25 @@ get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd) struct objfile_per_bfd_storage *storage = NULL; if (abfd != NULL) - storage = ((struct objfile_per_bfd_storage *) - bfd_data (abfd, objfiles_bfd_data)); + storage = objfiles_bfd_data.get (abfd); if (storage == NULL) { + storage = new objfile_per_bfd_storage; /* If the object requires gdb to do relocations, we simply fall back to not sharing data across users. These cases are rare enough that this seems reasonable. */ if (abfd != NULL && !gdb_bfd_requires_relocations (abfd)) - { - storage - = ((struct objfile_per_bfd_storage *) - bfd_alloc (abfd, sizeof (struct objfile_per_bfd_storage))); - /* objfile_per_bfd_storage is not trivially constructible, must - call the ctor manually. */ - storage = new (storage) objfile_per_bfd_storage (); - set_bfd_data (abfd, objfiles_bfd_data, storage); - } - else - storage - = obstack_new (&objfile->objfile_obstack); + objfiles_bfd_data.set (abfd, storage); /* Look up the gdbarch associated with the BFD. */ if (abfd != NULL) storage->gdbarch = gdbarch_from_bfd (abfd); - - storage->filename_cache = bcache_xmalloc (NULL, NULL); - storage->macro_cache = bcache_xmalloc (NULL, NULL); - storage->language_of_main = language_unknown; } return storage; } -/* Free STORAGE. */ - -static void -free_objfile_per_bfd_storage (struct objfile_per_bfd_storage *storage) -{ - bcache_xfree (storage->filename_cache); - bcache_xfree (storage->macro_cache); - if (storage->demangled_names_hash) - htab_delete (storage->demangled_names_hash); - storage->~objfile_per_bfd_storage (); -} - -/* A wrapper for free_objfile_per_bfd_storage that can be passed as a - cleanup function to the BFD registry. */ - -static void -objfile_bfd_data_free (struct bfd *unused, void *d) -{ - free_objfile_per_bfd_storage ((struct objfile_per_bfd_storage *) d); -} - /* See objfiles.h. */ void @@ -204,8 +166,7 @@ set_objfile_main_name (struct objfile *objfile, if (objfile->per_bfd->name_of_main == NULL || strcmp (objfile->per_bfd->name_of_main, name) != 0) objfile->per_bfd->name_of_main - = (const char *) obstack_copy0 (&objfile->per_bfd->storage_obstack, name, - strlen (name)); + = obstack_strdup (&objfile->per_bfd->storage_obstack, name); objfile->per_bfd->language_of_main = lang; } @@ -255,14 +216,14 @@ objfile_register_static_link (struct objfile *objfile, struct static_link_htab_entry *entry; if (objfile->static_links == NULL) - objfile->static_links = htab_create_alloc + objfile->static_links.reset (htab_create_alloc (1, &static_link_htab_entry_hash, static_link_htab_entry_eq, NULL, - xcalloc, xfree); + xcalloc, xfree)); /* Create a slot for the mapping, make sure it's the first mapping for this block and then create the mapping itself. */ lookup_entry.block = block; - slot = htab_find_slot (objfile->static_links, &lookup_entry, INSERT); + slot = htab_find_slot (objfile->static_links.get (), &lookup_entry, INSERT); gdb_assert (*slot == NULL); entry = XOBNEW (&objfile->objfile_obstack, static_link_htab_entry); @@ -284,9 +245,8 @@ objfile_lookup_static_link (struct objfile *objfile, if (objfile->static_links == NULL) return NULL; lookup_entry.block = block; - entry - = (struct static_link_htab_entry *) htab_find (objfile->static_links, - &lookup_entry); + entry = ((struct static_link_htab_entry *) + htab_find (objfile->static_links.get (), &lookup_entry)); if (entry == NULL) return NULL; @@ -311,7 +271,7 @@ add_to_objfile_sections_full (struct bfd *abfd, struct bfd_section *asect, { flagword aflag; - aflag = bfd_get_section_flags (abfd, asect); + aflag = bfd_section_flags (asect); if (!(aflag & SEC_ALLOC)) return; } @@ -395,10 +355,7 @@ objfile::objfile (bfd *abfd, const char *name, objfile_flags flags_) name_holder = gdb_abspath (name); expanded_name = name_holder.get (); } - original_name - = (char *) obstack_copy0 (&objfile_obstack, - expanded_name, - strlen (expanded_name)); + original_name = obstack_strdup (&objfile_obstack, expanded_name); /* Update the per-objfile information that comes from the bfd, ensuring that any data that is reference is saved in the per-objfile data @@ -415,8 +372,6 @@ objfile::objfile (bfd *abfd, const char *name, objfile_flags flags_) per_bfd = get_objfile_bfd_data (this, abfd); - terminate_minimal_symbol_table (this); - /* Add this file onto the tail of the linked list of other such files. */ if (object_files == NULL) @@ -472,49 +427,55 @@ entry_point_address (void) return retval; } -/* Iterator on PARENT and every separate debug objfile of PARENT. - The usage pattern is: - for (objfile = parent; - objfile; - objfile = objfile_separate_debug_iterate (parent, objfile)) - ... -*/ - -struct objfile * -objfile_separate_debug_iterate (const struct objfile *parent, - const struct objfile *objfile) +separate_debug_iterator & +separate_debug_iterator::operator++ () { + gdb_assert (m_objfile != nullptr); + struct objfile *res; /* If any, return the first child. */ - res = objfile->separate_debug_objfile; - if (res) - return res; + res = m_objfile->separate_debug_objfile; + if (res != nullptr) + { + m_objfile = res; + return *this; + } /* Common case where there is no separate debug objfile. */ - if (objfile == parent) - return NULL; + if (m_objfile == m_parent) + { + m_objfile = nullptr; + return *this; + } /* Return the brother if any. Note that we don't iterate on brothers of the parents. */ - res = objfile->separate_debug_objfile_link; - if (res) - return res; + res = m_objfile->separate_debug_objfile_link; + if (res != nullptr) + { + m_objfile = res; + return *this; + } - for (res = objfile->separate_debug_objfile_backlink; - res != parent; + for (res = m_objfile->separate_debug_objfile_backlink; + res != m_parent; res = res->separate_debug_objfile_backlink) { - gdb_assert (res != NULL); - if (res->separate_debug_objfile_link) - return res->separate_debug_objfile_link; + gdb_assert (res != nullptr); + if (res->separate_debug_objfile_link != nullptr) + { + m_objfile = res->separate_debug_objfile_link; + return *this; + } } - return NULL; + m_objfile = nullptr; + return *this; } /* Put one object file before a specified on in the global list. This can be used to make sure an object file is destroyed before - another when using all_objfiles_safe to free all objfiles. */ + another when using objfiles_safe to free all objfiles. */ void put_objfile_before (struct objfile *objfile, struct objfile *before_this) { @@ -587,7 +548,7 @@ add_separate_debug_objfile (struct objfile *objfile, struct objfile *parent) parent->separate_debug_objfile = objfile; /* Put the separate debug object before the normal one, this is so that - usage of all_objfiles_safe will stay safe. */ + usage of objfiles_safe will stay safe. */ put_objfile_before (objfile, parent); } @@ -676,7 +637,7 @@ objfile::~objfile () if (obfd) gdb_bfd_unref (obfd); else - free_objfile_per_bfd_storage (per_bfd); + delete per_bfd; /* Remove it from the chain of all objfiles. */ @@ -696,12 +657,6 @@ objfile::~objfile () for example), so we need to call this here. */ clear_pc_function_cache (); - /* Clear globals which might have pointed into a removed objfile. - FIXME: It's not clear which of these are supposed to persist - between expressions and which ought to be reset each time. */ - expression_context_block = NULL; - innermost_block.reset (); - /* Check to see if the current_source_symtab belongs to this objfile, and if so, call clear_current_source_symtab_and_line. */ @@ -717,11 +672,6 @@ objfile::~objfile () /* Rebuild section map next time we need it. */ get_objfile_pspace_data (pspace)->section_map_dirty = 1; - - /* Free the map for static links. There's no need to free static link - themselves since they were allocated on the objstack. */ - if (static_links != NULL) - htab_delete (static_links); } /* Free all the object files at once and clean up their users. */ @@ -731,11 +681,11 @@ free_all_objfiles (void) { struct so_list *so; - /* Any objfile referencewould become stale. */ + /* Any objfile reference would become stale. */ for (so = master_so_list (); so; so = so->next) gdb_assert (so->objfile == NULL); - for (objfile *objfile : all_objfiles_safe (current_program_space)) + for (objfile *objfile : current_program_space->objfiles_safe ()) delete objfile; clear_symtab_users (0); } @@ -787,7 +737,7 @@ objfile_relocate1 (struct objfile *objfile, /* OK, get all the symtabs. */ { - for (compunit_symtab *cust : objfile_compunits (objfile)) + for (compunit_symtab *cust : objfile->compunits ()) { for (symtab *s : compunit_filetabs (cust)) { @@ -805,7 +755,7 @@ objfile_relocate1 (struct objfile *objfile, } } - for (compunit_symtab *cust : objfile_compunits (objfile)) + for (compunit_symtab *cust : objfile->compunits ()) { const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (cust); int block_line_section = COMPUNIT_BLOCK_LINE_SECTION (cust); @@ -818,7 +768,7 @@ objfile_relocate1 (struct objfile *objfile, { struct block *b; struct symbol *sym; - struct dict_iterator iter; + struct mdict_iterator miter; b = BLOCKVECTOR_BLOCK (bv, i); BLOCK_START (b) += ANOFFSET (delta, block_line_section); @@ -835,7 +785,7 @@ objfile_relocate1 (struct objfile *objfile, /* We only want to iterate over the local symbols, not any symbols in included symtabs. */ - ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym) + ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (b), miter, sym) { relocate_one_symbol (sym, objfile, delta); } @@ -892,15 +842,15 @@ void objfile_relocate (struct objfile *objfile, const struct section_offsets *new_offsets) { - struct objfile *debug_objfile; int changed = 0; changed |= objfile_relocate1 (objfile, new_offsets); - for (debug_objfile = objfile->separate_debug_objfile; - debug_objfile; - debug_objfile = objfile_separate_debug_iterate (objfile, debug_objfile)) + for (::objfile *debug_objfile : objfile->separate_debug_objfiles ()) { + if (debug_objfile == objfile) + continue; + section_addr_info objfile_addrs = build_section_addr_info_from_objfile (objfile); @@ -949,14 +899,9 @@ objfile_rebase1 (struct objfile *objfile, CORE_ADDR slide) void objfile_rebase (struct objfile *objfile, CORE_ADDR slide) { - struct objfile *debug_objfile; int changed = 0; - changed |= objfile_rebase1 (objfile, slide); - - for (debug_objfile = objfile->separate_debug_objfile; - debug_objfile; - debug_objfile = objfile_separate_debug_iterate (objfile, debug_objfile)) + for (::objfile *debug_objfile : objfile->separate_debug_objfiles ()) changed |= objfile_rebase1 (debug_objfile, slide); /* Relocate breakpoints as necessary, after things are relocated. */ @@ -997,9 +942,7 @@ objfile_has_full_symbols (struct objfile *objfile) int objfile_has_symbols (struct objfile *objfile) { - struct objfile *o; - - for (o = objfile; o; o = objfile_separate_debug_iterate (objfile, o)) + for (::objfile *o : objfile->separate_debug_objfiles ()) if (objfile_has_partial_symbols (o) || objfile_has_full_symbols (o)) return 1; return 0; @@ -1013,7 +956,7 @@ objfile_has_symbols (struct objfile *objfile) int have_partial_symbols (void) { - for (objfile *ofp : all_objfiles (current_program_space)) + for (objfile *ofp : current_program_space->objfiles ()) { if (objfile_has_partial_symbols (ofp)) return 1; @@ -1028,7 +971,7 @@ have_partial_symbols (void) int have_full_symbols (void) { - for (objfile *ofp : all_objfiles (current_program_space)) + for (objfile *ofp : current_program_space->objfiles ()) { if (objfile_has_full_symbols (ofp)) return 1; @@ -1044,7 +987,7 @@ have_full_symbols (void) void objfile_purge_solibs (void) { - for (objfile *objf : all_objfiles_safe (current_program_space)) + for (objfile *objf : current_program_space->objfiles_safe ()) { /* We assume that the solib package has been purged already, or will be soon. */ @@ -1062,7 +1005,7 @@ objfile_purge_solibs (void) int have_minimal_symbols (void) { - for (objfile *ofp : all_objfiles (current_program_space)) + for (objfile *ofp : current_program_space->objfiles ()) { if (ofp->per_bfd->minimal_symbol_count > 0) { @@ -1133,7 +1076,7 @@ qsort_cmp (const void *a, const void *b) { /* Sort on sequence number of the objfile in the chain. */ - for (objfile *objfile : all_objfiles (current_program_space)) + for (objfile *objfile : current_program_space->objfiles ()) if (objfile == objfile1) return -1; else if (objfile == objfile2) @@ -1176,15 +1119,15 @@ static int insert_section_p (const struct bfd *abfd, const struct bfd_section *section) { - const bfd_vma lma = bfd_section_lma (abfd, section); + const bfd_vma lma = bfd_section_lma (section); - if (overlay_debugging && lma != 0 && lma != bfd_section_vma (abfd, section) + if (overlay_debugging && lma != 0 && lma != bfd_section_vma (section) && (bfd_get_file_flags (abfd) & BFD_IN_MEMORY) == 0) /* This is an overlay section. IN_MEMORY check is needed to avoid discarding sections from the "system supplied DSO" (aka vdso) on some Linux systems (e.g. Fedora 11). */ return 0; - if ((bfd_get_section_flags (abfd, section) & SEC_THREAD_LOCAL) != 0) + if ((bfd_section_flags (section) & SEC_THREAD_LOCAL) != 0) /* This is a TLS section. */ return 0; @@ -1277,10 +1220,10 @@ filter_overlapping_sections (struct obj_section **map, int map_size) " (A) section `%s' from `%s' [%s, %s)\n" " (B) section `%s' from `%s' [%s, %s).\n" "Will ignore section B"), - bfd_section_name (abfd1, bfds1), objfile_name (objf1), + bfd_section_name (bfds1), objfile_name (objf1), paddress (gdbarch, sect1_addr), paddress (gdbarch, sect1_endaddr), - bfd_section_name (abfd2, bfds2), objfile_name (objf2), + bfd_section_name (bfds2), objfile_name (objf2), paddress (gdbarch, sect2_addr), paddress (gdbarch, sect2_endaddr)); } @@ -1317,7 +1260,7 @@ update_section_map (struct program_space *pspace, xfree (map); alloc_size = 0; - for (objfile *objfile : all_objfiles (pspace)) + for (objfile *objfile : pspace->objfiles ()) ALL_OBJFILE_OSECTIONS (objfile, s) if (insert_section_p (objfile->obfd, s->the_bfd_section)) alloc_size += 1; @@ -1333,7 +1276,7 @@ update_section_map (struct program_space *pspace, map = XNEWVEC (struct obj_section *, alloc_size); i = 0; - for (objfile *objfile : all_objfiles (pspace)) + for (objfile *objfile : pspace->objfiles ()) ALL_OBJFILE_OSECTIONS (objfile, s) if (insert_section_p (objfile->obfd, s->the_bfd_section)) map[i++] = s; @@ -1477,7 +1420,7 @@ int shared_objfile_contains_address_p (struct program_space *pspace, CORE_ADDR address) { - for (objfile *objfile : all_objfiles (pspace)) + for (objfile *objfile : pspace->objfiles ()) { if ((objfile->flags & OBJF_SHARED) != 0 && is_addr_in_objfile (address, objfile)) @@ -1488,7 +1431,7 @@ shared_objfile_contains_address_p (struct program_space *pspace, } /* The default implementation for the "iterate_over_objfiles_in_search_order" - gdbarch method. It is equivalent to use the all_objfiles iterable, + gdbarch method. It is equivalent to use the objfiles iterable, searching the objfiles in the order they are stored internally, ignoring CURRENT_OBJFILE. @@ -1503,7 +1446,7 @@ default_iterate_over_objfiles_in_search_order { int stop = 0; - for (objfile *objfile : all_objfiles (current_program_space)) + for (objfile *objfile : current_program_space->objfiles ()) { stop = cb (objfile, cb_data); if (stop) @@ -1550,14 +1493,3 @@ objfile_flavour_name (struct objfile *objfile) return bfd_flavour_name (bfd_get_flavour (objfile->obfd)); return NULL; } - -void -_initialize_objfiles (void) -{ - objfiles_pspace_data - = register_program_space_data_with_cleanup (NULL, - objfiles_pspace_data_cleanup); - - objfiles_bfd_data = register_bfd_data_with_cleanup (NULL, - objfile_bfd_data_free); -}