Fix PR85371

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

Commit Message

Richard Biener April 12, 2018, 11:03 a.m.
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  <rguenther@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.

Patch

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