From f1902523c9b7941775a2c64af89de0f111b8924c Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Thu, 24 Aug 2017 10:26:52 +0200 Subject: [PATCH] DWARF-5: Fix -fdebug-types-section GDB was now accessing as signatured_type memory allocated only by size of dwarf2_per_cu_data. gdb/ChangeLog 2017-08-24 Jan Kratochvil * dwarf2read.c (build_type_psymtabs_reader): New prototype. (process_psymtab_comp_unit): Accept IS_DEBUG_TYPES. (read_comp_units_from_section): New parameter abbrev_section, use read_and_check_comp_unit_head, allocate signatured_type if needed. (create_all_comp_units): Update read_comp_units_from_section caller. --- gdb/ChangeLog | 8 +++++++ gdb/dwarf2read.c | 57 +++++++++++++++++++++++++++++++++--------------- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 437a9cb0721..5dba51dce4a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2017-08-24 Jan Kratochvil + + * dwarf2read.c (build_type_psymtabs_reader): New prototype. + (process_psymtab_comp_unit): Accept IS_DEBUG_TYPES. + (read_comp_units_from_section): New parameter abbrev_section, use + read_and_check_comp_unit_head, allocate signatured_type if needed. + (create_all_comp_units): Update read_comp_units_from_section caller. + 2017-08-23 Pedro Alves PR remote/21852 diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 38228500ab0..483d8eac48d 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -1542,6 +1542,11 @@ static void dwarf2_find_base_address (struct die_info *die, static struct partial_symtab *create_partial_symtab (struct dwarf2_per_cu_data *per_cu, const char *name); +static void build_type_psymtabs_reader (const struct die_reader_specs *reader, + const gdb_byte *info_ptr, + struct die_info *type_unit_die, + int has_children, void *data); + static void dwarf2_build_psymtabs_hard (struct objfile *); static void scan_partial_symbols (struct partial_die_info *, @@ -6319,8 +6324,6 @@ process_psymtab_comp_unit (struct dwarf2_per_cu_data *this_cu, int want_partial_unit, enum language pretend_language) { - struct process_psymtab_comp_unit_data info; - /* If this compilation unit was already read in, free the cached copy in order to read it in again. This is necessary because we skipped some symbols when we first @@ -6329,12 +6332,17 @@ process_psymtab_comp_unit (struct dwarf2_per_cu_data *this_cu, if (this_cu->cu != NULL) free_one_cached_comp_unit (this_cu); - gdb_assert (! this_cu->is_debug_types); - info.want_partial_unit = want_partial_unit; - info.pretend_language = pretend_language; - init_cutu_and_read_dies (this_cu, NULL, 0, 0, - process_psymtab_comp_unit_reader, - &info); + if (this_cu->is_debug_types) + init_cutu_and_read_dies (this_cu, NULL, 0, 0, build_type_psymtabs_reader, + NULL); + else + { + process_psymtab_comp_unit_data info; + info.want_partial_unit = want_partial_unit; + info.pretend_language = pretend_language; + init_cutu_and_read_dies (this_cu, NULL, 0, 0, + process_psymtab_comp_unit_reader, &info); + } /* Age out any secondary CUs. */ age_cached_comp_units (); @@ -6787,6 +6795,7 @@ load_partial_comp_unit (struct dwarf2_per_cu_data *this_cu) static void read_comp_units_from_section (struct objfile *objfile, struct dwarf2_section_info *section, + struct dwarf2_section_info *abbrev_section, unsigned int is_dwz, int *n_allocated, int *n_comp_units, @@ -6806,20 +6815,33 @@ read_comp_units_from_section (struct objfile *objfile, while (info_ptr < section->buffer + section->size) { - unsigned int length, initial_length_size; struct dwarf2_per_cu_data *this_cu; sect_offset sect_off = (sect_offset) (info_ptr - section->buffer); - /* Read just enough information to find out where the next - compilation unit is. */ - length = read_initial_length (abfd, info_ptr, &initial_length_size); + comp_unit_head cu_header; + read_and_check_comp_unit_head (&cu_header, section, abbrev_section, + info_ptr, rcuh_kind::COMPILE); /* Save the compilation unit for later lookup. */ - this_cu = XOBNEW (&objfile->objfile_obstack, struct dwarf2_per_cu_data); - memset (this_cu, 0, sizeof (*this_cu)); + if (cu_header.unit_type != DW_UT_type) + { + this_cu = XOBNEW (&objfile->objfile_obstack, + struct dwarf2_per_cu_data); + memset (this_cu, 0, sizeof (*this_cu)); + } + else + { + auto sig_type = XOBNEW (&objfile->objfile_obstack, + struct signatured_type); + memset (sig_type, 0, sizeof (*sig_type)); + sig_type->signature = cu_header.signature; + sig_type->type_offset_in_tu = cu_header.type_cu_offset_in_tu; + this_cu = &sig_type->per_cu; + } + this_cu->is_debug_types = (cu_header.unit_type == DW_UT_type); this_cu->sect_off = sect_off; - this_cu->length = length + initial_length_size; + this_cu->length = cu_header.length + cu_header.initial_length_size; this_cu->is_dwz = is_dwz; this_cu->objfile = objfile; this_cu->section = section; @@ -6852,12 +6874,13 @@ create_all_comp_units (struct objfile *objfile) n_allocated = 10; all_comp_units = XNEWVEC (struct dwarf2_per_cu_data *, n_allocated); - read_comp_units_from_section (objfile, &dwarf2_per_objfile->info, 0, + read_comp_units_from_section (objfile, &dwarf2_per_objfile->info, + &dwarf2_per_objfile->abbrev, 0, &n_allocated, &n_comp_units, &all_comp_units); dwz = dwarf2_get_dwz_file (); if (dwz != NULL) - read_comp_units_from_section (objfile, &dwz->info, 1, + read_comp_units_from_section (objfile, &dwz->info, &dwz->abbrev, 1, &n_allocated, &n_comp_units, &all_comp_units); -- 2.30.2