From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id cENhO+IqpF8EdwAAWB0awg (envelope-from ) for ; Thu, 05 Nov 2020 11:40:02 -0500 Received: by simark.ca (Postfix, from userid 112) id EEE5B1F08B; Thu, 5 Nov 2020 11:40:02 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=MAILING_LIST_MULTI, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id E9A811E552 for ; Thu, 5 Nov 2020 11:40:01 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id AE033386F478; Thu, 5 Nov 2020 16:40:01 +0000 (GMT) Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id 23BE73861878 for ; Thu, 5 Nov 2020 16:39:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 23BE73861878 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 3892FAFC8 for ; Thu, 5 Nov 2020 16:39:54 +0000 (UTC) Date: Thu, 5 Nov 2020 17:39:52 +0100 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH][gdb/testsuite] Make fission use shared_abbrev in dwarf assembler Message-ID: <20201105163951.GA26325@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-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" Hi, When using dwarf assembly to generate multiple fission CUs, each CU gets its own abbreviation table, starting at a generated label. That doesn't work however, the labels are silently ignored and instead constant 0 is used. For more details, see PRs: - gcc PR97713 - "[gsplit-dwarf] label generated for .debug_abbrev.dwo offset, corresponding relocation ignored by objcopy --extract-dwo" https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97713 - binutils PR26841 - "objcopy --extract-dwo silently drops relocation" https://sourceware.org/bugzilla/show_bug.cgi?id=26841 Fix this by forcing shared_abbrev for fission CUs in the dwarf assembler. Any comments? Thanks, - Tom [gdb/testsuite] Make fission use shared_abbrev in dwarf assembler gdb/testsuite/ChangeLog: 2020-11-05 Tom de Vries * lib/dwarf.exp (cu): Add first/last values to fission option. Make fission imply share_abbrev. --- gdb/testsuite/lib/dwarf.exp | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp index 40d0648826..7bb745c71d 100644 --- a/gdb/testsuite/lib/dwarf.exp +++ b/gdb/testsuite/lib/dwarf.exp @@ -1041,7 +1041,10 @@ namespace eval Dwarf { # default = 4 # addr_size n - the size of addresses in bytes: 4, 8, or default # default = default - # fission 0|1 - boolean indicating if generating Fission debug info + # fission 0|first|1|last + # - non-zero indicating generation of Fission debug info. + # The first and last CU in the series are marked + # using first and last. # default = 0 # share_abbrev 0|first|1|last # - non-zero indicating that a series of CUs shares the same @@ -1065,6 +1068,7 @@ namespace eval Dwarf { set _cu_version 4 set _cu_addr_size default set fission 0 + set fission_mode 0 set share_abbrev 0 set section ".debug_info" set _abbrev_section ".debug_abbrev" @@ -1075,7 +1079,12 @@ namespace eval Dwarf { is_64 { set is_64 $value } version { set _cu_version $value } addr_size { set _cu_addr_size $value } - fission { set fission $value } + fission { + if { ![string eq $value 0] } { + set fission 1 + set fission_mode $value + } + } share_abbrev { set share_abbrev $value } default { error "unknown option $name" } } @@ -1097,6 +1106,17 @@ namespace eval Dwarf { set cu_num [incr _cu_count] + # Any _abbrev_label in a .dwo file resolves to an abbrev offset of '0' + # (See binutils PR26841 - "objcopy --extract-dwo silently drops + # relocation"). So, we need to either: + # - count the abbrev table size for each CU and emit a constant abbrev + # offset, or + # - have all the fission CUs share the same abbrev table + # We do the latter here. + if { $fission } { + set share_abbrev $fission_mode + } + set init_abbrev \ [expr [string equal $share_abbrev 0] \ || [string equal $share_abbrev first]] @@ -1104,8 +1124,16 @@ namespace eval Dwarf { [expr [string equal $share_abbrev 0] \ || [string equal $share_abbrev last]] + if { $init_abbrev } { - set _abbrev_label [_compute_label "abbrev${cu_num}_begin"] + if { $fission } { + # Labels in dwo files currently don't work (see binutils + # PR26841), and resolve to a 0 offset. To make that clear, + # use a hardcoded 0 instead of a label. + set _abbrev_label 0 + } else { + set _abbrev_label [_compute_label "abbrev${cu_num}_begin"] + } set _abbrev_num 1 } @@ -1125,7 +1153,7 @@ namespace eval Dwarf { _op .${_cu_offset_size}byte $_abbrev_label Abbrevs _op .byte $_cu_addr_size "Pointer size" - if { $init_abbrev } { + if { $init_abbrev && $_abbrev_label != 0 } { _defer_output $_abbrev_section { define_label $_abbrev_label }