diff options
author | Tom Tromey <tromey@redhat.com> | 2012-12-12 17:03:03 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2012-12-12 17:03:03 +0000 |
commit | 5c80ed9d1edd660e2e5d44d3c386d501c71404a6 (patch) | |
tree | 2d5736eddd87f98eacda7bc5b4e50d5f8c52d99a /gdb/psymtab.c | |
parent | 9a27f2c60d760a95a27e336750f26f69f91dd156 (diff) | |
download | gdb-5c80ed9d1edd660e2e5d44d3c386d501c71404a6.zip gdb-5c80ed9d1edd660e2e5d44d3c386d501c71404a6.tar.gz gdb-5c80ed9d1edd660e2e5d44d3c386d501c71404a6.tar.bz2 |
* dbxread.c (read_dbx_symtab): Update.
(end_psymtab, dbx_psymtab_to_symtab_1, dbx_psymtab_to_symtab)
(read_ofile_symtab): Add 'objfile' argument.
* dwarf2read.c (process_psymtab_comp_unit_reader)
(build_type_psymtabs_reader): Update.
(dwarf2_psymtab_to_symtab): Add 'objfile' argument.
* mdebugread.c (mdebug_psymtab_to_symtab): Add 'objfile'
argument.
(parse_procedure, parse_partial_symbols): Update.
(psymtab_to_symtab_1): Add 'objfile' argument.
* psympriv.h (struct partial_symtab) <objfile>: Remove.
<read_symtab>: Add 'objfile' argument.
(sort_pst_symbols, discard_psymtab): Update.
* psymtab.c (partial_map_expand_apply): Update.
(find_pc_sect_psymtab_closer): Add 'objfile' argument.
(find_pc_sect_psymtab, find_pc_sect_symtab_from_partial): Update.
(find_pc_sect_psymbol): Add 'objfile' argument.
(lookup_symbol_aux_psymtabs): Update.
(match_partial_symbol, lookup_partial_symbol, psymtab_to_symtab):
Add 'objfile' argument.
(find_last_source_symtab_from_partial, dump_psymtab)
(dump_psymtabs_for_objfile, read_symtabs_for_function)
(expand_partial_symbol_tables, read_psymtabs_with_filename)
(find_symbol_file_from_partial, map_matching_symbols_psymtab)
(expand_symtabs_matching_via_partial): Update.
(sort_pst_symbols): Add 'objfile' argument.
(allocate_psymtab): Update.
(discard_psymtab): Add 'objfile' argument.
(maintenance_info_psymtabs, maintenance_check_symtabs): Update.
* stabsread.h (end_psymtab): Update.
* xcoffread.c (this_symtab_objfile): New global.
(process_linenos, enter_line_range, xcoff_next_symbol_text):
Update.
(read_xcoff_symtab): Add 'objfile' argument.
(read_symbol, read_symbol_lineno): Update.
(xcoff_psymtab_to_symtab_1, xcoff_psymtab_to_symtab)
(xcoff_end_psymtab): Add 'objfile' argument.
(scan_xcoff_symtab): Update.
Diffstat (limited to 'gdb/psymtab.c')
-rw-r--r-- | gdb/psymtab.c | 116 |
1 files changed, 60 insertions, 56 deletions
diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 93be085..d6dba3e 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -45,19 +45,22 @@ struct psymbol_bcache struct bcache *bcache; }; -static struct partial_symbol *match_partial_symbol (struct partial_symtab *, +static struct partial_symbol *match_partial_symbol (struct objfile *, + struct partial_symtab *, int, const char *, domain_enum, symbol_compare_ftype *, symbol_compare_ftype *); -static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *, +static struct partial_symbol *lookup_partial_symbol (struct objfile *, + struct partial_symtab *, const char *, int, domain_enum); static char *psymtab_to_fullname (struct partial_symtab *ps); -static struct partial_symbol *find_pc_sect_psymbol (struct partial_symtab *, +static struct partial_symbol *find_pc_sect_psymbol (struct objfile *, + struct partial_symtab *, CORE_ADDR, struct obj_section *); @@ -65,7 +68,8 @@ static struct partial_symbol *fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile); -static struct symtab *psymtab_to_symtab (struct partial_symtab *pst); +static struct symtab *psymtab_to_symtab (struct objfile *objfile, + struct partial_symtab *pst); /* Ensure that the partial symbols for OBJFILE have been loaded. This function always returns its argument, as a convenience. */ @@ -145,7 +149,7 @@ partial_map_expand_apply (struct objfile *objfile, /* This may expand more than one symtab, and we want to iterate over all of them. */ - psymtab_to_symtab (pst); + psymtab_to_symtab (objfile, pst); return iterate_over_some_symtabs (name, full_path, real_path, callback, data, objfile->symtabs, last_made); @@ -237,11 +241,11 @@ partial_map_symtabs_matching_filename (struct objfile *objfile, We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */ static struct partial_symtab * -find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section, +find_pc_sect_psymtab_closer (struct objfile *objfile, + CORE_ADDR pc, struct obj_section *section, struct partial_symtab *pst, struct minimal_symbol *msymbol) { - struct objfile *objfile = pst->objfile; struct partial_symtab *tpst; struct partial_symtab *best_pst = pst; CORE_ADDR best_addr = pst->textlow; @@ -277,7 +281,7 @@ find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section, corresponding msymbol, which is not necessarily true; the debug info might be much richer than the object's symbol table. */ - p = find_pc_sect_psymbol (tpst, pc, section); + p = find_pc_sect_psymbol (objfile, tpst, pc, section); if (p != NULL && SYMBOL_VALUE_ADDRESS (p) == SYMBOL_VALUE_ADDRESS (msymbol)) @@ -342,7 +346,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc, corresponding msymbol, which is not necessarily true; the debug info might be much richer than the object's symbol table. */ - p = find_pc_sect_psymbol (pst, pc, section); + p = find_pc_sect_psymbol (objfile, pst, pc, section); if (!p || SYMBOL_VALUE_ADDRESS (p) != SYMBOL_VALUE_ADDRESS (msymbol)) @@ -376,7 +380,8 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc, { struct partial_symtab *best_pst; - best_pst = find_pc_sect_psymtab_closer (pc, section, pst, msymbol); + best_pst = find_pc_sect_psymtab_closer (objfile, pc, section, pst, + msymbol); if (best_pst != NULL) return best_pst; } @@ -400,8 +405,8 @@ find_pc_sect_symtab_from_partial (struct objfile *objfile, continue, so let's not. */ warning (_("\ (Internal error: pc %s in read in psymtab, but not in symtab.)\n"), - paddress (get_objfile_arch (ps->objfile), pc)); - psymtab_to_symtab (ps); + paddress (get_objfile_arch (objfile), pc)); + psymtab_to_symtab (objfile, ps); return ps->symtab; } return NULL; @@ -411,7 +416,8 @@ find_pc_sect_symtab_from_partial (struct objfile *objfile, Return 0 if none. */ static struct partial_symbol * -find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc, +find_pc_sect_psymbol (struct objfile *objfile, + struct partial_symtab *psymtab, CORE_ADDR pc, struct obj_section *section) { struct partial_symbol *best = NULL, *p, **pp; @@ -425,8 +431,8 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc, /* Search the global symbols as well as the static symbols, so that find_pc_partial_function doesn't use a minimal symbol and thus cache a bad endaddr. */ - for (pp = psymtab->objfile->global_psymbols.list + psymtab->globals_offset; - (pp - (psymtab->objfile->global_psymbols.list + psymtab->globals_offset) + for (pp = objfile->global_psymbols.list + psymtab->globals_offset; + (pp - (objfile->global_psymbols.list + psymtab->globals_offset) < psymtab->n_global_syms); pp++) { @@ -440,7 +446,7 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc, { if (section) /* Match on a specific section. */ { - fixup_psymbol_section (p, psymtab->objfile); + fixup_psymbol_section (p, objfile); if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section)) continue; } @@ -449,8 +455,8 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc, } } - for (pp = psymtab->objfile->static_psymbols.list + psymtab->statics_offset; - (pp - (psymtab->objfile->static_psymbols.list + psymtab->statics_offset) + for (pp = objfile->static_psymbols.list + psymtab->statics_offset; + (pp - (objfile->static_psymbols.list + psymtab->statics_offset) < psymtab->n_static_syms); pp++) { @@ -464,7 +470,7 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc, { if (section) /* Match on a specific section. */ { - fixup_psymbol_section (p, psymtab->objfile); + fixup_psymbol_section (p, objfile); if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section)) continue; } @@ -518,10 +524,11 @@ lookup_symbol_aux_psymtabs (struct objfile *objfile, ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) { - if (!ps->readin && lookup_partial_symbol (ps, name, psymtab_index, domain)) + if (!ps->readin && lookup_partial_symbol (objfile, ps, name, + psymtab_index, domain)) { struct symbol *sym = NULL; - struct symtab *stab = psymtab_to_symtab (ps); + struct symtab *stab = psymtab_to_symtab (objfile, ps); /* Some caution must be observed with overloaded functions and methods, since the psymtab will not contain any overload @@ -558,7 +565,8 @@ lookup_symbol_aux_psymtabs (struct objfile *objfile, with MATCH. Returns the symbol, if found, and otherwise NULL. */ static struct partial_symbol * -match_partial_symbol (struct partial_symtab *pst, int global, +match_partial_symbol (struct objfile *objfile, + struct partial_symtab *pst, int global, const char *name, domain_enum domain, symbol_compare_ftype *match, symbol_compare_ftype *ordered_compare) @@ -571,8 +579,8 @@ match_partial_symbol (struct partial_symtab *pst, int global, if (length == 0) return NULL; start = (global ? - pst->objfile->global_psymbols.list + pst->globals_offset : - pst->objfile->static_psymbols.list + pst->statics_offset); + objfile->global_psymbols.list + pst->globals_offset : + objfile->static_psymbols.list + pst->statics_offset); if (global && ordered_compare) /* Can use a binary search. */ { @@ -674,7 +682,8 @@ psymtab_search_name (const char *name) Check the global symbols if GLOBAL, the static symbols if not. */ static struct partial_symbol * -lookup_partial_symbol (struct partial_symtab *pst, const char *name, +lookup_partial_symbol (struct objfile *objfile, + struct partial_symtab *pst, const char *name, int global, domain_enum domain) { struct partial_symbol **start, **psym; @@ -692,8 +701,8 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name, search_name = psymtab_search_name (name); cleanup = make_cleanup (xfree, search_name); start = (global ? - pst->objfile->global_psymbols.list + pst->globals_offset : - pst->objfile->static_psymbols.list + pst->statics_offset); + objfile->global_psymbols.list + pst->globals_offset : + objfile->static_psymbols.list + pst->statics_offset); if (global) /* This means we can use a binary search. */ { @@ -778,7 +787,7 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name, This is fast after the first time you do it. */ static struct symtab * -psymtab_to_symtab (struct partial_symtab *pst) +psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst) { /* If it is a shared psymtab, find an unshared psymtab that includes it. Any such psymtab will do. */ @@ -794,7 +803,7 @@ psymtab_to_symtab (struct partial_symtab *pst) { struct cleanup *back_to = increment_reading_symtab (); - (*pst->read_symtab) (pst); + (*pst->read_symtab) (objfile, pst); do_cleanups (back_to); } @@ -860,7 +869,7 @@ find_last_source_symtab_from_partial (struct objfile *ofp) "readin pst found and no symtabs.")); } else - return psymtab_to_symtab (cs_pst); + return psymtab_to_symtab (ofp, cs_pst); } return NULL; } @@ -1007,7 +1016,7 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab, } fprintf_filtered (outfile, " Relocate symbols by "); - for (i = 0; i < psymtab->objfile->num_sections; ++i) + for (i = 0; i < objfile->num_sections; ++i) { if (i != 0) fprintf_filtered (outfile, ", "); @@ -1088,10 +1097,6 @@ dump_psymtabs_for_objfile (struct objfile *objfile) psymtab->filename); gdb_print_host_address (psymtab, gdb_stdout); printf_filtered (", "); - if (psymtab->objfile != objfile) - { - printf_filtered ("NOT ON CHAIN! "); - } wrap_here (" "); } printf_filtered ("\n\n"); @@ -1111,11 +1116,11 @@ read_symtabs_for_function (struct objfile *objfile, const char *func_name) if (ps->readin) continue; - if ((lookup_partial_symbol (ps, func_name, 1, VAR_DOMAIN) + if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN) != NULL) - || (lookup_partial_symbol (ps, func_name, 0, VAR_DOMAIN) + || (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN) != NULL)) - psymtab_to_symtab (ps); + psymtab_to_symtab (objfile, ps); } } @@ -1126,7 +1131,7 @@ expand_partial_symbol_tables (struct objfile *objfile) ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab) { - psymtab_to_symtab (psymtab); + psymtab_to_symtab (objfile, psymtab); } } @@ -1142,7 +1147,7 @@ read_psymtabs_with_filename (struct objfile *objfile, const char *filename) continue; if (filename_cmp (filename, p->filename) == 0) - psymtab_to_symtab (p); + psymtab_to_symtab (objfile, p); } } @@ -1220,7 +1225,7 @@ find_symbol_file_from_partial (struct objfile *objfile, const char *name) ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst) { - if (lookup_partial_symbol (pst, name, 1, VAR_DOMAIN)) + if (lookup_partial_symbol (objfile, pst, name, 1, VAR_DOMAIN)) return pst->filename; } return NULL; @@ -1273,10 +1278,10 @@ map_matching_symbols_psymtab (const char *name, domain_enum namespace, { QUIT; if (ps->readin - || match_partial_symbol (ps, global, name, namespace, match, + || match_partial_symbol (objfile, ps, global, name, namespace, match, ordered_compare)) { - struct symtab *s = psymtab_to_symtab (ps); + struct symtab *s = psymtab_to_symtab (objfile, ps); struct block *block; if (s == NULL || !s->primary) @@ -1414,7 +1419,7 @@ expand_symtabs_matching_via_partial } if (recursively_search_psymtabs (ps, objfile, kind, name_matcher, data)) - psymtab_to_symtab (ps); + psymtab_to_symtab (objfile, ps); } } @@ -1461,11 +1466,11 @@ compare_psymbols (const void *s1p, const void *s2p) } void -sort_pst_symbols (struct partial_symtab *pst) +sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst) { /* Sort the global list; don't sort the static list. */ - qsort (pst->objfile->global_psymbols.list + pst->globals_offset, + qsort (objfile->global_psymbols.list + pst->globals_offset, pst->n_global_syms, sizeof (struct partial_symbol *), compare_psymbols); } @@ -1760,7 +1765,6 @@ allocate_psymtab (const char *filename, struct objfile *objfile) Psymtabs are searched in most recent inserted -> least recent inserted order. */ - psymtab->objfile = objfile; psymtab->next = objfile->psymtabs; objfile->psymtabs = psymtab; @@ -1788,7 +1792,7 @@ allocate_psymtab (const char *filename, struct objfile *objfile) } void -discard_psymtab (struct partial_symtab *pst) +discard_psymtab (struct objfile *objfile, struct partial_symtab *pst) { struct partial_symtab **prev_pst; @@ -1801,15 +1805,15 @@ discard_psymtab (struct partial_symtab *pst) /* First, snip it out of the psymtab chain. */ - prev_pst = &(pst->objfile->psymtabs); + prev_pst = &(objfile->psymtabs); while ((*prev_pst) != pst) prev_pst = &((*prev_pst)->next); (*prev_pst) = pst->next; /* Next, put it on a free list for recycling. */ - pst->next = pst->objfile->free_psymtabs; - pst->objfile->free_psymtabs = pst; + pst->next = objfile->free_psymtabs; + objfile->free_psymtabs = pst; } @@ -1922,7 +1926,7 @@ maintenance_info_psymtabs (char *regexp, int from_tty) if (psymtab->n_global_syms) { printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n", - host_address_to_string (psymtab->objfile->global_psymbols.list + host_address_to_string (objfile->global_psymbols.list + psymtab->globals_offset), psymtab->n_global_syms); } @@ -1932,7 +1936,7 @@ maintenance_info_psymtabs (char *regexp, int from_tty) if (psymtab->n_static_syms) { printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n", - host_address_to_string (psymtab->objfile->static_psymbols.list + host_address_to_string (objfile->static_psymbols.list + psymtab->statics_offset), psymtab->n_static_syms); } @@ -1985,12 +1989,12 @@ maintenance_check_symtabs (char *ignore, int from_tty) { struct gdbarch *gdbarch = get_objfile_arch (objfile); - s = psymtab_to_symtab (ps); + s = psymtab_to_symtab (objfile, ps); if (s == NULL) continue; bv = BLOCKVECTOR (s); b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK); - psym = ps->objfile->static_psymbols.list + ps->statics_offset; + psym = objfile->static_psymbols.list + ps->statics_offset; length = ps->n_static_syms; while (length--) { @@ -2007,7 +2011,7 @@ maintenance_check_symtabs (char *ignore, int from_tty) psym++; } b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); - psym = ps->objfile->global_psymbols.list + ps->globals_offset; + psym = objfile->global_psymbols.list + ps->globals_offset; length = ps->n_global_syms; while (length--) { |