From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id E8A253857C48 for ; Mon, 1 Nov 2021 17:56:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E8A253857C48 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 26285218B2 for ; Mon, 1 Nov 2021 17:56:12 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 08B5813A8C for ; Mon, 1 Nov 2021 17:56:12 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id REZwADwqgGFsagAAMHmgww (envelope-from ) for ; Mon, 01 Nov 2021 17:56:12 +0000 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH] [gdb/testsuite] Fix 64-bit dwarf test-cases with -m32 Date: Mon, 1 Nov 2021 18:56:11 +0100 Message-Id: <20211101175611.32103-1-tdevries@suse.de> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_NUMSUBJECT, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org 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: , X-List-Received-Date: Mon, 01 Nov 2021 17:56:15 -0000 When running test-case gdb.dwarf2/loc-sec-offset.exp with target board -m32, I run into: ... builtin_spawn -ignore SIGHUP gcc -fno-stack-protector -m32 \ -fdiagnostics-color=never -c -o loc-sec-offset-dw641.o \ loc-sec-offset-dw64.S^M as: loc-sec-offset-dw641.o: unsupported relocation type: 0x1^M loc-sec-offset-dw64.S: Assembler messages:^M loc-sec-offset-dw64.S:29: Error: cannot represent relocation type \ BFD_RELOC_64^M ... Looking at line 29, we have: ... .8byte .Labbrev1_begin /* Abbrevs */ ... It would be nice if the assembler could handle this somehow. But I guess it's not unreasonable that an assembler for a 32-bit architecture will object to handling 64-bit labels. Instead, work around this in the dwarf assembler by emitting: ... .4byte .Labbrev1_begin /* Abbrevs (lsw) */ .4byte 0 /* Abbrevs (msw) */ ... Tested on x86_64-linux with target board unix/-m32. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28383 --- gdb/testsuite/lib/dwarf.exp | 44 +++++++++++++++++++++++++++++-------- gdb/testsuite/lib/gdb.exp | 23 +++++++++++++++++++ 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp index b48cfad3b9e..044b7364beb 100644 --- a/gdb/testsuite/lib/dwarf.exp +++ b/gdb/testsuite/lib/dwarf.exp @@ -580,7 +580,7 @@ namespace eval Dwarf { DW_FORM_GNU_strp_alt - DW_FORM_sec_offset { variable _cu_offset_size - _op .${_cu_offset_size}byte $value + _op_offset $_cu_offset_size $value } DW_FORM_ref1 - @@ -645,7 +645,7 @@ namespace eval Dwarf { } } - _op .${_cu_offset_size}byte $_strings($value) "strp: $value" + _op_offset $_cu_offset_size $_strings($value) "strp: $value" } SPECIAL_expr { @@ -971,6 +971,28 @@ namespace eval Dwarf { _emit $text } + proc _op_offset { size offset {comment ""} } { + if { $size == 4 } { + _op .4byte $offset $comment + } elseif { $size == 8 } { + if {[is_64_target]} { + _op .8byte $offset $comment + } else { + # This allows us to emit 64-bit dwarf for + # 32-bit targets. + if { [target_endianness] == "little" } { + _op .4byte $offset "$comment (lsw)" + _op .4byte 0 "$comment (msw)" + } else { + _op .4byte 0 "$comment (msw)" + _op .4byte $offset "$comment (lsw)" + } + } + } else { + error "Don't know how to handle offset size $size" + } + } + proc _compute_label {name} { return ".L${name}" } @@ -1185,7 +1207,7 @@ namespace eval Dwarf { if { $dwarf_version == 2 } { _op .${addr_size}byte $argvec(label) } else { - _op .${offset_size}byte $argvec(label) + _op_offset $offset_size $argvec(label) } _op .sleb128 $argvec(offset) } @@ -1197,7 +1219,7 @@ namespace eval Dwarf { if { $dwarf_version == 2 } { _op .${addr_size}byte $argvec(label) } else { - _op .${offset_size}byte $argvec(label) + _op_offset $offset_size $argvec(label) } } @@ -1344,9 +1366,9 @@ namespace eval Dwarf { if { $_cu_version == 5 } { _op .byte 0x1 "DW_UT_compile" _op .byte $_cu_addr_size "Pointer size" - _op .${_cu_offset_size}byte $my_abbrevs Abbrevs + _op_offset $_cu_offset_size $my_abbrevs Abbrevs } else { - _op .${_cu_offset_size}byte $my_abbrevs Abbrevs + _op_offset $_cu_offset_size $my_abbrevs Abbrevs _op .byte $_cu_addr_size "Pointer size" } @@ -1440,7 +1462,7 @@ namespace eval Dwarf { } define_label $start_label _op .2byte $_cu_version Version - _op .${_cu_offset_size}byte $my_abbrevs Abbrevs + _op_offset $_cu_offset_size $my_abbrevs Abbrevs _op .byte $_cu_addr_size "Pointer size" _op .8byte $signature Signature if { $type_label != "" } { @@ -1666,7 +1688,9 @@ namespace eval Dwarf { if { ${with-offset-array} } { for {set list_idx 0} {$list_idx < $_debug_rnglists_list_count} {incr list_idx} { set list_label [_compute_list_label $list_idx] - _op .${_debug_rnglists_offset_size}byte "$list_label - $post_header_label" "offset of list $list_idx" + _op_offset $_debug_rnglists_offset_size \ + "$list_label - $post_header_label" \ + "offset of list $list_idx" } } @@ -1852,7 +1876,9 @@ namespace eval Dwarf { if { ${with-offset-array} } { for {set list_idx 0} {$list_idx < $_debug_loclists_list_count} {incr list_idx} { set list_label [_compute_list_label $list_idx] - _op .${_debug_loclists_offset_size}byte "$list_label - $post_header_label" "offset of list $list_idx" + _op_offset $_debug_loclists_offset_size \ + "$list_label - $post_header_label" \ + "offset of list $list_idx" } } diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 7f02504262d..1d57c692c2d 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -7078,6 +7078,29 @@ proc get_endianness { } { return "little" } +# Get the target's default endianness and return it. +gdb_caching_proc target_endianness { + global gdb_prompt + + set me "target_endianness" + + set src { int main() { return 0; } } + if {![gdb_simple_compile $me $src executable]} { + return 0 + } + + clean_restart $obj + if ![runto_main] { + return 0 + } + set res [get_endianness] + + gdb_exit + remote_file build delete $obj + + return $res +} + # ROOT and FULL are file names. Returns the relative path from ROOT # to FULL. Note that FULL must be in a subdirectory of ROOT. # For example, given ROOT = /usr/bin and FULL = /usr/bin/ls, this base-commit: 2047d95b897c7153368033c318185429f7809e4f -- 2.26.2