Fix PR85339, bogus early debug

Message ID alpine.LSU.2.20.1804111306580.18265@zhemvz.fhfr.qr
State New
Headers show
Series
  • Fix PR85339, bogus early debug
Related show

Commit Message

Richard Biener April 11, 2018, 11:09 a.m.
The following fixes the missing .debug_line in the early LTO debug
DWARF which makes all DW_AT_decl_file invalid.

LTO bootstrapped on x86_64-unknown-linux-gnu, LTO bootstrap with -g3
still running, so is regtesting.

I verified it works with thin and fat LTO and that the early DWARF
has a proper .debug_line including the reference from the CU.  This
then also makes dwz happy with simple objects that do not contain
DW_OP_GNU_variable_value.

Ok for trunk if the rest of testing succeeds?

Thanks,
Richard.

2018-04-11  Richard Biener  <rguenther@suse.de>

	PR lto/85339
	* dwarf2out.c (dwarf2out_finish): Remove DW_AT_stmt_list attribute
	from early DWARF output.
	(dwarf2out_early_finish): Output line info unconditionally into
	early DWARF and add reference to it.

Comments

Jakub Jelinek April 11, 2018, 12:59 p.m. | #1
On Wed, Apr 11, 2018 at 01:09:39PM +0200, Richard Biener wrote:
> 2018-04-11  Richard Biener  <rguenther@suse.de>
> 
> 	PR lto/85339
> 	* dwarf2out.c (dwarf2out_finish): Remove DW_AT_stmt_list attribute
> 	from early DWARF output.
> 	(dwarf2out_early_finish): Output line info unconditionally into
> 	early DWARF and add reference to it.
> 
> +  if (debug_info_level >= DINFO_LEVEL_TERSE)
> +    add_AT_lineptr (comp_unit_die (), DW_AT_stmt_list,
> +		    dl_section_ref);

No reason to wrap the above line, it fits nicely on one line.

Otherwise LGTM.

	Jakub
Jason Merrill April 11, 2018, 1:06 p.m. | #2
OK.

On Wed, Apr 11, 2018 at 7:09 AM, Richard Biener <rguenther@suse.de> wrote:
>
> The following fixes the missing .debug_line in the early LTO debug
> DWARF which makes all DW_AT_decl_file invalid.
>
> LTO bootstrapped on x86_64-unknown-linux-gnu, LTO bootstrap with -g3
> still running, so is regtesting.
>
> I verified it works with thin and fat LTO and that the early DWARF
> has a proper .debug_line including the reference from the CU.  This
> then also makes dwz happy with simple objects that do not contain
> DW_OP_GNU_variable_value.
>
> Ok for trunk if the rest of testing succeeds?
>
> Thanks,
> Richard.
>
> 2018-04-11  Richard Biener  <rguenther@suse.de>
>
>         PR lto/85339
>         * dwarf2out.c (dwarf2out_finish): Remove DW_AT_stmt_list attribute
>         from early DWARF output.
>         (dwarf2out_early_finish): Output line info unconditionally into
>         early DWARF and add reference to it.
>
> Index: gcc/dwarf2out.c
> ===================================================================
> --- gcc/dwarf2out.c     (revision 259308)
> +++ gcc/dwarf2out.c     (working copy)
> @@ -31045,7 +31046,8 @@ dwarf2out_finish (const char *)
>        /* Reset die CU symbol so we don't output it twice.  */
>        comp_unit_die ()->die_id.die_symbol = NULL;
>
> -      /* Remove DW_AT_macro from the early output.  */
> +      /* Remove DW_AT_macro and DW_AT_stmt_list from the early output.  */
> +      remove_AT (comp_unit_die (), DW_AT_stmt_list);
>        if (have_macinfo)
>         remove_AT (comp_unit_die (), DEBUG_MACRO_ATTRIBUTE);
>
> @@ -31681,6 +31683,7 @@ static void
>  dwarf2out_early_finish (const char *filename)
>  {
>    set_early_dwarf s;
> +  char dl_section_ref[MAX_ARTIFICIAL_LABEL_BYTES];
>
>    /* PCH might result in DW_AT_producer string being restored from the
>       header compilation, so always fill it with empty string initially
> @@ -31829,6 +31836,16 @@ dwarf2out_early_finish (const char *file
>         ctnode != NULL; ctnode = ctnode->next)
>      add_sibling_attributes (ctnode->root_die);
>
> +  /* AIX Assembler inserts the length, so adjust the reference to match the
> +     offset expected by debuggers.  */
> +  strcpy (dl_section_ref, debug_skeleton_line_section_label);
> +  if (XCOFF_DEBUGGING_INFO)
> +    strcat (dl_section_ref, DWARF_INITIAL_LENGTH_SIZE_STR);
> +
> +  if (debug_info_level >= DINFO_LEVEL_TERSE)
> +    add_AT_lineptr (comp_unit_die (), DW_AT_stmt_list,
> +                   dl_section_ref);
> +
>    if (have_macinfo)
>      add_AT_macptr (comp_unit_die (), DEBUG_MACRO_ATTRIBUTE,
>                    macinfo_section_label);
> @@ -31898,11 +31915,6 @@ dwarf2out_early_finish (const char *file
>        output_macinfo (debug_skeleton_line_section_label, true);
>        dw2_asm_output_data (1, 0, "End compilation unit");
>
> -      /* Emit a skeleton debug_line section.  */
> -      switch_to_section (debug_skeleton_line_section);
> -      ASM_OUTPUT_LABEL (asm_out_file, debug_skeleton_line_section_label);
> -      output_line_info (true);
> -
>        if (flag_fat_lto_objects)
>         {
>           vec_free (macinfo_table);
> @@ -31910,6 +31922,10 @@ dwarf2out_early_finish (const char *file
>         }
>      }
>
> +  /* Emit a skeleton debug_line section.  */
> +  switch_to_section (debug_skeleton_line_section);
> +  ASM_OUTPUT_LABEL (asm_out_file, debug_skeleton_line_section_label);
> +  output_line_info (true);
>
>    /* If we emitted any indirect strings, output the string table too.  */
>    if (debug_str_hash || skeleton_debug_str_hash)

Patch

Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 259308)
+++ gcc/dwarf2out.c	(working copy)
@@ -31045,7 +31046,8 @@  dwarf2out_finish (const char *)
       /* Reset die CU symbol so we don't output it twice.  */
       comp_unit_die ()->die_id.die_symbol = NULL;
 
-      /* Remove DW_AT_macro from the early output.  */
+      /* Remove DW_AT_macro and DW_AT_stmt_list from the early output.  */
+      remove_AT (comp_unit_die (), DW_AT_stmt_list);
       if (have_macinfo)
 	remove_AT (comp_unit_die (), DEBUG_MACRO_ATTRIBUTE);
 
@@ -31681,6 +31683,7 @@  static void
 dwarf2out_early_finish (const char *filename)
 {
   set_early_dwarf s;
+  char dl_section_ref[MAX_ARTIFICIAL_LABEL_BYTES];
 
   /* PCH might result in DW_AT_producer string being restored from the
      header compilation, so always fill it with empty string initially
@@ -31829,6 +31836,16 @@  dwarf2out_early_finish (const char *file
        ctnode != NULL; ctnode = ctnode->next)
     add_sibling_attributes (ctnode->root_die);
 
+  /* AIX Assembler inserts the length, so adjust the reference to match the
+     offset expected by debuggers.  */
+  strcpy (dl_section_ref, debug_skeleton_line_section_label);
+  if (XCOFF_DEBUGGING_INFO)
+    strcat (dl_section_ref, DWARF_INITIAL_LENGTH_SIZE_STR);
+
+  if (debug_info_level >= DINFO_LEVEL_TERSE)
+    add_AT_lineptr (comp_unit_die (), DW_AT_stmt_list,
+		    dl_section_ref);
+
   if (have_macinfo)
     add_AT_macptr (comp_unit_die (), DEBUG_MACRO_ATTRIBUTE,
 		   macinfo_section_label);
@@ -31898,11 +31915,6 @@  dwarf2out_early_finish (const char *file
       output_macinfo (debug_skeleton_line_section_label, true);
       dw2_asm_output_data (1, 0, "End compilation unit");
 
-      /* Emit a skeleton debug_line section.  */
-      switch_to_section (debug_skeleton_line_section);
-      ASM_OUTPUT_LABEL (asm_out_file, debug_skeleton_line_section_label);
-      output_line_info (true);
-
       if (flag_fat_lto_objects)
 	{
 	  vec_free (macinfo_table);
@@ -31910,6 +31922,10 @@  dwarf2out_early_finish (const char *file
 	}
     }
 
+  /* Emit a skeleton debug_line section.  */
+  switch_to_section (debug_skeleton_line_section);
+  ASM_OUTPUT_LABEL (asm_out_file, debug_skeleton_line_section_label);
+  output_line_info (true);
 
   /* If we emitted any indirect strings, output the string table too.  */
   if (debug_str_hash || skeleton_debug_str_hash)