This cures the ICEs and wrong assembler that currently happen when using -flto with -gdwarf-5. gdb is also happy with small test programs but readelf is still complaining (see PR, I have no clue what goes wrong).
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. LTO bootstrap with -gdwarf-5 running ontop of the GCC 8 branch. Jakub, do you know of any issues with dwarf5 supports in tools like readelf? I've just checked that from binutils 2.31 but even that isn't happy. Anyhow, since this solves ICEs and gdb is happy I'm going to commit it unless I hear objections (also to the branch after LTO bootstrap and testing completet there). Thanks, Richard. 2018-07-17 Richard Biener <rguent...@suse.de> PR lto/86456 * dwarf2out.c (init_sections_and_labels): Always generate a debug_line_str_section for early LTO debug. (dwarf2out_finish): Reset debug_line_str_hash output early. Bump counter for extra dwarf5 .debug_loc labels to not conflict with fat LTO part. (dwarf2out_early_finish): Output debug_line_str. * g++.dg/debug/dwarf2/pr86456.C: New testcase. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 1e33cf07f09..bd45e0b0685 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -28488,7 +28488,7 @@ init_sections_and_labels (bool early_lto_debug) debug_str_section = get_section (DEBUG_LTO_STR_SECTION, DEBUG_STR_SECTION_FLAGS | SECTION_EXCLUDE, NULL); - if (!dwarf_split_debug_info && !output_asm_line_debug_info ()) + if (!dwarf_split_debug_info) debug_line_str_section = get_section (DEBUG_LTO_LINE_STR_SECTION, DEBUG_STR_SECTION_FLAGS | SECTION_EXCLUDE, NULL); @@ -31149,6 +31149,11 @@ dwarf2out_finish (const char *) /* Remove indirect string decisions. */ debug_str_hash->traverse<void *, reset_indirect_string> (NULL); + if (debug_line_str_hash) + { + debug_line_str_hash->traverse<void *, reset_indirect_string> (NULL); + debug_line_str_hash = NULL; + } } #if ENABLE_ASSERT_CHECKING @@ -31433,8 +31438,8 @@ dwarf2out_finish (const char *) switch_to_section (debug_loc_section); if (dwarf_version >= 5) { - ASM_GENERATE_INTERNAL_LABEL (l1, DEBUG_LOC_SECTION_LABEL, 1); - ASM_GENERATE_INTERNAL_LABEL (l2, DEBUG_LOC_SECTION_LABEL, 2); + ASM_GENERATE_INTERNAL_LABEL (l1, DEBUG_LOC_SECTION_LABEL, 2); + ASM_GENERATE_INTERNAL_LABEL (l2, DEBUG_LOC_SECTION_LABEL, 3); if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) dw2_asm_output_data (4, 0xffffffff, "Initial length escape value indicating " @@ -32053,6 +32058,13 @@ dwarf2out_early_finish (const char *filename) /* If we emitted any indirect strings, output the string table too. */ if (debug_str_hash || skeleton_debug_str_hash) output_indirect_strings (); + if (debug_line_str_hash) + { + switch_to_section (debug_line_str_section); + const enum dwarf_form form = DW_FORM_line_strp; + debug_line_str_hash->traverse<enum dwarf_form, + output_indirect_string> (form); + } /* Switch back to the text section. */ switch_to_section (text_section); diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr86456.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr86456.C new file mode 100644 index 00000000000..56e08f39e64 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr86456.C @@ -0,0 +1,5 @@ +// { dg-do compile } +// { dg-require-effective-target lto } +// { dg-options "-g -gdwarf-5 -flto -ffat-lto-objects" } + +int a;