This fixes crashes on Darwin with -flto -g because we pass the wrong
(NULL) debug_line_section in

        case dw_val_class_lineptr:
          dw2_asm_output_offset (DWARF_OFFSET_SIZE, AT_lbl (a),
                                 debug_line_section, "%s", name);
          break;

which is because for some reason I used debug_sekelton_line_section
and friends for the early LTO dwarf.  That looks mistaken in the
above light so the following reverts that to use debug_line_section
and friends.

I verified that -flto -g -gsplit-dwarf still "works" (though that combo
doesn't make much sense, if only because .dwo objects for the ltrans
objects end up in /tmp ...).

LTO bootstrap with -g[23] succeeded on x86_64-unknown-linux-gnu,
bootstrap for all languages as well, testing in progress.

Approved by Jakub on IRC so I'll go ahead with this after the above
finished.

Haven't yet found a convenient place to disable -gsplit-dwarf for
the non-fat part of LTO in a way the driver sees it.  Any hints
appreciated.  There's also the (unwanted) side-effect of
-gsplit-dwarf enabling -ggnu-pubnames.  Disabling on the LTRANS
side alone should be possible by massaging lto-wrapper to append
-gno-split-dwarf I guess.

Richard.

2018-04-12  Richard Biener  <rguent...@suse.de>

        PR lto/85371
        * dwarf2out.c (init_sections_and_labels): Use debug_line_section[_label]
        for the early LTO debug to properly generate references to it
        during DIE emission.  Do not re-use that for the skeleton for
        split-dwarf.
        (dwarf2out_early_finish): Likewise.

Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c     (revision 259337)
+++ gcc/dwarf2out.c     (working copy)
@@ -28405,14 +28406,6 @@ init_sections_and_labels (bool early_lto
          debug_macinfo_section = get_section (debug_macinfo_section_name,
                                               SECTION_DEBUG
                                               | SECTION_EXCLUDE, NULL);
-         /* For macro info we have to refer to a debug_line section, so
-            similar to split-dwarf emit a skeleton one for early debug.  */
-         debug_skeleton_line_section
-           = get_section (DEBUG_LTO_LINE_SECTION,
-                          SECTION_DEBUG | SECTION_EXCLUDE, NULL);
-         ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_line_section_label,
-                                      DEBUG_SKELETON_LINE_SECTION_LABEL,
-                                      generation);
        }
       else
        {
@@ -28459,6 +28452,13 @@ init_sections_and_labels (bool early_lto
                                               SECTION_DEBUG | SECTION_EXCLUDE,
                                               NULL);
        }
+      /* For macro info and the file table we have to refer to a
+        debug_line section.  */
+      debug_line_section = get_section (DEBUG_LTO_LINE_SECTION,
+                                       SECTION_DEBUG | SECTION_EXCLUDE, NULL);
+      ASM_GENERATE_INTERNAL_LABEL (debug_line_section_label,
+                                  DEBUG_LINE_SECTION_LABEL, generation);
+
       debug_str_section = get_section (DEBUG_LTO_STR_SECTION,
                                       DEBUG_STR_SECTION_FLAGS
                                       | SECTION_EXCLUDE, NULL);
@@ -31845,7 +31849,7 @@ dwarf2out_early_finish (const char *file
 
   /* 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);
+  strcpy (dl_section_ref, debug_line_section_label);
   if (XCOFF_DEBUGGING_INFO)
     strcat (dl_section_ref, DWARF_INITIAL_LENGTH_SIZE_STR);
 
@@ -31918,7 +31922,7 @@ dwarf2out_early_finish (const char *file
 
       switch_to_section (debug_macinfo_section);
       ASM_OUTPUT_LABEL (asm_out_file, macinfo_section_label);
-      output_macinfo (debug_skeleton_line_section_label, true);
+      output_macinfo (debug_line_section_label, true);
       dw2_asm_output_data (1, 0, "End compilation unit");
 
       if (flag_fat_lto_objects)
@@ -31929,8 +31933,8 @@ 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);
+  switch_to_section (debug_line_section);
+  ASM_OUTPUT_LABEL (asm_out_file, debug_line_section_label);
   output_line_info (true);
 
   /* If we emitted any indirect strings, output the string table too.  */

Reply via email to