From patchwork Thu Jun 29 09:26:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kratochvil X-Patchwork-Id: 21327 Received: (qmail 115806 invoked by alias); 29 Jun 2017 09:26:34 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 115751 invoked by uid 89); 29 Jun 2017 09:26:33 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=(unknown), age X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 29 Jun 2017 09:26:32 +0000 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 988A7C04F4A4 for ; Thu, 29 Jun 2017 09:26:30 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 988A7C04F4A4 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=jan.kratochvil@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 988A7C04F4A4 Received: from host1.jankratochvil.net (ovpn-116-70.ams2.redhat.com [10.36.116.70]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BFB0C8941E for ; Thu, 29 Jun 2017 09:26:29 +0000 (UTC) Date: Thu, 29 Jun 2017 11:26:26 +0200 From: Jan Kratochvil To: gdb-patches@sourceware.org Subject: [patch+80] DWARF-5: Fix -fdebug-types-section Message-ID: <20170629092626.GA26755@host1.jankratochvil.net> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.8.0 (2017-02-23) Hi, GDB was now accessing as signatured_type memory allocated only by size of dwarf2_per_cu_data. This is unrelated to the DWARF-5 index. Jan 2017-06-29 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. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 2369d4b..c6414a7 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -1513,6 +1513,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 *, @@ -6250,8 +6255,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 @@ -6260,12 +6263,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 (); @@ -6720,6 +6728,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, @@ -6739,20 +6748,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; @@ -6785,12 +6807,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);