public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] [gdb/testsuite] Fix handling of DW_FORM_ref_addr in dwarf assembler
@ 2019-05-07  8:38 Tom de Vries
  0 siblings, 0 replies; only message in thread
From: Tom de Vries @ 2019-05-07  8:38 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=456ba0fa36d17648a6cf32d1561c8c5802103153

commit 456ba0fa36d17648a6cf32d1561c8c5802103153
Author: Tom de Vries <tdevries@suse.de>
Date:   Tue May 7 10:38:36 2019 +0200

    [gdb/testsuite] Fix handling of DW_FORM_ref_addr in dwarf assembler
    
    When running gdb.dwarf2/multidictionary.exp with target board cc-with-dwz and
    current dwz, we run into a dwz abort:
    ...
    gdb compile failed, gdb/contrib/cc-with-tweaks.sh: line 188: 11484 Aborted \
      (core dumped) $DWZ "$output_file" > /dev/null 2>&1
    UNTESTED: gdb.dwarf2/multidictionary.exp: multidictionary.exp
    ...
    The dwz abort (PR dwz/24169) is caused by an invalid DW_FORM_ref_addr in the
    multidictionary binary.
    
    The multidictionary binary is build from multidictionary.S which is generated
    using the dwarf assembler, and multidictionary.S contains dwarf for 3
    compilation units.
    
    In multidictionary0.o (generated from multidictionary.S), we find a concrete
    formal parameter DIE:
    ...
     <2><dc>: Abbrev Number: 4 (DW_TAG_formal_parameter)
        <dd>   DW_AT_abstract_origin: <0xa6>
    ...
    referring to an abstract formal parameter DIE at 0xa6:
    ...
     <2><a6>: Abbrev Number: 8 (DW_TAG_formal_parameter)
        <a7>   DW_AT_name        : msg
        <ab>   DW_AT_type        : <0x92>
    ...
    but in the multidictionary binary the concrete formal parameter DIE is still
    referring to 0xa6:
    ...
     <2><1a3>: Abbrev Number: 4 (DW_TAG_formal_parameter)
        <1a4>   DW_AT_abstract_origin: <0xa6>
    ...
    while the abstract formal parameter DIE has moved to 0x16d:
    ...
     <2><16d>: Abbrev Number: 8 (DW_TAG_formal_parameter)
        <16e>   DW_AT_name        : msg
        <172>   DW_AT_type        : <0x159>
    ...
    
    The concrete formal parameter DIE is specified in multidictionary.S like this:
    ...
    .Llabel21:
            .uleb128        4
            .4byte        .Llabel17 - .Lcu1_begin
    ...
    
    The problem is that the .Lcu1_begin label is assumed to mark the start of the
    .debug_info section in the executable, but in fact it marks the start of the
    first compilation unit from multidictionary.S in the executable.  Usually
    these two entities are the same, but they are not when linked in object files
    contain dwarf info and are placed in the .debug_info section before the
    compilation units generated from multidictionary.S.
    
    Fix this in the dwarf assembler by generating instead the label itself:
    ...
    .Llabel21:
            .uleb128        4
            .4byte        .Llabel17
    ...
    resulting in a relocation in the object file:
    ...
      Offset          Info           Type           Sym. Value    Sym. Name + Addend
    0000000000dd  00040000000a R_X86_64_32       0000000000000000 .debug_info + a6
    ...
    and resulting in the correct offset in the executable:
    ...
     <2><1a3>: Abbrev Number: 4 (DW_TAG_formal_parameter)
        <1a4>   DW_AT_abstract_origin: <0x16d>
    ...
    
    Tested on x86_64-linux with native and cc-with-dwz.
    
    gdb/testsuite/ChangeLog:
    
    2019-05-07  Tom de Vries  <tdevries@suse.de>
    
    	PR testsuite/24159
    	* lib/dwarf.exp: Fix handling of DW_FORM_ref_addr.

Diff:
---
 gdb/testsuite/ChangeLog     | 5 +++++
 gdb/testsuite/lib/dwarf.exp | 6 ++----
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index c32d013..e2b5075 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-05-07  Tom de Vries  <tdevries@suse.de>
+
+	PR testsuite/24159
+	* lib/dwarf.exp: Fix handling of DW_FORM_ref_addr.
+
 2019-05-06  Tom de Vries  <tdevries@suse.de>
 
 	* lib/gdb.exp (exec_has_index_section): New proc.
diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp
index 3cc5928..75d19ab 100644
--- a/gdb/testsuite/lib/dwarf.exp
+++ b/gdb/testsuite/lib/dwarf.exp
@@ -567,10 +567,8 @@ namespace eval Dwarf {
 	    }
 
 	    % {
-		# Label reference, an offset from .debug_info.  Assuming
-		# .Lcu1_begin is on .debug_info.
-		set cu1_label [_compute_label "cu1_begin"]
-		set new_value "[string range $value 1 end] - $cu1_label"
+		# Label reference, an offset from .debug_info.
+		set new_value "[string range $value 1 end]"
 
 		return DW_FORM_ref_addr
 	    }


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-05-07  8:38 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-07  8:38 [binutils-gdb] [gdb/testsuite] Fix handling of DW_FORM_ref_addr in dwarf assembler Tom de Vries

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).