From patchwork Wed Jun 27 19:03:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keith Seitz X-Patchwork-Id: 28082 Received: (qmail 38833 invoked by alias); 27 Jun 2018 19:03:46 -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 38819 invoked by uid 89); 27 Jun 2018 19:03:46 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_STOCKGEN, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=complaint, thorough, xfree 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; Wed, 27 Jun 2018 19:03:44 +0000 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EA8504E918 for ; Wed, 27 Jun 2018 19:03:42 +0000 (UTC) Received: from theo.uglyboxes.com (ovpn04.gateway.prod.ext.phx2.redhat.com [10.5.9.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id AFAFE1001F3E for ; Wed, 27 Jun 2018 19:03:42 +0000 (UTC) From: Keith Seitz To: gdb-patches@sourceware.org Subject: [PATCH v2] Really fix gdb/23010: SYMBOL_LANGUAGE != DICT_LANGUAGE assertion Date: Wed, 27 Jun 2018 12:03:41 -0700 Message-Id: <20180627190341.24442-1-keiths@redhat.com> X-IsSubscribed: yes This patch is another attempt at really fixing the multitude of assertions being seen where symbols of one language are being added to symbol lists of another language. In short, this is happening because read_file_scope was reading DIEs without having its language set. As a result, the default language, language_minimal, was being passed to imported DIE trees and, in certain specific situations, causing the SYMBOL_LANGUAGE != DICT_LANGUAGE assertion being widely reported. For a more thorough explanation, see the following mailing list post: https://sourceware.org/ml/gdb-patches/2018-05/msg00703.html Since a test reproducer for this has been so elusive, this patch also adds a wrapper function around add_symbol_to_list which asserts when adding a symbol of one language to a list containing symbols of a different language. Differences from v1: - Removed complaint variation - Updated comments - Fixed typo gdb/ChangeLog: PR gdb/23010 * dwarf2read.c (dw2_add_symbol_to_list): New function. (fixup_go_packaging, new_symbol): Use dw2_add_symbol_to_list instead of add_symbol_to_list. (read_file_scope): Call prepare_one_comp_unit before reading any other DIEs. --- gdb/dwarf2read.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 4ad0527406..ba70315957 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -9701,6 +9701,24 @@ compute_delayed_physnames (struct dwarf2_cu *cu) cu->method_list.clear (); } +/* A wrapper for add_symbol_to_list to ensure that SYMBOL's language is + the same as all other symbols in LISTHEAD. If a new symbol is added + with a different language, this function asserts. */ + +static inline void +dw2_add_symbol_to_list (struct symbol *symbol, struct pending **listhead) +{ + /* Only assert if LISTHEAD already contains symbols of a different + language (dict_create_hashed/insert_symbol_hashed requires that all + symbols in this list are of the same language). */ + gdb_assert ((*listhead) == NULL + || (*listhead)->nsyms == 0 + || (SYMBOL_LANGUAGE ((*listhead)->symbol[0]) + == SYMBOL_LANGUAGE (symbol))); + + add_symbol_to_list (symbol, listhead); +} + /* Go objects should be embedded in a DW_TAG_module DIE, and it's not clear if/how imported objects will appear. To keep Go support simple until that's worked out, @@ -9772,7 +9790,7 @@ fixup_go_packaging (struct dwarf2_cu *cu) SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF; SYMBOL_TYPE (sym) = type; - add_symbol_to_list (sym, &global_symbols); + dw2_add_symbol_to_list (sym, &global_symbols); xfree (package_name); } @@ -11432,6 +11450,7 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu) struct die_info *child_die; CORE_ADDR baseaddr; + prepare_one_comp_unit (cu, die, cu->language); baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); get_scope_pc_bounds (die, &lowpc, &highpc, cu); @@ -11444,8 +11463,6 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu) file_and_directory fnd = find_file_and_directory (die, cu); - prepare_one_comp_unit (cu, die, cu->language); - /* The XLCL doesn't generate DW_LANG_OpenCL because this attribute is not standardised yet. As a workaround for the language detection we fall back to the DW_AT_producer string. */ @@ -21202,7 +21219,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, SYMBOL_TYPE (sym) = objfile_type (objfile)->builtin_core_addr; SYMBOL_DOMAIN (sym) = LABEL_DOMAIN; SYMBOL_ACLASS_INDEX (sym) = LOC_LABEL; - add_symbol_to_list (sym, cu->list_in_scope); + dw2_add_symbol_to_list (sym, cu->list_in_scope); break; case DW_TAG_subprogram: /* SYMBOL_BLOCK_VALUE (sym) will be filled in later by @@ -21460,7 +21477,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, case DW_TAG_common_block: SYMBOL_ACLASS_INDEX (sym) = LOC_COMMON_BLOCK; SYMBOL_DOMAIN (sym) = COMMON_BLOCK_DOMAIN; - add_symbol_to_list (sym, cu->list_in_scope); + dw2_add_symbol_to_list (sym, cu->list_in_scope); break; default: /* Not a tag we recognize. Hopefully we aren't processing @@ -21480,7 +21497,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, } if (list_to_add != NULL) - add_symbol_to_list (sym, list_to_add); + dw2_add_symbol_to_list (sym, list_to_add); /* For the benefit of old versions of GCC, check for anonymous namespaces based on the demangled name. */