Fix PR86456

Message ID alpine.LSU.2.20.1807171019000.16707@zhemvz.fhfr.qr
State New
Headers show
Series
  • Fix PR86456
Related show

Commit Message

Richard Biener July 17, 2018, 8:23 a.m.
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  <rguenther@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.

Comments

Jeff Law July 17, 2018, 8:50 p.m. | #1
On 07/17/2018 02:23 AM, Richard Biener wrote:
> 

> 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.

Mark Weilaard has been poking at dwarf5 support in elfutils.  You may
have better luck with those rather than readelf from binutils.

Tom Rix indicated some interest in this space as well, but I haven't
seen much code yet.


Jeff

Patch

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;