From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 89219 invoked by alias); 23 Apr 2019 12:19:39 -0000 Mailing-List: contact dwz-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Post: List-Help: List-Subscribe: Sender: dwz-owner@sourceware.org Received: (qmail 89209 invoked by uid 89); 23 Apr 2019 12:19:39 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.100.3 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.5 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_PASS autolearn=ham version=3.3.1 spammy= X-Spam-Status: No, score=-25.5 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_PASS autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on sourceware.org X-Spam-Level: X-HELO: mx1.suse.de X-Virus-Scanned: by amavisd-new at test-mx.suse.de Date: Tue, 01 Jan 2019 00:00:00 -0000 From: Tom de Vries To: dwz@sourceware.org, jakub@redhat.com Subject: [committed] Fix missing partial unit import Message-ID: <20190423121932.GA32310@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-SW-Source: 2019-q2/txt/msg00034.txt.bz2 Hi, In a hello generated on openSUSE Leap 15.0, long double is defined: ... $ gdb hello -ex "info types" -batch | egrep "long double|^File" \ | grep -B1 "long double" File elf-init.c: typedef long double; ... But if we self-dwz-m it, it's gone: ... $ cp hello.copy $ dwz -m hello.alt hello hello.copy $ gdb hello -ex "info types" -batch | egrep "long double|^File" \ | grep -B1 "long double" ... The long double type is part of a partial unit at 2b5, which is not imported by any DW_AT_import. This happens as follows: the partial unit at 2b5 in the multifile contains as first die: ... <1><2be>: Abbrev Number: 5 (DW_TAG_const_type) <2bf> DW_AT_type : <0x4c> ... which refers to: ... <1><4c>: Abbrev Number: 18 (DW_TAG_typedef) <4d> DW_AT_name : (indirect string, offset: 0x54c): size_t <51> DW_AT_decl_file : 1 <52> DW_AT_decl_line : 216 <53> DW_AT_type : <0x344> ... in another partial unit in the multifile. When matching dies in the input file against the dies in the multifile during finalize_multifile, we compare 2be to 394: ... <1><389>: Abbrev Number: 24 (DW_TAG_typedef) <38a> DW_AT_name : (indirect string, offset: 0x226): size_t <38e> DW_AT_decl_file : 2 <38f> DW_AT_decl_line : 216 <390> DW_AT_type : <0x14> <1><394>: Abbrev Number: 7 (DW_TAG_const_type) <395> DW_AT_type : <0x389> ... which then fails because of a mismatch in DW_FORM (DW_FORM_ref_addr vs DW_FORM_ref_udata). Subsequently, we hit this in create_import_tree: ... if (unlikely (fi_multifile) && rdie->die_nextdup == NULL) { pu->u1.cu_icu = NULL; continue; } ... and skip generating an import for the partial unit due to 2be not having a duplicate. Fix this by allowing DW_FORM mismatch in die_eq_1 during fi_multifile. Committed to trunk. Thanks, - Tom Fix missing partial unit import 2019-04-23 Tom de Vries PR dwz/24468 * dwz.c (die_eq_1): Compare references with unequal DW_FORM in fi_multifile mode. --- dwz.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dwz.c b/dwz.c index c67fa9d..db5ee10 100644 --- a/dwz.c +++ b/dwz.c @@ -3161,7 +3161,7 @@ die_eq_1 (dw_cu_ref cu1, dw_cu_ref cu2, switch (form1) { case DW_FORM_ref_addr: - if (likely (!op_multifile && !rd_multifile)) + if (likely (!op_multifile && !rd_multifile && !fi_multifile)) { if (form1 != form2) FAIL; @@ -3176,7 +3176,7 @@ die_eq_1 (dw_cu_ref cu1, dw_cu_ref cu2, switch (form2) { case DW_FORM_ref_addr: - if (likely (!op_multifile && !rd_multifile)) + if (likely (!op_multifile && !rd_multifile && !fi_multifile)) FAIL; break; case DW_FORM_ref_udata: