Re: [PATCH] Fix PR85339, bogus early debug
On Wed, Apr 11, 2018 at 01:09:39PM +0200, Richard Biener wrote: > 2018-04-11 Richard Biener > > 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
Re: [PATCH] Fix PR85339, bogus early debug
OK. On Wed, Apr 11, 2018 at 7:09 AM, Richard Biener 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 > > 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] Fix PR85339, bogus early debug
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 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)