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  <jan.kratochvil@redhat.com>

	* 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.
This commit is contained in:
Jan Kratochvil
2017-08-24 10:26:52 +02:00
parent 7408194835
commit f1902523c9
2 changed files with 48 additions and 17 deletions

View File

@ -1,3 +1,11 @@
2017-08-24 Jan Kratochvil <jan.kratochvil@redhat.com>
* 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 <palves@redhat.com> 2017-08-23 Pedro Alves <palves@redhat.com>
PR remote/21852 PR remote/21852

View File

@ -1542,6 +1542,11 @@ static void dwarf2_find_base_address (struct die_info *die,
static struct partial_symtab *create_partial_symtab static struct partial_symtab *create_partial_symtab
(struct dwarf2_per_cu_data *per_cu, const char *name); (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 dwarf2_build_psymtabs_hard (struct objfile *);
static void scan_partial_symbols (struct partial_die_info *, 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, int want_partial_unit,
enum language pretend_language) enum language pretend_language)
{ {
struct process_psymtab_comp_unit_data info;
/* If this compilation unit was already read in, free the /* If this compilation unit was already read in, free the
cached copy in order to read it in again. This is cached copy in order to read it in again. This is
necessary because we skipped some symbols when we first 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) if (this_cu->cu != NULL)
free_one_cached_comp_unit (this_cu); free_one_cached_comp_unit (this_cu);
gdb_assert (! this_cu->is_debug_types); 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.want_partial_unit = want_partial_unit;
info.pretend_language = pretend_language; info.pretend_language = pretend_language;
init_cutu_and_read_dies (this_cu, NULL, 0, 0, init_cutu_and_read_dies (this_cu, NULL, 0, 0,
process_psymtab_comp_unit_reader, process_psymtab_comp_unit_reader, &info);
&info); }
/* Age out any secondary CUs. */ /* Age out any secondary CUs. */
age_cached_comp_units (); age_cached_comp_units ();
@ -6787,6 +6795,7 @@ load_partial_comp_unit (struct dwarf2_per_cu_data *this_cu)
static void static void
read_comp_units_from_section (struct objfile *objfile, read_comp_units_from_section (struct objfile *objfile,
struct dwarf2_section_info *section, struct dwarf2_section_info *section,
struct dwarf2_section_info *abbrev_section,
unsigned int is_dwz, unsigned int is_dwz,
int *n_allocated, int *n_allocated,
int *n_comp_units, int *n_comp_units,
@ -6806,20 +6815,33 @@ read_comp_units_from_section (struct objfile *objfile,
while (info_ptr < section->buffer + section->size) while (info_ptr < section->buffer + section->size)
{ {
unsigned int length, initial_length_size;
struct dwarf2_per_cu_data *this_cu; struct dwarf2_per_cu_data *this_cu;
sect_offset sect_off = (sect_offset) (info_ptr - section->buffer); sect_offset sect_off = (sect_offset) (info_ptr - section->buffer);
/* Read just enough information to find out where the next comp_unit_head cu_header;
compilation unit is. */ read_and_check_comp_unit_head (&cu_header, section, abbrev_section,
length = read_initial_length (abfd, info_ptr, &initial_length_size); info_ptr, rcuh_kind::COMPILE);
/* Save the compilation unit for later lookup. */ /* Save the compilation unit for later lookup. */
this_cu = XOBNEW (&objfile->objfile_obstack, struct dwarf2_per_cu_data); 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)); 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->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->is_dwz = is_dwz;
this_cu->objfile = objfile; this_cu->objfile = objfile;
this_cu->section = section; this_cu->section = section;
@ -6852,12 +6874,13 @@ create_all_comp_units (struct objfile *objfile)
n_allocated = 10; n_allocated = 10;
all_comp_units = XNEWVEC (struct dwarf2_per_cu_data *, n_allocated); 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); &n_allocated, &n_comp_units, &all_comp_units);
dwz = dwarf2_get_dwz_file (); dwz = dwarf2_get_dwz_file ();
if (dwz != NULL) 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, &n_allocated, &n_comp_units,
&all_comp_units); &all_comp_units);