From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 57127 invoked by alias); 23 Apr 2017 20:23:30 -0000 Mailing-List: contact archer-commits-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: Received: (qmail 57091 invoked by uid 9674); 23 Apr 2017 20:23:30 -0000 Date: Sun, 23 Apr 2017 20:23:00 -0000 Message-ID: <20170423202330.57064.qmail@sourceware.org> From: jkratoch@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] users/jkratoch/indexcxx-nameswrite-namesread: . X-Git-Refname: refs/heads/users/jkratoch/indexcxx-nameswrite-namesread X-Git-Reftype: branch X-Git-Oldrev: f037c45796b4b47969b17cab1355366eb461f2d1 X-Git-Newrev: c29f36f52c1d6be48fa15d75ee66bc10161661b4 X-SW-Source: 2017-q2/txt/msg00012.txt.bz2 List-Id: The branch, users/jkratoch/indexcxx-nameswrite-namesread has been updated via c29f36f52c1d6be48fa15d75ee66bc10161661b4 (commit) from f037c45796b4b47969b17cab1355366eb461f2d1 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit c29f36f52c1d6be48fa15d75ee66bc10161661b4 Author: Jan Kratochvil Date: Sun Apr 23 22:23:16 2017 +0200 . ----------------------------------------------------------------------- Summary of changes: gdb/defs.h | 6 ++ gdb/dwarf2read.c | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++- gdb/elfread.c | 28 +++++-- gdb/psymtab.h | 1 + gdb/symfile.h | 3 +- gdb/xcoffread.c | 1 + 6 files changed, 243 insertions(+), 14 deletions(-) First 500 lines of diff: diff --git a/gdb/defs.h b/gdb/defs.h index a0b586f..79648ca 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -724,6 +724,12 @@ extern int (*deprecated_ui_load_progress_hook) (const char *section, extern void initialize_progspace (void); extern void initialize_inferiors (void); +// From elfread.c + +extern const struct sym_fns elf_sym_fns_lazy_psyms; +extern const struct sym_fns elf_sym_fns_gdb_index; +extern const struct sym_fns elf_sym_fns_debug_names; + /* * Special block numbers */ enum block_enum diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index f778a31..c3acae1 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -240,6 +240,7 @@ struct dwarf2_per_objfile struct dwarf2_section_info frame; struct dwarf2_section_info eh_frame; struct dwarf2_section_info gdb_index; + struct dwarf2_section_info debug_names; VEC (dwarf2_section_info_def) *types; @@ -355,6 +356,7 @@ static const struct dwarf2_debug_sections dwarf2_elf_names = { ".debug_frame", ".zdebug_frame" }, { ".eh_frame", NULL }, { ".gdb_index", ".zgdb_index" }, + { ".debug_names", ".zdebug_names" }, 23 }; @@ -1016,6 +1018,7 @@ struct dwz_file struct dwarf2_section_info line; struct dwarf2_section_info macro; struct dwarf2_section_info gdb_index; + struct dwarf2_section_info debug_names; /* The dwz's BFD. */ bfd *dwz_bfd; @@ -2421,6 +2424,11 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *vnames) dwarf2_per_objfile->gdb_index.s.section = sectp; dwarf2_per_objfile->gdb_index.size = bfd_get_section_size (sectp); } + else if (section_is_p (sectp->name, &names->debug_names)) + { + dwarf2_per_objfile->debug_names.s.section = sectp; + dwarf2_per_objfile->debug_names.size = bfd_get_section_size (sectp); + } if ((bfd_get_section_flags (abfd, sectp) & (SEC_LOAD | SEC_ALLOC)) && bfd_section_vma (abfd, sectp) == 0) @@ -2617,6 +2625,11 @@ locate_dwz_sections (bfd *abfd, asection *sectp, void *arg) dwz_file->gdb_index.s.section = sectp; dwz_file->gdb_index.size = bfd_get_section_size (sectp); } + else if (section_is_p (sectp->name, &dwarf2_elf_names.debug_names)) + { + dwz_file->debug_names.s.section = sectp; + dwz_file->debug_names.size = bfd_get_section_size (sectp); + } } /* Open the separate '.dwz' debug file, if needed. Return NULL if @@ -3329,8 +3342,106 @@ to use the section anyway."), return 1; } +/* A helper function that reads the .debug_names from SECTION and fills + in MAP. FILENAME is the name of the file containing the section; + it is used for error reporting. + + CU_LIST, CU_LIST_ELEMENTS, TYPES_LIST, and TYPES_LIST_ELEMENTS are + out parameters that are filled in with information about the CU and + TU lists in the section. + + Returns 1 if all went well, 0 otherwise. */ + +static int +read_debug_names_from_section (struct objfile *objfile, + const char *filename, + struct dwarf2_section_info *section, + struct mapped_index *map, + const gdb_byte **cu_list, + offset_type *cu_list_elements, + const gdb_byte **types_list, + offset_type *types_list_elements) +{ + const gdb_byte *addr; + offset_type version; + offset_type *metadata; + int i; + + if (dwarf2_section_empty_p (section)) + return 0; + + /* Older elfutils strip versions could keep the section in the main + executable while splitting it for the separate debug info file. */ + if ((get_section_flags (section) & SEC_HAS_CONTENTS) == 0) + return 0; + + dwarf2_read_section (objfile, section); + + addr = section->buffer; + /* Version check. */ + version = MAYBE_SWAP (*(offset_type *) addr); + /* Versions earlier than 3 emitted every copy of a psymbol. This + causes the index to behave very poorly for certain requests. Version 3 + contained incomplete addrmap. So, it seems better to just ignore such + indices. */ + if (version < 4) + { + static int warning_printed = 0; + if (!warning_printed) + { + warning (_("Skipping obsolete .gdb_index section in %s."), + filename); + warning_printed = 1; + } + return 0; + } + /* Version 7 indices generated by gold refer to the CU for a symbol instead + of the TU (for symbols coming from TUs), + http://sourceware.org/bugzilla/show_bug.cgi?id=15021. + Plus gold-generated indices can have duplicate entries for global symbols, + http://sourceware.org/bugzilla/show_bug.cgi?id=15646. + These are just performance bugs, and we can't distinguish gdb-generated + indices from gold-generated ones, so issue no warning here. */ + + /* Indexes with higher version than the one supported by GDB may be no + longer backward compatible. */ + if (version > 8) + return 0; + + map->version = version; + map->total_size = section->size; + + metadata = (offset_type *) (addr + sizeof (offset_type)); + + i = 0; + *cu_list = addr + MAYBE_SWAP (metadata[i]); + *cu_list_elements = ((MAYBE_SWAP (metadata[i + 1]) - MAYBE_SWAP (metadata[i])) + / 8); + ++i; + + *types_list = addr + MAYBE_SWAP (metadata[i]); + *types_list_elements = ((MAYBE_SWAP (metadata[i + 1]) + - MAYBE_SWAP (metadata[i])) + / 8); + ++i; + + map->address_table = addr + MAYBE_SWAP (metadata[i]); + map->address_table_size = (MAYBE_SWAP (metadata[i + 1]) + - MAYBE_SWAP (metadata[i])); + ++i; + + map->symbol_table = (offset_type *) (addr + MAYBE_SWAP (metadata[i])); + map->symbol_table_slots = ((MAYBE_SWAP (metadata[i + 1]) + - MAYBE_SWAP (metadata[i])) + / (2 * sizeof (offset_type))); + ++i; + + map->constant_pool = (char *) (addr + MAYBE_SWAP (metadata[i])); + + return 1; +} -/* Read the index file. If everything went ok, initialize the "quick" +/* Read .gdb_index. If everything went ok, initialize the "quick" elements of all the CUs and return 1. Otherwise, return 0. */ static int @@ -3406,6 +3517,81 @@ dwarf2_read_index (struct objfile *objfile) return 1; } +/* Read .debug_names. If everything went ok, initialize the "quick" + elements of all the CUs and return true. Otherwise, return false. */ + +static bool +dwarf2_read_debug_names (struct objfile *objfile) +{ + struct mapped_index local_map, *map; + const gdb_byte *cu_list, *types_list, *dwz_list = NULL; + offset_type cu_list_elements, types_list_elements, dwz_list_elements = 0; + struct dwz_file *dwz; + + if (!read_debug_names_from_section (objfile, objfile_name (objfile), + &dwarf2_per_objfile->debug_names, + &local_map, &cu_list, &cu_list_elements, + &types_list, &types_list_elements)) + return false; + + /* Don't use the index if it's empty. */ + if (local_map.symbol_table_slots == 0) + return false; + + /* If there is a .dwz file, read it so we can get its CU list as + well. */ + dwz = dwarf2_get_dwz_file (); + if (dwz != NULL) + { + struct mapped_index dwz_map; + const gdb_byte *dwz_types_ignore; + offset_type dwz_types_elements_ignore; + + if (!read_debug_names_from_section (objfile, + bfd_get_filename (dwz->dwz_bfd), + &dwz->debug_names, &dwz_map, + &dwz_list, &dwz_list_elements, + &dwz_types_ignore, + &dwz_types_elements_ignore)) + { + warning (_("could not read '.debug_names' section from %s; skipping"), + bfd_get_filename (dwz->dwz_bfd)); + return false; + } + } + + create_cus_from_index (objfile, cu_list, cu_list_elements, dwz_list, + dwz_list_elements); + + if (types_list_elements) + { + struct dwarf2_section_info *section; + + /* We can only handle a single .debug_types when we have an + index. */ + if (VEC_length (dwarf2_section_info_def, dwarf2_per_objfile->types) != 1) + return false; + + section = VEC_index (dwarf2_section_info_def, + dwarf2_per_objfile->types, 0); + + create_signatured_type_table_from_index (objfile, section, types_list, + types_list_elements); + } + + create_addrmap_from_index (objfile, &local_map); + + map = XOBNEW (&objfile->objfile_obstack, struct mapped_index); + *map = local_map; + + dwarf2_per_objfile->index_table = map; + dwarf2_per_objfile->using_index = 1; + dwarf2_per_objfile->quick_file_names_table = + create_quick_file_names_table (dwarf2_per_objfile->n_comp_units); + + return true; +} + /* A helper for the "quick" functions which sets the global dwarf2_per_objfile according to OBJFILE. */ @@ -4350,10 +4536,29 @@ const struct quick_symbol_functions dwarf2_gdb_index_functions = dw2_map_symbol_filenames }; +const struct quick_symbol_functions dwarf2_debug_names_functions = +{ + dw2_has_symbols, + dw2_find_last_source_symtab, + dw2_forget_cached_source_info, + dw2_map_symtabs_matching_filename, + dw2_lookup_symbol, + dw2_print_stats, + dw2_dump, + dw2_relocate, + dw2_expand_symtabs_for_function, + dw2_expand_all_symtabs, + dw2_expand_symtabs_with_fullname, + dw2_map_matching_symbols, + dw2_expand_symtabs_matching, + dw2_find_pc_sect_compunit_symtab, + dw2_map_symbol_filenames +}; + /* Initialize for reading DWARF for this objfile. Return 0 if this file will use psymtabs, or 1 if using the GNU index. */ -int +const sym_fns & dwarf2_initialize_objfile (struct objfile *objfile) { /* If we're about to read full symbols, don't bother with the @@ -4382,13 +4587,16 @@ dwarf2_initialize_objfile (struct objfile *objfile) /* Return 1 so that gdb sees the "quick" functions. However, these functions will be no-ops because we will have expanded all symtabs. */ - return 1; + return elf_sym_fns_gdb_index; } + if (dwarf2_read_debug_names (objfile)) + return elf_sym_fns_debug_names; + if (dwarf2_read_index (objfile)) - return 1; + return elf_sym_fns_gdb_index; - return 0; + return elf_sym_fns_lazy_psyms; } diff --git a/gdb/elfread.c b/gdb/elfread.c index fba2026..6f992d7 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -50,10 +50,6 @@ extern void _initialize_elfread (void); -/* Forward declarations. */ -extern const struct sym_fns elf_sym_fns_gdb_index; -extern const struct sym_fns elf_sym_fns_lazy_psyms; - /* The struct elfinfo is available only during ELF symbol table and psymtab reading. It is destroyed at the completion of psymtab-reading. It's local to elf_symfile_read. */ @@ -1237,10 +1233,7 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) information present in OBJFILE. If there is such debug info present never use .gdb_index. */ - if (!objfile_has_partial_symbols (objfile) - && dwarf2_initialize_objfile (objfile)) - objfile_set_sym_fns (objfile, &elf_sym_fns_gdb_index); - else + if (objfile_has_partial_symbols (objfile)) { /* It is ok to do this even if the stabs reader made some partial symbols, because OBJF_PSYMTABS_READ has not been @@ -1248,6 +1241,8 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) when needed. */ objfile_set_sym_fns (objfile, &elf_sym_fns_lazy_psyms); } + else + objfile_set_sym_fns (objfile, &dwarf2_initialize_objfile (objfile)); } /* If the file has its own symbol tables it has no separate debug info. `.dynsym'/`.symtab' go to MSYMBOLS, `.debug_info' goes to @@ -1436,6 +1431,23 @@ const struct sym_fns elf_sym_fns_gdb_index = &dwarf2_gdb_index_functions }; +/* The same as elf_sym_fns, but not registered and uses the + DWARF-specific .debug_names index rather than psymtab. */ +const struct sym_fns elf_sym_fns_debug_names = +{ + elf_new_init, /* init anything gbl to entire symab */ + elf_symfile_init, /* read initial info, setup for sym_red() */ + elf_symfile_read, /* read a symbol file into symtab */ + NULL, /* sym_read_psymbols */ + elf_symfile_finish, /* finished with file, cleanup */ + default_symfile_offsets, /* Translate ext. to int. relocatin */ + elf_symfile_segments, /* Get segment information from a file. */ + NULL, + default_symfile_relocate, /* Relocate a debug section. */ + &elf_probe_fns, /* sym_probe_fns */ + &dwarf2_debug_names_functions +}; + /* STT_GNU_IFUNC resolver vector to be installed to gnu_ifunc_fns_p. */ static const struct gnu_ifunc_fns elf_gnu_ifunc_fns = diff --git a/gdb/psymtab.h b/gdb/psymtab.h index f0c9ae7..17ceb22 100644 --- a/gdb/psymtab.h +++ b/gdb/psymtab.h @@ -33,6 +33,7 @@ extern struct bcache *psymbol_bcache_get_bcache (struct psymbol_bcache *); extern const struct quick_symbol_functions psym_functions; extern const struct quick_symbol_functions dwarf2_gdb_index_functions; +extern const struct quick_symbol_functions dwarf2_debug_names_functions; /* Ensure that the partial symbols for OBJFILE have been loaded. If VERBOSE is non-zero, then this will print a message when symbols diff --git a/gdb/symfile.h b/gdb/symfile.h index ab536e8..5a3a0e5 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -606,6 +606,7 @@ struct dwarf2_debug_sections { struct dwarf2_section_names frame; struct dwarf2_section_names eh_frame; struct dwarf2_section_names gdb_index; + struct dwarf2_section_names debug_names; /* This field has no meaning, but exists solely to catch changes to this structure which are not reflected in some instance. */ int sentinel; @@ -625,7 +626,7 @@ extern void dwarf2_get_section_info (struct objfile *, asection **, const gdb_byte **, bfd_size_type *); -extern int dwarf2_initialize_objfile (struct objfile *); +extern const sym_fns &dwarf2_initialize_objfile (struct objfile *); extern void dwarf2_build_psymtabs (struct objfile *); extern void dwarf2_build_frame_info (struct objfile *); diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 4f22cec..fd61e90 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -174,6 +174,7 @@ static const struct dwarf2_debug_sections dwarf2_xcoff_names = { { ".dwframe", NULL }, { NULL, NULL }, /* eh_frame */ { NULL, NULL }, /* gdb_index */ + { NULL, NULL }, /* debug_names */ 23 }; hooks/post-receive -- Repository for Project Archer.