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;

Reply via email to