From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id 7B0993854816 for ; Thu, 25 Feb 2021 14:46:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 7B0993854816 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tdevries@suse.de X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 8FEC7AF6F; Thu, 25 Feb 2021 14:46:03 +0000 (UTC) Date: Thu, 25 Feb 2021 15:46:01 +0100 From: Tom de Vries To: dwz@sourceware.org, jakub@redhat.com, mark@klomp.org Subject: [PATCH] Fix reference of PU to CU for odr Message-ID: <20210225144600.GA4304@delia> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: dwz@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Dwz mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Feb 2021 14:46:05 -0000 Hi, When compiling dwz with the assert listed in the commit message for "Call reorder_dups ASAP", and using test-case cc1.dwz-processed like so, we run into: ... $ dwz cc1.dwz-processed -o 1 -lnone --odr dwz: dwz.c:12567: write_die: Assertion \ `IMPLIES (cu->cu_kind == CU_PU, die_cu (refd)->cu_kind == CU_PU)' failed. Aborted (core dumped) ... The assert is related to this duplicate chain: ... 28dd83f O b500801d 621b6872 pointer_type \ (type: 28dd72f die_struct structure_type) 2903769 O b500801d 621b6872 pointer_type \ (type: 28dd72f die_struct structure_type) ... which contains two DIEs that are both in the same CU: ... <0><28d281f>: Abbrev Number: 200 (DW_TAG_compile_unit) ... <1><28dd72f>: Abbrev Number: 35 (DW_TAG_structure_type) <28dd730> DW_AT_name : (indirect string, offset: 0x1b2ca6): die_struct <28dd734> DW_AT_byte_size : 80 <28dd735> DW_AT_decl_file : 87 <28dd736> DW_AT_decl_line : 3069 <28dd738> DW_AT_decl_column : 63 <28dd739> DW_AT_sibling : <0x28dd83b> <1><28dd83f>: Abbrev Number: 9 (DW_TAG_pointer_type) <28dd840> DW_AT_byte_size : 8 <28dd841> DW_AT_type : <0x28dd72f> ... <1><2903769>: Abbrev Number: 9 (DW_TAG_pointer_type) <290376a> DW_AT_byte_size : 8 <290376b> DW_AT_type : <0x28dd72f> ... <0><2911617>: Abbrev Number: 177 (DW_TAG_compile_unit) ... The dup chain is forced to a partial unit, but the die_struct DIE is not, because it's not part of a duplicate chain, and it's not marked as a singleton. Fix this by marking the die_struct DIE as singleton. Any comments? Thanks, - Tom Fix reference of PU to CU for odr 2021-02-25 Tom de Vries PR dwz/27464 * dwz.c (partition_dups): Call mark_singletons if cnt_ref_cus (die) == 1. --- dwz.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dwz.c b/dwz.c index 9172011..89cf8d1 100644 --- a/dwz.c +++ b/dwz.c @@ -8417,6 +8417,9 @@ partition_dups (void) if (s) mark_singletons (die_cu (s), s, s, &ob2); } + else if (cnt_ref_cus (die) == 1) + mark_singletons (die_cu (die), die, die, &ob2); + arr = (dw_die_ref *) obstack_base (&ob2); }