On January 22, 2021 3:49:41 PM GMT+01:00, Jakub Jelinek <ja...@redhat.com> 
wrote:
>Hi!
>
>When GCC is emitting .debug_line or .gnu.debuglto_.debug_line section
>by
>itself (happens either with too old or non-GNU assembler, with
>-gno-as-loc-support or with -flto) on empty translation units, it
>violates
>the DWARF 5 requirements.
>The standard says:
>"The first entry is the current directory of the compilation."
>and a few lines later:
>"The first entry in the sequence is the primary source file whose file
>name
>exactly matches that given in the DW_AT_name attribute in the
>compilation
>unit debugging information entry."
>GCC emits 4 zeros (directory entry format count, directories count,
>filename entry format count and filename count), which would be ok if
>the
>spec said The first entry may be rather than is.
>
>I had a brief look at whether I could just fall through into the rest
>of the
>function, but there are too many assumptions that there is at least one
>normal file that it can't be done that way easily.
>
>So this patch instead extends the early out code to emit the required
>minimum, which is 15 bytes more than we used to emit before.
>
>Ok for trunk if it passes bootstrap/regtest?

Ok. 

Richard. 

>2021-01-22  Jakub Jelinek  <ja...@redhat.com>
>
>       PR debug/98796
>       * dwarf2out.c (output_file_names): For -gdwarf-5, if there are no
>       filenames to emit, still emit the required 0 index directory and
>       filename entries that match DW_AT_comp_dir and DW_AT_name of the
>       compilation unit.
>
>--- gcc/dwarf2out.c.jj 2021-01-20 21:48:35.839157009 +0100
>+++ gcc/dwarf2out.c    2021-01-22 15:29:03.076210120 +0100
>@@ -12252,10 +12252,50 @@ output_file_names (void)
>     {
>       if (dwarf_version >= 5)
>       {
>-        dw2_asm_output_data (1, 0, "Directory entry format count");
>-        dw2_asm_output_data_uleb128 (0, "Directories count");
>-        dw2_asm_output_data (1, 0, "File name entry format count");
>-        dw2_asm_output_data_uleb128 (0, "File names count");
>+        const char *comp_dir = comp_dir_string ();
>+        if (comp_dir == NULL)
>+          comp_dir = "";
>+        dw2_asm_output_data (1, 1, "Directory entry format count");
>+        enum dwarf_form str_form = DW_FORM_string;
>+        if (DWARF5_USE_DEBUG_LINE_STR)
>+          str_form = DW_FORM_line_strp;
>+        dw2_asm_output_data_uleb128 (DW_LNCT_path, "DW_LNCT_path");
>+        dw2_asm_output_data_uleb128 (str_form, "%s",
>+                                     get_DW_FORM_name (str_form));
>+        dw2_asm_output_data_uleb128 (1, "Directories count");
>+        if (str_form == DW_FORM_string)
>+          dw2_asm_output_nstring (comp_dir, -1, "Directory Entry: %#x", 0);
>+        else
>+          output_line_string (str_form, comp_dir, "Directory Entry", 0);
>+        const char *filename0 = get_AT_string (comp_unit_die (),
>DW_AT_name);
>+        if (filename0 == NULL)
>+          filename0 = "";
>+#ifdef VMS_DEBUGGING_INFO
>+        dw2_asm_output_data (1, 4, "File name entry format count");
>+#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, "%s",
>+                                     get_DW_FORM_name (str_form));
>+        dw2_asm_output_data_uleb128 (DW_LNCT_directory_index,
>+                                     "DW_LNCT_directory_index");
>+        dw2_asm_output_data_uleb128 (DW_FORM_data1, "%s",
>+                                     get_DW_FORM_name (DW_FORM_data1));
>+#ifdef VMS_DEBUGGING_INFO
>+        dw2_asm_output_data_uleb128 (DW_LNCT_timestamp,
>"DW_LNCT_timestamp");
>+        dw2_asm_output_data_uleb128 (DW_FORM_udata, "DW_FORM_udata");
>+        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 (1, "File names count");
>+
>+        output_line_string (str_form, filename0, "File Entry", 0);
>+        dw2_asm_output_data (1, 0, NULL);
>+#ifdef VMS_DEBUGGING_INFO
>+        dw2_asm_output_data_uleb128 (0, NULL);
>+        dw2_asm_output_data_uleb128 (0, NULL);
>+#endif
>       }
>       else
>       {
>
>       Jakub

Reply via email to