gdb/testsuite/dwarf: don't automatically add directory and file entry for DWARF 5
authorSimon Marchi <simon.marchi@efficios.com>
Thu, 7 Apr 2022 01:51:56 +0000 (21:51 -0400)
committerSimon Marchi <simon.marchi@polymtl.ca>
Mon, 18 Apr 2022 20:57:36 +0000 (16:57 -0400)
To support DWARF 5 in the DWARF assembler line tables, we currently copy
the first user-provided directory and the first user-provided files and
make them elements at indices 0 in the directory and file name tables.
That was a sufficient behavior at the time (see commit 44fda089397a
("[gdb/testsuite] Support .debug_line v5 in dwarf assembler")), but in
the following patches, I would need to have finer grained control on
what is generated exactly.  For example, I'd like to generate a DWARF 5 line
table with just a single file and a single directory.

Get rid of this behavior, and implement what is suggested in
44fda089397a: make include_dir return the directory index that can be
used to refer to that directory entry (based on the DWARF version), and
use it afterwards.

Adjust dw2-lines.exp and dw2-prologue-end.exp accordingly.  Their produced
DWARF5 binaries will change a bit, in that they will now have a single
directory and file, where they had two before.  But it doesn't change
the expected GDB behavior.

Change-Id: I5459b16ac9b7f28c34c9693c35c9afd2ebb3aa3b

gdb/testsuite/gdb.dwarf2/dw2-lines.exp
gdb/testsuite/gdb.dwarf2/dw2-prologue-end.exp
gdb/testsuite/lib/dwarf.exp

index 3cbbd28fd48832dc8ae85e5d204e4a2e9e631548..b24eec0c8d2c0a27608b36ce97ac31e426896484 100644 (file)
@@ -79,10 +79,15 @@ proc test_1 { _cv _cdw64 _lv _ldw64 {_string_form ""}} {
        }
 
        lines [list version $lv is_64 $ldw64 string_form $string_form] Llines {
-           include_dir "${srcdir}/${subdir}"
-           file_name "$srcfile" 1
+           set diridx [include_dir "${srcdir}/${subdir}"]
+           file_name "$srcfile" $diridx
 
            program {
+               # If using DWARF 5, we want to refer to file 0, but the LNP
+               # state machine is still initialized with file 1.  So we need
+               # to set the current file explicitly.
+               DW_LNS_set_file $diridx
+
                DW_LNE_set_address bar_label
                line [line_for bar_label]
                DW_LNS_copy
index 7fd1bd781328106a1f3b4bf6b599afec1d9fc254..9ce97fc1f2652b65864537ef38fa7d693fbf8214 100644 (file)
@@ -48,10 +48,11 @@ Dwarf::assemble $asm_file {
     }
 
     lines {version 5} lines_label {
-       include_dir "${srcdir}/${subdir}"
-       file_name "$srcfile" 1
+       set diridx [include_dir "${srcdir}/${subdir}"]
+       file_name "$srcfile" $diridx
 
        program {
+           DW_LNS_set_file $diridx
            DW_LNE_set_address $main_start
            line [gdb_get_line_number "main prologue"]
            DW_LNS_copy
index 9c92115fd0034d1731bc91ee10111a4be0e7b603..55e97c33a6e1dd4ce039e990eb88d925a94442df 100644 (file)
@@ -2277,14 +2277,32 @@ namespace eval Dwarf {
        _op .byte 1 "standard opcode 9"
        _op .byte 0 "standard opcode 10"
 
+       # Add a directory entry to the line table header's directory table.
+       #
+       # Return the index by which this entry can be referred to.
        proc include_dir {dirname} {
            variable _line_include_dirs
            lappend _line_include_dirs $dirname
+
+           if { $Dwarf::_line_unit_version >= 5 } {
+               return [expr [llength $_line_include_dirs] - 1]
+           } else {
+               return [llength $_line_include_dirs]
+           }
        }
 
+       # Add a file name entry to the line table header's file names table.
+       #
+       # Return the index by which this entry can be referred to.
        proc file_name {filename diridx} {
            variable _line_file_names
            lappend _line_file_names $filename $diridx
+
+           if { $Dwarf::_line_unit_version >= 5 } {
+               return [expr [llength $_line_file_names] - 1]
+           } else {
+               return [llength $_line_file_names]
+           }
        }
 
        proc _line_finalize_header {} {
@@ -2316,15 +2334,8 @@ namespace eval Dwarf {
                }
 
                set nr_dirs [llength $_line_include_dirs]
-               # For entry 0.
-               set nr_dirs [expr $nr_dirs + 1]
                _op .byte $nr_dirs "directory_count"
 
-               # Entry 0.
-               set dirname [lindex $_line_include_dirs 0]
-               set _line_include_dirs \
-                   [concat [list $dirname] $_line_include_dirs]
-
                foreach dirname $_line_include_dirs {
                    switch $_line_string_form {
                        string {
@@ -2360,16 +2371,8 @@ namespace eval Dwarf {
                    "file_name_entry_format (form: DW_FORM_udata)"
 
                set nr_files [expr [llength $_line_file_names] / 2]
-               # For entry 0.
-               set nr_files [expr $nr_files + 1]
                _op .byte $nr_files "file_names_count"
 
-               # Entry 0.
-               set filename [lindex $_line_file_names 0]
-               set diridx [lindex $_line_file_names 1]
-               set _line_file_names \
-                   [concat [list $filename $diridx] $_line_file_names]
-
                foreach { filename diridx } $_line_file_names {
                    switch $_line_string_form {
                        string {