X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fdbxread.c;h=ecfa89ae0cd0269679c5bd9b8434a9c35a1099fa;hb=c1b5c1ebc938b6dc0277363b8c47d75b0b5a621f;hp=60d384b27fe533c0b33410a888bea590462df7c7;hpb=f252c6d5dc49cb27838e153e863f16ea7895859e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/dbxread.c b/gdb/dbxread.c index 60d384b27f..ecfa89ae0c 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -61,7 +61,7 @@ /* Key for dbx-associated data. */ -const struct objfile_data *dbx_objfile_data_key; +objfile_key dbx_objfile_data_key; /* We put a pointer to this structure in the read_symtab_private field of the psymtab. */ @@ -207,10 +207,10 @@ find_text_range (bfd * sym_bfd, struct objfile *objfile) CORE_ADDR end = 0; for (sec = sym_bfd->sections; sec; sec = sec->next) - if (bfd_get_section_flags (sym_bfd, sec) & SEC_CODE) + if (bfd_section_flags (sec) & SEC_CODE) { - CORE_ADDR sec_start = bfd_section_vma (sym_bfd, sec); - CORE_ADDR sec_end = sec_start + bfd_section_size (sym_bfd, sec); + CORE_ADDR sec_start = bfd_section_vma (sec); + CORE_ADDR sec_end = sec_start + bfd_section_size (sec); if (found_any) { @@ -587,14 +587,12 @@ dbx_symfile_init (struct objfile *objfile) { int val; bfd *sym_bfd = objfile->obfd; - char *name = bfd_get_filename (sym_bfd); + const char *name = bfd_get_filename (sym_bfd); asection *text_sect; unsigned char size_temp[DBX_STRINGTAB_SIZE_SIZE]; - struct dbx_symfile_info *dbx; /* Allocate struct to keep track of the symfile. */ - dbx = XCNEW (struct dbx_symfile_info); - set_objfile_data (objfile, dbx_objfile_data_key, dbx); + dbx_objfile_data_key.emplace (objfile); DBX_TEXT_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".text"); DBX_DATA_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".data"); @@ -609,8 +607,8 @@ dbx_symfile_init (struct objfile *objfile) text_sect = bfd_get_section_by_name (sym_bfd, ".text"); if (!text_sect) error (_("Can't find .text section in symbol file")); - DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect); - DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect); + DBX_TEXT_ADDR (objfile) = bfd_section_vma (text_sect); + DBX_TEXT_SIZE (objfile) = bfd_section_size (text_sect); DBX_SYMBOL_SIZE (objfile) = obj_symbol_entry_size (sym_bfd); DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd); @@ -703,15 +701,12 @@ dbx_symfile_finish (struct objfile *objfile) free_header_files (); } -static void -dbx_free_symfile_info (struct objfile *objfile, void *arg) +dbx_symfile_info::~dbx_symfile_info () { - struct dbx_symfile_info *dbx = (struct dbx_symfile_info *) arg; - - if (dbx->header_files != NULL) + if (header_files != NULL) { - int i = dbx->n_header_files; - struct header_file *hfiles = dbx->header_files; + int i = n_header_files; + struct header_file *hfiles = header_files; while (--i >= 0) { @@ -720,8 +715,6 @@ dbx_free_symfile_info (struct objfile *objfile, void *arg) } xfree (hfiles); } - - xfree (dbx); } @@ -747,7 +740,8 @@ static char *stringtab_global; /* These variables are used to control fill_symbuf when the stabs symbols are not contiguous (as may be the case when a COFF file is linked using --split-by-reloc). */ -static struct stab_section_list *symbuf_sections; +static const std::vector *symbuf_sections; +static size_t sect_idx; static unsigned int symbuf_left; static unsigned int symbuf_read; @@ -783,13 +777,13 @@ fill_symbuf (bfd *sym_bfd) { if (symbuf_left <= 0) { - file_ptr filepos = symbuf_sections->section->filepos; + file_ptr filepos = (*symbuf_sections)[sect_idx]->filepos; if (bfd_seek (sym_bfd, filepos, SEEK_SET) != 0) perror_with_name (bfd_get_filename (sym_bfd)); - symbuf_left = bfd_section_size (sym_bfd, symbuf_sections->section); + symbuf_left = bfd_section_size ((*symbuf_sections)[sect_idx]); symbol_table_offset = filepos - symbuf_read; - symbuf_sections = symbuf_sections->next; + ++sect_idx; } count = symbuf_left; @@ -1446,9 +1440,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) if (!new_name.empty ()) { sym_len = new_name.length (); - sym_name = (char *) obstack_copy0 (&objfile->objfile_obstack, - new_name.c_str (), - sym_len); + sym_name = obstack_strdup (&objfile->objfile_obstack, + new_name); } } @@ -1471,7 +1464,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) if (gdbarch_static_transform_name_p (gdbarch)) gdbarch_static_transform_name (gdbarch, namestring); - add_psymbol_to_list (sym_name, sym_len, 1, + add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true, VAR_DOMAIN, LOC_STATIC, data_sect_index, psymbol_placement::STATIC, @@ -1481,7 +1474,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) case 'G': /* The addresses in these entries are reported to be wrong. See the code that reads 'G's for symtabs. */ - add_psymbol_to_list (sym_name, sym_len, 1, + add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true, VAR_DOMAIN, LOC_STATIC, data_sect_index, psymbol_placement::GLOBAL, @@ -1499,15 +1492,15 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) || (p == namestring + 1 && namestring[0] != ' ')) { - add_psymbol_to_list (sym_name, sym_len, 1, - STRUCT_DOMAIN, LOC_TYPEDEF, -1, + add_psymbol_to_list (gdb::string_view (sym_name, sym_len), + true, STRUCT_DOMAIN, LOC_TYPEDEF, -1, psymbol_placement::STATIC, 0, psymtab_language, objfile); if (p[2] == 't') { /* Also a typedef with the same name. */ - add_psymbol_to_list (sym_name, sym_len, 1, - VAR_DOMAIN, LOC_TYPEDEF, -1, + add_psymbol_to_list (gdb::string_view (sym_name, sym_len), + true, VAR_DOMAIN, LOC_TYPEDEF, -1, psymbol_placement::STATIC, 0, psymtab_language, objfile); p += 1; @@ -1518,8 +1511,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) case 't': if (p != namestring) /* a name is there, not just :T... */ { - add_psymbol_to_list (sym_name, sym_len, 1, - VAR_DOMAIN, LOC_TYPEDEF, -1, + add_psymbol_to_list (gdb::string_view (sym_name, sym_len), + true, VAR_DOMAIN, LOC_TYPEDEF, -1, psymbol_placement::STATIC, 0, psymtab_language, objfile); } @@ -1579,7 +1572,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) ; /* Note that the value doesn't matter for enum constants in psymtabs, just in symtabs. */ - add_psymbol_to_list (p, q - p, 1, + add_psymbol_to_list (gdb::string_view (p, q - p), true, VAR_DOMAIN, LOC_CONST, -1, psymbol_placement::STATIC, 0, psymtab_language, objfile); @@ -1597,7 +1590,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) case 'c': /* Constant, e.g. from "const" in Pascal. */ - add_psymbol_to_list (sym_name, sym_len, 1, + add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true, VAR_DOMAIN, LOC_CONST, -1, psymbol_placement::STATIC, 0, psymtab_language, objfile); @@ -1652,7 +1645,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) pst->set_text_low (nlist.n_value); textlow_not_set = 0; } - add_psymbol_to_list (sym_name, sym_len, 1, + add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true, VAR_DOMAIN, LOC_BLOCK, SECT_OFF_TEXT (objfile), psymbol_placement::STATIC, @@ -1711,7 +1704,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) pst->set_text_low (nlist.n_value); textlow_not_set = 0; } - add_psymbol_to_list (sym_name, sym_len, 1, + add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true, VAR_DOMAIN, LOC_BLOCK, SECT_OFF_TEXT (objfile), psymbol_placement::GLOBAL, @@ -2305,7 +2298,7 @@ read_ofile_symtab (struct objfile *objfile, struct partial_symtab *pst) else if (type & N_EXT || type == (unsigned char) N_TEXT || type == (unsigned char) N_NBTEXT) { - /* Global symbol: see if we came across a dbx defintion for + /* Global symbol: see if we came across a dbx definition for a corresponding symbol. If so, store the value. Remove syms from the chain when their values are stored, but search the whole chain, as there may be several syms from @@ -2348,7 +2341,7 @@ cp_set_block_scope (const struct symbol *symbol, struct block *block, struct obstack *obstack) { - if (SYMBOL_DEMANGLED_NAME (symbol) != NULL) + if (symbol->demangled_name () != NULL) { /* Try to figure out the appropriate namespace from the demangled name. */ @@ -2358,11 +2351,10 @@ cp_set_block_scope (const struct symbol *symbol, name of the class as well. This should be harmless, but is a little unfortunate. */ - const char *name = SYMBOL_DEMANGLED_NAME (symbol); + const char *name = symbol->demangled_name (); unsigned int prefix_len = cp_entire_prefix_len (name); - block_set_scope (block, - (const char *) obstack_copy0 (obstack, name, prefix_len), + block_set_scope (block, obstack_strndup (obstack, name, prefix_len), obstack); } } @@ -2464,7 +2456,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name, cstk.start_addr, cstk.start_addr + valu); /* For C++, set the block's scope. */ - if (SYMBOL_LANGUAGE (cstk.name) == language_cplus) + if (cstk.name->language () == language_cplus) cp_set_block_scope (cstk.name, block, &objfile->objfile_obstack); /* May be switching to an assembler file which may not be using @@ -2636,7 +2628,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name, function-relative symbols. */ valu += function_start_offset; - /* GCC 2.95.3 emits the first N_SLINE stab somwehere in the + /* GCC 2.95.3 emits the first N_SLINE stab somewhere in the middle of the prologue instead of right at the start of the function. To deal with this we record the address for the first N_SLINE stab to be the start of the function instead of @@ -2831,7 +2823,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name, cstk.start_addr, valu); /* For C++, set the block's scope. */ - if (SYMBOL_LANGUAGE (cstk.name) == language_cplus) + if (cstk.name->language () == language_cplus) cp_set_block_scope (cstk.name, block, &objfile->objfile_obstack); } @@ -2942,14 +2934,17 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name, void coffstab_build_psymtabs (struct objfile *objfile, CORE_ADDR textaddr, unsigned int textsize, - struct stab_section_list *stabsects, + const std::vector &stabsects, file_ptr stabstroffset, unsigned int stabstrsize) { int val; bfd *sym_bfd = objfile->obfd; - char *name = bfd_get_filename (sym_bfd); + const char *name = bfd_get_filename (sym_bfd); unsigned int stabsize; + /* Allocate struct to keep track of stab reading. */ + dbx_objfile_data_key.emplace (objfile); + DBX_TEXT_ADDR (objfile) = textaddr; DBX_TEXT_SIZE (objfile) = textsize; @@ -2981,27 +2976,28 @@ coffstab_build_psymtabs (struct objfile *objfile, /* In a coff file, we've already installed the minimal symbols that came from the coff (non-stab) symbol table, so always act like an incremental load here. */ - if (stabsects->next == NULL) + scoped_restore save_symbuf_sections + = make_scoped_restore (&symbuf_sections); + if (stabsects.size () == 1) { - stabsize = bfd_section_size (sym_bfd, stabsects->section); + stabsize = bfd_section_size (stabsects[0]); DBX_SYMCOUNT (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile); - DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos; + DBX_SYMTAB_OFFSET (objfile) = stabsects[0]->filepos; } else { - struct stab_section_list *stabsect; - DBX_SYMCOUNT (objfile) = 0; - for (stabsect = stabsects; stabsect != NULL; stabsect = stabsect->next) + for (asection *section : stabsects) { - stabsize = bfd_section_size (sym_bfd, stabsect->section); + stabsize = bfd_section_size (section); DBX_SYMCOUNT (objfile) += stabsize / DBX_SYMBOL_SIZE (objfile); } - DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos; + DBX_SYMTAB_OFFSET (objfile) = stabsects[0]->filepos; - symbuf_sections = stabsects->next; - symbuf_left = bfd_section_size (sym_bfd, stabsects->section); + sect_idx = 1; + symbuf_sections = &stabsects; + symbuf_left = bfd_section_size (stabsects[0]); symbuf_read = 0; } @@ -3030,7 +3026,12 @@ elfstab_build_psymtabs (struct objfile *objfile, asection *stabsect, { int val; bfd *sym_bfd = objfile->obfd; - char *name = bfd_get_filename (sym_bfd); + const char *name = bfd_get_filename (sym_bfd); + + stabsread_new_init (); + + /* Allocate struct to keep track of stab reading. */ + dbx_objfile_data_key.emplace (objfile); /* Find the first and last text address. dbx_symfile_read seems to want this. */ @@ -3039,7 +3040,7 @@ elfstab_build_psymtabs (struct objfile *objfile, asection *stabsect, #define ELF_STABS_SYMBOL_SIZE 12 /* XXX FIXME XXX */ DBX_SYMBOL_SIZE (objfile) = ELF_STABS_SYMBOL_SIZE; DBX_SYMCOUNT (objfile) - = bfd_section_size (objfile->obfd, stabsect) / DBX_SYMBOL_SIZE (objfile); + = bfd_section_size (stabsect) / DBX_SYMBOL_SIZE (objfile); DBX_STRINGTAB_SIZE (objfile) = stabstrsize; DBX_SYMTAB_OFFSET (objfile) = stabsect->filepos; DBX_STAB_SECTION (objfile) = stabsect; @@ -3066,7 +3067,7 @@ elfstab_build_psymtabs (struct objfile *objfile, asection *stabsect, processing_acc_compilation = 1; symbuf_read = 0; - symbuf_left = bfd_section_size (objfile->obfd, stabsect); + symbuf_left = bfd_section_size (stabsect); scoped_restore restore_stabs_data = make_scoped_restore (&stabs_data); gdb::unique_xmalloc_ptr data_holder; @@ -3106,11 +3107,10 @@ stabsect_build_psymtabs (struct objfile *objfile, char *stab_name, { int val; bfd *sym_bfd = objfile->obfd; - char *name = bfd_get_filename (sym_bfd); + const char *name = bfd_get_filename (sym_bfd); asection *stabsect; asection *stabstrsect; asection *text_sect; - struct dbx_symfile_info *dbx; stabsect = bfd_get_section_by_name (sym_bfd, stab_name); stabstrsect = bfd_get_section_by_name (sym_bfd, stabstr_name); @@ -3123,19 +3123,18 @@ stabsect_build_psymtabs (struct objfile *objfile, char *stab_name, "but not string section (%s)"), stab_name, stabstr_name); - dbx = XCNEW (struct dbx_symfile_info); - set_objfile_data (objfile, dbx_objfile_data_key, dbx); + dbx_objfile_data_key.emplace (objfile); text_sect = bfd_get_section_by_name (sym_bfd, text_name); if (!text_sect) error (_("Can't find %s section in symbol file"), text_name); - DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect); - DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect); + DBX_TEXT_ADDR (objfile) = bfd_section_vma (text_sect); + DBX_TEXT_SIZE (objfile) = bfd_section_size (text_sect); DBX_SYMBOL_SIZE (objfile) = sizeof (struct external_nlist); - DBX_SYMCOUNT (objfile) = bfd_section_size (sym_bfd, stabsect) + DBX_SYMCOUNT (objfile) = bfd_section_size (stabsect) / DBX_SYMBOL_SIZE (objfile); - DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stabstrsect); + DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (stabstrsect); DBX_SYMTAB_OFFSET (objfile) = stabsect->filepos; /* XXX - FIXME: POKING INSIDE BFD DATA STRUCTURES */ @@ -3189,7 +3188,4 @@ void _initialize_dbxread (void) { add_symtab_fns (bfd_target_aout_flavour, &aout_sym_fns); - - dbx_objfile_data_key - = register_objfile_data_with_cleanup (NULL, dbx_free_symfile_info); }