From patchwork Sun Feb 12 20:23:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kratochvil X-Patchwork-Id: 19230 Received: (qmail 39839 invoked by alias); 12 Feb 2017 20:23:10 -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 39724 invoked by uid 89); 12 Feb 2017 20:23:08 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=NB, N.B, UD:N.B, gdb_stdlog 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; Sun, 12 Feb 2017 20:23:03 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C82A620264; Sun, 12 Feb 2017 20:23:03 +0000 (UTC) Received: from host1.jankratochvil.net (ovpn-116-221.ams2.redhat.com [10.36.116.221]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1CKN2Na006117; Sun, 12 Feb 2017 15:23:02 -0500 Subject: [PATCH 2/8] Code cleanup: Split create_debug_types_hash_table From: Jan Kratochvil To: gdb-patches@sourceware.org Cc: Victor Leschuk Date: Sun, 12 Feb 2017 21:23:01 +0100 Message-ID: <148693098109.9024.15851764429541979761.stgit@host1.jankratochvil.net> In-Reply-To: <148693097396.9024.2288256732840761882.stgit@host1.jankratochvil.net> References: <148693097396.9024.2288256732840761882.stgit@host1.jankratochvil.net> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-IsSubscribed: yes Hi, DWARF-5 moved .debug_types into .debug_info and so the types reading code needs to be reused more (in a future patch). Jan gdb/ChangeLog 2017-02-11 Jan Kratochvil * dwarf2read.c (create_debug_type_hash_table): New function from create_debug_types_hash_table. (create_debug_types_hash_table): Call create_debug_type_hash_table. (create_all_type_units, open_and_init_dwo_file): Update create_debug_types_hash_table callers. --- gdb/dwarf2read.c | 256 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 131 insertions(+), 125 deletions(-) diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index bf381a7..7c74718 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -4606,27 +4606,17 @@ add_signatured_type_cu_to_table (void **slot, void *datum) return 1; } -/* Create the hash table of all entries in the .debug_types - (or .debug_types.dwo) section(s). - If reading a DWO file, then DWO_FILE is a pointer to the DWO file object, - otherwise it is NULL. +/* A helper for create_debug_types_hash_table. Read types from SECTION + and fill them into TYPES_HTAB. */ - The result is a pointer to the hash table or NULL if there are no types. - - Note: This function processes DWO files only, not DWP files. */ - -static htab_t -create_debug_types_hash_table (struct dwo_file *dwo_file, - VEC (dwarf2_section_info_def) *types) +static void +create_debug_type_hash_table (struct dwo_file *dwo_file, + dwarf2_section_info *section, htab_t &types_htab) { struct objfile *objfile = dwarf2_per_objfile->objfile; - htab_t types_htab = NULL; - int ix; - struct dwarf2_section_info *section; struct dwarf2_section_info *abbrev_section; - - if (VEC_empty (dwarf2_section_info_def, types)) - return NULL; + bfd *abfd; + const gdb_byte *info_ptr, *end_ptr; abbrev_section = (dwo_file != NULL ? &dwo_file->sections.abbrev @@ -4637,136 +4627,152 @@ create_debug_types_hash_table (struct dwo_file *dwo_file, dwo_file ? ".dwo" : "", get_section_file_name (abbrev_section)); - for (ix = 0; - VEC_iterate (dwarf2_section_info_def, types, ix, section); - ++ix) - { - bfd *abfd; - const gdb_byte *info_ptr, *end_ptr; + dwarf2_read_section (objfile, section); + info_ptr = section->buffer; - dwarf2_read_section (objfile, section); - info_ptr = section->buffer; + if (info_ptr == NULL) + return; - if (info_ptr == NULL) - continue; + /* We can't set abfd until now because the section may be empty or + not present, in which case the bfd is unknown. */ + abfd = get_section_bfd_owner (section); - /* We can't set abfd until now because the section may be empty or - not present, in which case the bfd is unknown. */ - abfd = get_section_bfd_owner (section); + /* We don't use init_cutu_and_read_dies_simple, or some such, here + because we don't need to read any dies: the signature is in the + header. */ - /* We don't use init_cutu_and_read_dies_simple, or some such, here - because we don't need to read any dies: the signature is in the - header. */ + end_ptr = info_ptr + section->size; + while (info_ptr < end_ptr) + { + sect_offset offset; + cu_offset type_offset_in_tu; + ULONGEST signature; + struct signatured_type *sig_type; + struct dwo_unit *dwo_tu; + void **slot; + const gdb_byte *ptr = info_ptr; + struct comp_unit_head header; + unsigned int length; - end_ptr = info_ptr + section->size; - while (info_ptr < end_ptr) - { - sect_offset offset; - cu_offset type_offset_in_tu; - ULONGEST signature; - struct signatured_type *sig_type; - struct dwo_unit *dwo_tu; - void **slot; - const gdb_byte *ptr = info_ptr; - struct comp_unit_head header; - unsigned int length; + offset.sect_off = ptr - section->buffer; - offset.sect_off = ptr - section->buffer; + /* We need to read the type's signature in order to build the hash + table, but we don't need anything else just yet. */ - /* We need to read the type's signature in order to build the hash - table, but we don't need anything else just yet. */ + ptr = read_and_check_type_unit_head (&header, section, + abbrev_section, ptr, + &signature, &type_offset_in_tu); - ptr = read_and_check_type_unit_head (&header, section, - abbrev_section, ptr, - &signature, &type_offset_in_tu); + length = get_cu_length (&header); - length = get_cu_length (&header); + /* Skip dummy type units. */ + if (ptr >= info_ptr + length + || peek_abbrev_code (abfd, ptr) == 0) + { + info_ptr += length; + continue; + } - /* Skip dummy type units. */ - if (ptr >= info_ptr + length - || peek_abbrev_code (abfd, ptr) == 0) - { - info_ptr += length; - continue; - } + if (types_htab == NULL) + { + if (dwo_file) + types_htab = allocate_dwo_unit_table (objfile); + else + types_htab = allocate_signatured_type_table (objfile); + } - if (types_htab == NULL) - { - if (dwo_file) - types_htab = allocate_dwo_unit_table (objfile); - else - types_htab = allocate_signatured_type_table (objfile); - } + if (dwo_file) + { + sig_type = NULL; + dwo_tu = OBSTACK_ZALLOC (&objfile->objfile_obstack, + struct dwo_unit); + dwo_tu->dwo_file = dwo_file; + dwo_tu->signature = signature; + dwo_tu->type_offset_in_tu = type_offset_in_tu; + dwo_tu->section = section; + dwo_tu->offset = offset; + dwo_tu->length = length; + } + else + { + /* N.B.: type_offset is not usable if this type uses a DWO file. + The real type_offset is in the DWO file. */ + dwo_tu = NULL; + sig_type = OBSTACK_ZALLOC (&objfile->objfile_obstack, + struct signatured_type); + sig_type->signature = signature; + sig_type->type_offset_in_tu = type_offset_in_tu; + sig_type->per_cu.objfile = objfile; + sig_type->per_cu.is_debug_types = 1; + sig_type->per_cu.section = section; + sig_type->per_cu.offset = offset; + sig_type->per_cu.length = length; + } + + slot = htab_find_slot (types_htab, + dwo_file ? (void*) dwo_tu : (void *) sig_type, + INSERT); + gdb_assert (slot != NULL); + if (*slot != NULL) + { + sect_offset dup_offset; if (dwo_file) { - sig_type = NULL; - dwo_tu = OBSTACK_ZALLOC (&objfile->objfile_obstack, - struct dwo_unit); - dwo_tu->dwo_file = dwo_file; - dwo_tu->signature = signature; - dwo_tu->type_offset_in_tu = type_offset_in_tu; - dwo_tu->section = section; - dwo_tu->offset = offset; - dwo_tu->length = length; + const struct dwo_unit *dup_tu + = (const struct dwo_unit *) *slot; + + dup_offset = dup_tu->offset; } else { - /* N.B.: type_offset is not usable if this type uses a DWO file. - The real type_offset is in the DWO file. */ - dwo_tu = NULL; - sig_type = OBSTACK_ZALLOC (&objfile->objfile_obstack, - struct signatured_type); - sig_type->signature = signature; - sig_type->type_offset_in_tu = type_offset_in_tu; - sig_type->per_cu.objfile = objfile; - sig_type->per_cu.is_debug_types = 1; - sig_type->per_cu.section = section; - sig_type->per_cu.offset = offset; - sig_type->per_cu.length = length; + const struct signatured_type *dup_tu + = (const struct signatured_type *) *slot; + + dup_offset = dup_tu->per_cu.offset; } - slot = htab_find_slot (types_htab, - dwo_file ? (void*) dwo_tu : (void *) sig_type, - INSERT); - gdb_assert (slot != NULL); - if (*slot != NULL) - { - sect_offset dup_offset; + complaint (&symfile_complaints, + _("debug type entry at offset 0x%x is duplicate to" + " the entry at offset 0x%x, signature %s"), + offset.sect_off, dup_offset.sect_off, + hex_string (signature)); + } + *slot = dwo_file ? (void *) dwo_tu : (void *) sig_type; - if (dwo_file) - { - const struct dwo_unit *dup_tu - = (const struct dwo_unit *) *slot; + if (dwarf_read_debug > 1) + fprintf_unfiltered (gdb_stdlog, " offset 0x%x, signature %s\n", + offset.sect_off, + hex_string (signature)); - dup_offset = dup_tu->offset; - } - else - { - const struct signatured_type *dup_tu - = (const struct signatured_type *) *slot; + info_ptr += length; + } +} - dup_offset = dup_tu->per_cu.offset; - } +/* Create the hash table of all entries in the .debug_types + (or .debug_types.dwo) section(s). + If reading a DWO file, then DWO_FILE is a pointer to the DWO file object, + otherwise it is NULL. - complaint (&symfile_complaints, - _("debug type entry at offset 0x%x is duplicate to" - " the entry at offset 0x%x, signature %s"), - offset.sect_off, dup_offset.sect_off, - hex_string (signature)); - } - *slot = dwo_file ? (void *) dwo_tu : (void *) sig_type; + The result is a pointer to the hash table or NULL if there are no types. - if (dwarf_read_debug > 1) - fprintf_unfiltered (gdb_stdlog, " offset 0x%x, signature %s\n", - offset.sect_off, - hex_string (signature)); + Note: This function processes DWO files only, not DWP files. */ - info_ptr += length; - } - } +static void +create_debug_types_hash_table (struct dwo_file *dwo_file, + VEC (dwarf2_section_info_def) *types, + htab_t &types_htab) +{ + int ix; + struct dwarf2_section_info *section; + + if (VEC_empty (dwarf2_section_info_def, types)) + return; - return types_htab; + for (ix = 0; + VEC_iterate (dwarf2_section_info_def, types, ix, section); + ++ix) + create_debug_type_hash_table (dwo_file, section, types_htab); } /* Create the hash table of all entries in the .debug_types section, @@ -4777,10 +4783,10 @@ create_debug_types_hash_table (struct dwo_file *dwo_file, static int create_all_type_units (struct objfile *objfile) { - htab_t types_htab; + htab_t types_htab = NULL; struct signatured_type **iter; - types_htab = create_debug_types_hash_table (NULL, dwarf2_per_objfile->types); + create_debug_types_hash_table (NULL, dwarf2_per_objfile->types, types_htab); if (types_htab == NULL) { dwarf2_per_objfile->signatured_types = NULL; @@ -10616,8 +10622,8 @@ open_and_init_dwo_file (struct dwarf2_per_cu_data *per_cu, dwo_file->cu = create_dwo_cu (dwo_file); - dwo_file->tus = create_debug_types_hash_table (dwo_file, - dwo_file->sections.types); + create_debug_types_hash_table (dwo_file, dwo_file->sections.types, + dwo_file->tus); discard_cleanups (cleanups);