Re: [PATCH] Fix .debug_rnglists generation with -gdwarf-5 -gsplit-dwarf.

2017-11-23 Thread Mark Wielaard
On Thu, 2017-11-23 at 14:33 +0100, Jakub Jelinek wrote:
> On Thu, Nov 23, 2017 at 02:13:57PM +0100, Mark Wielaard wrote:
> >    * dwarf2out.c (init_sections_and_labels): Use generation to create
> >    unique ranges_section_label and ranges_base_label. Return generation.
> >    (output_rnglists): Add generation argument. Use generation to create
> >    unique ranges labels.
> >    (dwarf2out_finish): Get generation from init_sections_and_labels
> >    and pass generation to output_rnglists.
> 
> Ok.

Thanks. Pushed.

>   Though, note that -gdwarf-5 -gsplit-dwarf is really unfinished anyway,
> I did what was easy, but left out what was harder and did no testing at all
> (don't know what tools are needed for the split dwarf processing etc.).

Yes, I noticed. In particular the indirect index forms addrx and strx
are never used, only the GNU addr_index and str_index ones. I am adding
DWARF5 support to elfutils libdw. But it doesn't have support for
split-dwarf yet. I'll see if I can help update gcc when I get split-
dwarf working in elfutils. One issue with that is that binutils/gdb do
support split-dwarf or DWARF5, but not DWARF5 and split-dwarf yet.

Cheers,

Mark


Re: [PATCH] Fix .debug_rnglists generation with -gdwarf-5 -gsplit-dwarf.

2017-11-23 Thread Jakub Jelinek
On Thu, Nov 23, 2017 at 02:13:57PM +0100, Mark Wielaard wrote:
> Early debug broke generation of .debug_rnglists when using both -gdwarf5
> and -gsplit-dwarf. It introduces a generation for init_sections_and_labels,
> but doesn't account for the generation of up to 4 unique ranges labels,
> two created in init_sections_and_labels and two in output_rnglists.
> Fix this by passing generation to output_rnglists and creating 4 unique
> labels per generation.
> 
> Without this fix using -gdwarf-5 -gsplit-dwarf could result in:
>   Error: symbol `.Ldebug_ranges2' is already defined
> 
> gcc/ChangeLog:
> 
>* dwarf2out.c (init_sections_and_labels): Use generation to create
>unique ranges_section_label and ranges_base_label. Return generation.
>(output_rnglists): Add generation argument. Use generation to create
>unique ranges labels.
>(dwarf2out_finish): Get generation from init_sections_and_labels
>and pass generation to output_rnglists.

Ok.  Though, note that -gdwarf-5 -gsplit-dwarf is really unfinished anyway,
I did what was easy, but left out what was harder and did no testing at all
(don't know what tools are needed for the split dwarf processing etc.).

Jakub


[PATCH] Fix .debug_rnglists generation with -gdwarf-5 -gsplit-dwarf.

2017-11-23 Thread Mark Wielaard
Early debug broke generation of .debug_rnglists when using both -gdwarf5
and -gsplit-dwarf. It introduces a generation for init_sections_and_labels,
but doesn't account for the generation of up to 4 unique ranges labels,
two created in init_sections_and_labels and two in output_rnglists.
Fix this by passing generation to output_rnglists and creating 4 unique
labels per generation.

Without this fix using -gdwarf-5 -gsplit-dwarf could result in:
  Error: symbol `.Ldebug_ranges2' is already defined

gcc/ChangeLog:

   * dwarf2out.c (init_sections_and_labels): Use generation to create
   unique ranges_section_label and ranges_base_label. Return generation.
   (output_rnglists): Add generation argument. Use generation to create
   unique ranges labels.
   (dwarf2out_finish): Get generation from init_sections_and_labels
   and pass generation to output_rnglists.
---

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 4b0216e..ae3d962 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -11182,7 +11182,7 @@ index_rnglists (void)
 /* Emit .debug_rnglists section.  */
 
 static void
-output_rnglists (void)
+output_rnglists (unsigned generation)
 {
   unsigned i;
   dw_ranges *r;
@@ -11192,8 +11192,12 @@ output_rnglists (void)
 
   switch_to_section (debug_ranges_section);
   ASM_OUTPUT_LABEL (asm_out_file, ranges_section_label);
-  ASM_GENERATE_INTERNAL_LABEL (l1, DEBUG_RANGES_SECTION_LABEL, 2);
-  ASM_GENERATE_INTERNAL_LABEL (l2, DEBUG_RANGES_SECTION_LABEL, 3);
+  /* There are up to 4 unique ranges labels per generation.
+ See also init_sections_and_labels.  */
+  ASM_GENERATE_INTERNAL_LABEL (l1, DEBUG_RANGES_SECTION_LABEL,
+  2 + generation * 4);
+  ASM_GENERATE_INTERNAL_LABEL (l2, DEBUG_RANGES_SECTION_LABEL,
+  3 + generation * 4);
   if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
 dw2_asm_output_data (4, 0x,
 "Initial length escape value indicating "
@@ -27261,9 +27265,10 @@ output_macinfo (const char *debug_line_label, bool 
early_lto_debug)
 }
 
 /* Initialize the various sections and labels for dwarf output and prefix
-   them with PREFIX if non-NULL.  */
+   them with PREFIX if non-NULL.  Returns the generation (zero based
+   number of times function was called).  */
 
-static void
+static unsigned
 init_sections_and_labels (bool early_lto_debug)
 {
   /* As we may get called multiple times have a generation count for
@@ -27442,11 +27447,14 @@ init_sections_and_labels (bool early_lto_debug)
   info_section_emitted = false;
   ASM_GENERATE_INTERNAL_LABEL (debug_line_section_label,
   DEBUG_LINE_SECTION_LABEL, generation);
+  /* There are up to 4 unique ranges labels per generation.
+ See also output_rnglists.  */
   ASM_GENERATE_INTERNAL_LABEL (ranges_section_label,
-  DEBUG_RANGES_SECTION_LABEL, generation);
+  DEBUG_RANGES_SECTION_LABEL, generation * 4);
   if (dwarf_version >= 5 && dwarf_split_debug_info)
 ASM_GENERATE_INTERNAL_LABEL (ranges_base_label,
-DEBUG_RANGES_SECTION_LABEL, 2 + generation);
+DEBUG_RANGES_SECTION_LABEL,
+1 + generation * 4);
   ASM_GENERATE_INTERNAL_LABEL (debug_addr_section_label,
   DEBUG_ADDR_SECTION_LABEL, generation);
   ASM_GENERATE_INTERNAL_LABEL (macinfo_section_label,
@@ -27457,6 +27465,7 @@ init_sections_and_labels (bool early_lto_debug)
   generation);
 
   ++generation;
+  return generation - 1;
 }
 
 /* Set up for Dwarf output at the start of compilation.  */
@@ -29890,7 +29899,7 @@ dwarf2out_finish (const char *)
   move_marked_base_types ();
 
   /* Initialize sections and labels used for actual assembler output.  */
-  init_sections_and_labels (false);
+  unsigned generation = init_sections_and_labels (false);
 
   /* Traverse the DIE's and add sibling attributes to those DIE's that
  have children.  */
@@ -30179,7 +30188,7 @@ dwarf2out_finish (const char *)
   if (!vec_safe_is_empty (ranges_table))
 {
   if (dwarf_version >= 5)
-   output_rnglists ();
+   output_rnglists (generation);
   else
output_ranges ();
 }
-- 
1.8.3.1