Hi,

On Thu, 20 Oct 2016 01:30:39 +0200, Jakub Jelinek wrote:
> This patch adds support for DWARF5 .debug_line{,_str} section format,
> though only if !DWARF2_ASM_LINE_DEBUG_INFO, because otherwise
> .debug_line is emitted by the assembler.

with current GCC trunk (with the GCC patch above) binutils readelf DWARF-5
patch being prepared outputs:

 The File name Table (offset 0x30):
  Entry Name    Dir
  0     (indirect line string, offset: 0x0): /home/jkratoch/t/classic.C 0
  1     (indirect line string, offset: 0x11): classic.C 1

Please see the tabs there.

After this GCC patch below readelf would output:

 The File name Table (offset 0x30):
  Entry Dir     Name
  0     0       (indirect line string, offset: 0x0): /home/jkratoch/t/classic.C
  1     1       (indirect line string, offset: 0x11): classic.C

That 'indirect line string' may get removed, that is irrelevant for this mail.

I could reorder that in readelf but I find it easier to do in GCC.
Also binutils has not switched to C++ yet so I have found the reordering not
trivial to do in readelf itself.

The readelf patch being prepared - not yet submitted:
        https://people.redhat.com/jkratoch/readelf-dwarf5.patch

OK for GCC trunk?

Sorry I have not regression tested it, I would handle that before a check-in.


Thanks,
Jan
gcc/
2016-11-24  Jan Kratochvil  <jan.kratoch...@redhat.com>

        * dwarf2out.c (output_file_names) Reorder DW_LNCT_directory_index and
        DW_LNCT_path.

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 1dfff38..ff4318c 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -11592,8 +11592,7 @@ output_file_names (void)
 #else
       dw2_asm_output_data (1, 2, "File name entry format count");
 #endif
-      dw2_asm_output_data_uleb128 (DW_LNCT_path, "DW_LNCT_path");
-      dw2_asm_output_data_uleb128 (str_form, get_DW_FORM_name (str_form));
+      /* Keep DW_LNCT_path last for better binutils readelf readability.  */
       dw2_asm_output_data_uleb128 (DW_LNCT_directory_index,
                                   "DW_LNCT_directory_index");
       dw2_asm_output_data_uleb128 (idx_form, get_DW_FORM_name (idx_form));
@@ -11603,9 +11602,10 @@ output_file_names (void)
       dw2_asm_output_data_uleb128 (DW_LNCT_size, "DW_LNCT_size");
       dw2_asm_output_data_uleb128 (DW_FORM_udata, "DW_FORM_udata");
 #endif
-      dw2_asm_output_data_uleb128 (numfiles + 1, "File names count");
+      dw2_asm_output_data_uleb128 (DW_LNCT_path, "DW_LNCT_path");
+      dw2_asm_output_data_uleb128 (str_form, get_DW_FORM_name (str_form));
 
-      output_line_string (str_form, filename0, "File Entry", 0);
+      dw2_asm_output_data_uleb128 (numfiles + 1, "File names count");
 
       /* Include directory index.  */
       if (dwarf_version >= 5 && idx_form != DW_FORM_udata)
@@ -11618,6 +11618,8 @@ output_file_names (void)
       dw2_asm_output_data_uleb128 (0, NULL);
       dw2_asm_output_data_uleb128 (0, NULL);
 #endif
+
+      output_line_string (str_form, filename0, "File Entry", 0);
     }
 
   /* Now write all the file names.  */
@@ -11644,7 +11646,8 @@ output_file_names (void)
       snprintf (filebuf, maxfilelen, "%s;%d",
                files[file_idx].path + dirs[dir_idx].length, ver);
 
-      output_line_string (str_form, filebuf, "File Entry", (unsigned) i + 1);
+      if (dwarf_version < 5)
+       output_line_string (str_form, filebuf, "File Entry", (unsigned) i + 1);
 
       /* Include directory index.  */
       if (dwarf_version >= 5 && idx_form != DW_FORM_udata)
@@ -11662,10 +11665,14 @@ output_file_names (void)
       dw2_asm_output_data_uleb128 ((vms_file_stats_name (files[file_idx].path,
                                                         0, &siz, 0, 0) == 0)
                                   ? siz : 0, NULL);
+
+      if (dwarf_version >= 5)
+       output_line_string (str_form, filebuf, "File Entry", (unsigned) i + 1);
 #else
-      output_line_string (str_form,
-                         files[file_idx].path + dirs[dir_idx].length,
-                         "File Entry", (unsigned) i + 1);
+      if (dwarf_version < 5)
+       output_line_string (str_form,
+                           files[file_idx].path + dirs[dir_idx].length,
+                           "File Entry", (unsigned) i + 1);
 
       /* Include directory index.  */
       if (dwarf_version >= 5 && idx_form != DW_FORM_udata)
@@ -11675,13 +11682,17 @@ output_file_names (void)
        dw2_asm_output_data_uleb128 (dir_idx + idx_offset, NULL);
 
       if (dwarf_version >= 5)
-       continue;
-
-      /* Modification time.  */
-      dw2_asm_output_data_uleb128 (0, NULL);
+       output_line_string (str_form,
+                           files[file_idx].path + dirs[dir_idx].length,
+                           "File Entry", (unsigned) i + 1);
+      else
+       {
+         /* Modification time.  */
+         dw2_asm_output_data_uleb128 (0, NULL);
 
-      /* File length in bytes.  */
-      dw2_asm_output_data_uleb128 (0, NULL);
+         /* File length in bytes.  */
+         dw2_asm_output_data_uleb128 (0, NULL);
+       }
 #endif /* VMS_DEBUGGING_INFO */
     }
 

Reply via email to