X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fobjfiles.c;h=38a365ca678c8e48bc92b2427af72096245c9ddd;hb=98387a2917d136b1acbaa9229d5b6a787d9efd54;hp=16815472fb60f92c6d8e17bc1ecfb9c98a05e9ad;hpb=a61d6db83d94b3956816f5e1f8c3837ac514fc27;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 16815472fb..38a365ca67 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -1,6 +1,6 @@ /* GDB routines for manipulating objfiles. - Copyright (C) 1992-2013 Free Software Foundation, Inc. + Copyright (C) 1992-2014 Free Software Foundation, Inc. Contributed by Cygnus Support, using pieces from other GDB modules. @@ -33,12 +33,10 @@ #include "expression.h" #include "parser-defs.h" -#include "gdb_assert.h" #include -#include "gdb_stat.h" +#include #include #include "gdb_obstack.h" -#include "gdb_string.h" #include "hashtab.h" #include "breakpoint.h" @@ -85,14 +83,10 @@ static const struct program_space_data *objfiles_pspace_data; static void objfiles_pspace_data_cleanup (struct program_space *pspace, void *arg) { - struct objfile_pspace_info *info; + struct objfile_pspace_info *info = arg; - info = program_space_data (pspace, objfiles_pspace_data); - if (info != NULL) - { - xfree (info->sections); - xfree (info); - } + xfree (info->sections); + xfree (info); } /* Get the current svr4 data. If none is found yet, add it now. This @@ -106,7 +100,7 @@ get_objfile_pspace_data (struct program_space *pspace) info = program_space_data (pspace, objfiles_pspace_data); if (info == NULL) { - info = XZALLOC (struct objfile_pspace_info); + info = XCNEW (struct objfile_pspace_info); set_program_space_data (pspace, objfiles_pspace_data, info); } @@ -137,21 +131,26 @@ get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd) if (storage == NULL) { - if (abfd != NULL) + /* 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 = bfd_zalloc (abfd, sizeof (struct objfile_per_bfd_storage)); set_bfd_data (abfd, objfiles_bfd_data, storage); - - /* Look up the gdbarch associated with the BFD. */ - storage->gdbarch = gdbarch_from_bfd (abfd); } else storage = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct objfile_per_bfd_storage); + /* Look up the gdbarch associated with the BFD. */ + if (abfd != NULL) + storage->gdbarch = gdbarch_from_bfd (abfd); + obstack_init (&storage->storage_obstack); storage->filename_cache = bcache_xmalloc (NULL, NULL); storage->macro_cache = bcache_xmalloc (NULL, NULL); + storage->language_of_main = language_unknown; } return storage; @@ -164,6 +163,8 @@ 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); obstack_free (&storage->storage_obstack, 0); } @@ -184,6 +185,20 @@ set_objfile_per_bfd (struct objfile *objfile) objfile->per_bfd = get_objfile_bfd_data (objfile, objfile->obfd); } +/* Set the objfile's per-BFD notion of the "main" name and + language. */ + +void +set_objfile_main_name (struct objfile *objfile, + const char *name, enum language lang) +{ + if (objfile->per_bfd->name_of_main == NULL + || strcmp (objfile->per_bfd->name_of_main, name) != 0) + objfile->per_bfd->name_of_main + = obstack_copy0 (&objfile->per_bfd->storage_obstack, name, strlen (name)); + objfile->per_bfd->language_of_main = lang; +} + /* Called via bfd_map_over_sections to build up the section table that @@ -248,6 +263,11 @@ build_objfile_section_table (struct objfile *objfile) into the list of all known objfiles, and return a pointer to the new objfile struct. + NAME should contain original non-canonicalized filename or other + identifier as entered by user. If there is no better source use + bfd_get_filename (ABFD). NAME may be NULL only if ABFD is NULL. + NAME content is copied into returned objfile. + The FLAGS word contains various bits (OBJF_*) that can be taken as requests for specific operations. Other bits like OBJF_SHARED are simply copied through to the new objfile flags member. */ @@ -262,19 +282,38 @@ build_objfile_section_table (struct objfile *objfile) things in a consistent state even if abfd is NULL. */ struct objfile * -allocate_objfile (bfd *abfd, int flags) +allocate_objfile (bfd *abfd, const char *name, int flags) { struct objfile *objfile; + char *expanded_name; objfile = (struct objfile *) xzalloc (sizeof (struct objfile)); objfile->psymbol_cache = psymbol_bcache_init (); /* We could use obstack_specify_allocation here instead, but gdb_obstack.h specifies the alloc/dealloc functions. */ obstack_init (&objfile->objfile_obstack); - terminate_minimal_symbol_table (objfile); objfile_alloc_data (objfile); + if (name == NULL) + { + gdb_assert (abfd == NULL); + gdb_assert ((flags & OBJF_NOT_FILENAME) != 0); + expanded_name = xstrdup ("<>"); + } + else if ((flags & OBJF_NOT_FILENAME) != 0) + expanded_name = xstrdup (name); + else + expanded_name = gdb_abspath (name); + objfile->original_name = obstack_copy0 (&objfile->objfile_obstack, + expanded_name, + strlen (expanded_name)); + xfree (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 + region. */ + /* Update the per-objfile information that comes from the bfd, ensuring that any data that is reference is saved in the per-objfile data region. */ @@ -283,20 +322,17 @@ allocate_objfile (bfd *abfd, int flags) gdb_bfd_ref (abfd); if (abfd != NULL) { - objfile->name = bfd_get_filename (abfd); objfile->mtime = bfd_get_mtime (abfd); /* Build section table. */ build_objfile_section_table (objfile); } - else - { - objfile->name = "<>"; - } objfile->per_bfd = get_objfile_bfd_data (objfile, abfd); objfile->pspace = current_program_space; + terminate_minimal_symbol_table (objfile); + /* Initialize the section indexes for this objfile, so that we can later detect if they are used w/o being properly assigned to. */ @@ -330,8 +366,9 @@ allocate_objfile (bfd *abfd, int flags) } /* Retrieve the gdbarch associated with OBJFILE. */ + struct gdbarch * -get_objfile_arch (struct objfile *objfile) +get_objfile_arch (const struct objfile *objfile) { return objfile->per_bfd->gdbarch; } @@ -342,10 +379,12 @@ get_objfile_arch (struct objfile *objfile) int entry_point_address_query (CORE_ADDR *entry_p) { - if (symfile_objfile == NULL || !symfile_objfile->ei.entry_point_p) + if (symfile_objfile == NULL || !symfile_objfile->per_bfd->ei.entry_point_p) return 0; - *entry_p = symfile_objfile->ei.entry_point; + *entry_p = (symfile_objfile->per_bfd->ei.entry_point + + ANOFFSET (symfile_objfile->section_offsets, + symfile_objfile->per_bfd->ei.the_bfd_section_index)); return 1; } @@ -427,26 +466,6 @@ put_objfile_before (struct objfile *objfile, struct objfile *before_this) _("put_objfile_before: before objfile not in list")); } -/* Put OBJFILE at the front of the list. */ - -void -objfile_to_front (struct objfile *objfile) -{ - struct objfile **objp; - for (objp = &object_files; *objp != NULL; objp = &((*objp)->next)) - { - if (*objp == objfile) - { - /* Unhook it from where it is. */ - *objp = objfile->next; - /* Put it in the front. */ - objfile->next = object_files; - object_files = objfile; - break; - } - } -} - /* Unlink OBJFILE from the list of known objfiles, if it is found in the list. @@ -518,25 +537,14 @@ free_objfile_separate_debug (struct objfile *objfile) } } -/* Destroy an objfile and all the symtabs and psymtabs under it. Note - that as much as possible is allocated on the objfile_obstack - so that the memory can be efficiently freed. - - Things which we do NOT free because they are not in malloc'd memory - or not in memory specific to the objfile include: - - objfile -> sf - - FIXME: If the objfile is using reusable symbol information (via mmalloc), - then we need to take into account the fact that more than one process - may be using the symbol information at the same time (when mmalloc is - extended to support cooperative locking). When more than one process - is using the mapped symbol info, we need to be more careful about when - we free objects in the reusable area. */ +/* Destroy an objfile and all the symtabs and psymtabs under it. */ void free_objfile (struct objfile *objfile) { + /* First notify observers that this objfile is about to be freed. */ + observer_notify_free_objfile (objfile); + /* Free all separate debug objfiles. */ free_objfile_separate_debug (objfile); @@ -637,21 +645,18 @@ free_objfile (struct objfile *objfile) clear_current_source_symtab_and_line (); } - /* The last thing we do is free the objfile struct itself. */ - if (objfile->global_psymbols.list) xfree (objfile->global_psymbols.list); if (objfile->static_psymbols.list) xfree (objfile->static_psymbols.list); /* Free the obstacks for non-reusable objfiles. */ psymbol_bcache_free (objfile->psymbol_cache); - if (objfile->demangled_names_hash) - htab_delete (objfile->demangled_names_hash); obstack_free (&objfile->objfile_obstack, 0); /* Rebuild section map next time we need it. */ get_objfile_pspace_data (objfile->pspace)->section_map_dirty = 1; + /* The last thing we do is free the objfile struct itself. */ xfree (objfile); } @@ -740,7 +745,7 @@ objfile_relocate1 (struct objfile *objfile, ALL_OBJFILE_SYMTABS (objfile, s) { struct linetable *l; - struct blockvector *bv; + const struct blockvector *bv; int i; /* First the line table. */ @@ -795,33 +800,6 @@ objfile_relocate1 (struct objfile *objfile, if (objfile->sf) objfile->sf->qf->relocate (objfile, new_offsets, delta); - { - struct minimal_symbol *msym; - - ALL_OBJFILE_MSYMBOLS (objfile, msym) - if (SYMBOL_SECTION (msym) >= 0) - SYMBOL_VALUE_ADDRESS (msym) += ANOFFSET (delta, SYMBOL_SECTION (msym)); - } - /* Relocating different sections by different amounts may cause the symbols - to be out of order. */ - msymbols_sort (objfile); - - if (objfile->ei.entry_point_p) - { - /* Relocate ei.entry_point with its section offset, use SECT_OFF_TEXT - only as a fallback. */ - struct obj_section *s; - s = find_pc_section (objfile->ei.entry_point); - if (s) - { - int idx = gdb_bfd_section_index (objfile->obfd, s->the_bfd_section); - - objfile->ei.entry_point += ANOFFSET (delta, idx); - } - else - objfile->ei.entry_point += ANOFFSET (delta, SECT_OFF_TEXT (objfile)); - } - { int i; @@ -841,11 +819,6 @@ objfile_relocate1 (struct objfile *objfile, obj_section_addr (s)); } - /* Relocating probes. */ - if (objfile->sf && objfile->sf->sym_probe_fns) - objfile->sf->sym_probe_fns->sym_relocate_probe (objfile, - new_offsets, delta); - /* Data changed. */ return 1; } @@ -1051,7 +1024,7 @@ have_minimal_symbols (void) ALL_OBJFILES (ofp) { - if (ofp->minimal_symbol_count > 0) + if (ofp->per_bfd->minimal_symbol_count > 0) { return 1; } @@ -1267,10 +1240,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), objf1->name, + bfd_section_name (abfd1, bfds1), objfile_name (objf1), paddress (gdbarch, sect1_addr), paddress (gdbarch, sect1_endaddr), - bfd_section_name (abfd2, bfds2), objf2->name, + bfd_section_name (abfd2, bfds2), objfile_name (objf2), paddress (gdbarch, sect2_addr), paddress (gdbarch, sect2_endaddr)); } @@ -1456,6 +1429,45 @@ resume_section_map_updates_cleanup (void *arg) resume_section_map_updates (arg); } +/* Return 1 if ADDR maps into one of the sections of OBJFILE and 0 + otherwise. */ + +int +is_addr_in_objfile (CORE_ADDR addr, const struct objfile *objfile) +{ + struct obj_section *osect; + + if (objfile == NULL) + return 0; + + ALL_OBJFILE_OSECTIONS (objfile, osect) + { + if (section_is_overlay (osect) && !section_is_mapped (osect)) + continue; + + if (obj_section_addr (osect) <= addr + && addr < obj_section_endaddr (osect)) + return 1; + } + return 0; +} + +int +shared_objfile_contains_address_p (struct program_space *pspace, + CORE_ADDR address) +{ + struct objfile *objfile; + + ALL_PSPACE_OBJFILES (pspace, objfile) + { + if ((objfile->flags & OBJF_SHARED) != 0 + && is_addr_in_objfile (address, objfile)) + return 1; + } + + return 0; +} + /* The default implementation for the "iterate_over_objfiles_in_search_order" gdbarch method. It is equivalent to use the ALL_OBJFILES macro, searching the objfiles in the order they are stored internally, @@ -1481,6 +1493,17 @@ default_iterate_over_objfiles_in_search_order } } +/* Return canonical name for OBJFILE. */ + +const char * +objfile_name (const struct objfile *objfile) +{ + if (objfile->obfd != NULL) + return bfd_get_filename (objfile->obfd); + + return objfile->original_name; +} + /* Provide a prototype to silence -Wmissing-prototypes. */ extern initialize_file_ftype _initialize_objfiles;