[binutils-gdb] gas: Make sure .debug_line file table contains a zero filename and dir

Mark Wielaard mark@sourceware.org
Tue Aug 4 09:41:28 GMT 2020


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

commit f63d03dde00449e71e32fea3496edc69d2e7d386
Author: Mark Wielaard <mark@klomp.org>
Date:   Mon Aug 3 02:23:44 2020 +0200

    gas: Make sure .debug_line file table contains a zero filename and dir
    
    For DWARF5 the zero file list entry in the .debug_line table represents
    the compile unit main file. It can be set with .file 0 when -gdwarf-5
    is given. But since this directive is illegal for older versions, this
    is almost never set. To make sure it is always set (so DW_AT_name of
    the compile unit can be set) use file (and dir) 1 if that is defined
    (otherwise fall back to pwd, to match DW_AT_comp_dir).
    
    gas/ChangeLog:
    
            * gas/dwarf2dbg.c (out_dir_and_file_list): For DWARF5 emit at
            least one directory if there is at least one file. Use dirs[1]
            if dirs[0] is not set, or if there is no dirs[1] the current
            working directory. Use files[1] filename, when files[0] filename
            isn't set.

Diff:
---
 gas/ChangeLog   |  8 ++++++++
 gas/dwarf2dbg.c | 35 ++++++++++++++++++++++++++---------
 2 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 14be27927ac..8895c0c0c7f 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,11 @@
+2020-08-02  Mark Wielaard  <mark@klomp.org>
+
+	* gas/dwarf2dbg.c (out_dir_and_file_list): For DWARF5 emit at
+	least one directory if there is at least one file. Use dirs[1]
+	if dirs[0] is not set, or if there is no dirs[1] the current
+	working directory. Use files[1] filename, when files[0] filename
+	isn't set.
+
 2020-08-02  Mark Wielaard  <mark@klomp.org>
 
 	* dwarf2dbg.c (out_debug_info): Emit unit type and abbrev offset
diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c
index b19e057c762..7877c563887 100644
--- a/gas/dwarf2dbg.c
+++ b/gas/dwarf2dbg.c
@@ -1992,18 +1992,29 @@ out_dir_and_file_list (void)
 	 the .debug_line_str section and reference them here.  */
       out_uleb128 (DW_FORM_string);
 
-      /* Now state how many rows there are in the table.  */
-      out_uleb128 (dirs_in_use);
+      /* Now state how many rows there are in the table.  We need at
+	 least 1 if there is one or more file names to store the
+	 "working directory".  */
+      if (dirs_in_use == 0 && files_in_use > 0)
+	out_uleb128 (1);
+      else
+	out_uleb128 (dirs_in_use);
     }
       
   /* Emit directory list.  */
-  if (DWARF2_LINE_VERSION >= 5 && dirs_in_use > 0)
+  if (DWARF2_LINE_VERSION >= 5 && (dirs_in_use > 0 || files_in_use > 0))
     {
-      if (dirs == NULL || dirs[0] == NULL)
-	dir = remap_debug_filename (".");
-      else
+      /* DWARF5 uses slot zero, but that is only set explicitly
+	 using a .file 0 directive.  If that isn't used, but dir
+	 one is used, then use that as main file directory.
+	 Otherwise use pwd as main file directory.  */
+      if (dirs_in_use > 0 && dirs != NULL && dirs[0] != NULL)
 	dir = remap_debug_filename (dirs[0]);
-	
+      else if (dirs_in_use > 1 && dirs != NULL && dirs[1] != NULL)
+	dir = remap_debug_filename (dirs[1]);
+      else
+	dir = remap_debug_filename (getpwd ());
+
       size = strlen (dir) + 1;
       cp = frag_more (size);
       memcpy (cp, dir, size);
@@ -2089,8 +2100,14 @@ out_dir_and_file_list (void)
 
       if (files[i].filename == NULL)
 	{
-	  /* Prevent a crash later, particularly for file 1.  */
-	  files[i].filename = "";
+	  /* Prevent a crash later, particularly for file 1.  DWARF5
+	     uses slot zero, but that is only set explicitly using a
+	     .file 0 directive.  If that isn't used, but file 1 is,
+	     then use that as main file name.  */
+	  if (DWARF2_LINE_VERSION >= 5 && i == 0 && files_in_use >= 1)
+	      files[0].filename = files[1].filename;
+	  else
+	    files[i].filename = "";
 	  if (DWARF2_LINE_VERSION < 5 || i != 0)
 	    {
 	      as_bad (_("unassigned file number %ld"), (long) i);


More information about the Binutils-cvs mailing list