X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fobjfiles.c;h=34b271e86de2b9e2fa392e9815e8aea291b29c09;hb=b669c95337903d39aa2254e8ea0405c0ac117d24;hp=c9a727aff7de06230421c2a97291d86619f3bb8a;hpb=aed57c537116ae91f553ac835b3f96d1f87b3bb0;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/objfiles.c b/gdb/objfiles.c index c9a727aff7..34b271e86d 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -369,8 +369,8 @@ build_objfile_section_table (struct objfile *objfile) objfile::objfile (bfd *abfd, const char *name, objfile_flags flags_) : flags (flags_), pspace (current_program_space), - obfd (abfd), - psymbol_cache (psymbol_bcache_init ()) + partial_symtabs (new psymtab_storage ()), + obfd (abfd) { const char *expanded_name; @@ -514,7 +514,7 @@ objfile_separate_debug_iterate (const struct objfile *parent, /* 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 +587,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 the ALL_OBJFILES_SAFE macro will stay safe. */ + usage of objfiles_safe will stay safe. */ put_objfile_before (objfile, parent); } @@ -713,7 +713,6 @@ objfile::~objfile () } /* Free the obstacks for non-reusable objfiles. */ - psymbol_bcache_free (psymbol_cache); obstack_free (&objfile_obstack, 0); /* Rebuild section map next time we need it. */ @@ -730,17 +729,14 @@ objfile::~objfile () void free_all_objfiles (void) { - struct objfile *objfile, *temp; struct so_list *so; /* Any objfile referencewould become stale. */ for (so = master_so_list (); so; so = so->next) gdb_assert (so->objfile == NULL); - ALL_OBJFILES_SAFE (objfile, temp) - { + for (objfile *objfile : current_program_space->objfiles_safe ()) delete objfile; - } clear_symtab_users (0); } @@ -791,59 +787,60 @@ objfile_relocate1 (struct objfile *objfile, /* OK, get all the symtabs. */ { - struct compunit_symtab *cust; - struct symtab *s; - - ALL_OBJFILE_FILETABS (objfile, cust, s) - { - struct linetable *l; - - /* First the line table. */ - l = SYMTAB_LINETABLE (s); - if (l) - { - for (int i = 0; i < l->nitems; ++i) - l->item[i].pc += ANOFFSET (delta, - COMPUNIT_BLOCK_LINE_SECTION - (cust)); - } - } - - ALL_OBJFILE_COMPUNITS (objfile, cust) - { - const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (cust); - int block_line_section = COMPUNIT_BLOCK_LINE_SECTION (cust); - - if (BLOCKVECTOR_MAP (bv)) - addrmap_relocate (BLOCKVECTOR_MAP (bv), - ANOFFSET (delta, block_line_section)); - - for (int i = 0; i < BLOCKVECTOR_NBLOCKS (bv); ++i) - { - struct block *b; - struct symbol *sym; - struct dict_iterator iter; - - b = BLOCKVECTOR_BLOCK (bv, i); - BLOCK_START (b) += ANOFFSET (delta, block_line_section); - BLOCK_END (b) += ANOFFSET (delta, block_line_section); - - if (BLOCK_RANGES (b) != nullptr) - for (int j = 0; j < BLOCK_NRANGES (b); j++) + for (compunit_symtab *cust : objfile->compunits ()) + { + for (symtab *s : compunit_filetabs (cust)) + { + struct linetable *l; + + /* First the line table. */ + l = SYMTAB_LINETABLE (s); + if (l) { - BLOCK_RANGE_START (b, j) - += ANOFFSET (delta, block_line_section); - BLOCK_RANGE_END (b, j) += ANOFFSET (delta, block_line_section); + for (int i = 0; i < l->nitems; ++i) + l->item[i].pc += ANOFFSET (delta, + COMPUNIT_BLOCK_LINE_SECTION + (cust)); } - - /* We only want to iterate over the local symbols, not any - symbols in included symtabs. */ - ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym) - { - relocate_one_symbol (sym, objfile, delta); - } - } - } + } + } + + for (compunit_symtab *cust : objfile->compunits ()) + { + const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (cust); + int block_line_section = COMPUNIT_BLOCK_LINE_SECTION (cust); + + if (BLOCKVECTOR_MAP (bv)) + addrmap_relocate (BLOCKVECTOR_MAP (bv), + ANOFFSET (delta, block_line_section)); + + for (int i = 0; i < BLOCKVECTOR_NBLOCKS (bv); ++i) + { + struct block *b; + struct symbol *sym; + struct mdict_iterator miter; + + b = BLOCKVECTOR_BLOCK (bv, i); + BLOCK_START (b) += ANOFFSET (delta, block_line_section); + BLOCK_END (b) += ANOFFSET (delta, block_line_section); + + if (BLOCK_RANGES (b) != nullptr) + for (int j = 0; j < BLOCK_NRANGES (b); j++) + { + BLOCK_RANGE_START (b, j) + += ANOFFSET (delta, block_line_section); + BLOCK_RANGE_END (b, j) += ANOFFSET (delta, + block_line_section); + } + + /* We only want to iterate over the local symbols, not any + symbols in included symtabs. */ + ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (b), miter, sym) + { + relocate_one_symbol (sym, objfile, delta); + } + } + } } /* This stores relocated addresses and so must be cleared. This @@ -1016,7 +1013,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; @@ -1031,7 +1028,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; @@ -1047,17 +1044,14 @@ have_full_symbols (void) void objfile_purge_solibs (void) { - struct objfile *objf; - struct objfile *temp; - - ALL_OBJFILES_SAFE (objf, temp) - { - /* We assume that the solib package has been purged already, or will - be soon. */ + for (objfile *objf : current_program_space->objfiles_safe ()) + { + /* We assume that the solib package has been purged already, or will + be soon. */ - if (!(objf->flags & OBJF_USERLOADED) && (objf->flags & OBJF_SHARED)) - delete objf; - } + if (!(objf->flags & OBJF_USERLOADED) && (objf->flags & OBJF_SHARED)) + delete objf; + } } @@ -1068,7 +1062,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) { @@ -1139,7 +1133,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) @@ -1323,7 +1317,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; @@ -1339,7 +1333,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; @@ -1483,7 +1477,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)) @@ -1494,7 +1488,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. @@ -1509,7 +1503,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)