This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Disable -gsplit-dwarf for all LTO debug


The following disables split-dwarf for the LTO part of the early debug
(keeping it for the fat part) and makes sure the driver doesn't
see -gsplit-dwarf in effect.

That works for all but the compile stage and slim objects
(the default) which then ends up generating an empty .dwo file.
I'm not sure where to prune for this case given that 
-fno-fat-lto-objects seems to be just ignored if it isn't supported.

Note that we need the dwarf2out.c part as otherwise the late
references cannot be resolved since the debug is copied from .o to .dwo
files early.

Opinions?

Thanks,
Richard.

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

	* lto-wrapper.c (run_gcc): Add -gno-split-dwarf to cancel
	any such option from compile or link time in a way visible
	to the driver.
	* dwarf2out.c (add_top_level_skeleton_die_attrs): Avoid adding
	DW_AT_GNU_pubnames twice.
	(dwarf2out_early_finish): Unconditionally call add_AT_pubnames.
	Disable dwarf_split_debug_info around the early LTO DWARF emission
	and remove then dead code.

Index: gcc/lto-wrapper.c
===================================================================
--- gcc/lto-wrapper.c	(revision 259337)
+++ gcc/lto-wrapper.c	(working copy)
@@ -1123,6 +1123,7 @@ run_gcc (unsigned argc, char *argv[])
   append_compiler_options (&argv_obstack, fdecoded_options,
 			   fdecoded_options_count);
   append_linker_options (&argv_obstack, decoded_options, decoded_options_count);
+  obstack_ptr_grow (&argv_obstack, "-gno-split-dwarf");
 
   /* Scan linker driver arguments for things that are of relevance to us.  */
   for (j = 1; j < decoded_options_count; ++j)
Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 259337)
+++ gcc/dwarf2out.c	(working copy)
@@ -11105,7 +11105,8 @@ add_top_level_skeleton_die_attrs (dw_die
   add_skeleton_AT_string (die, dwarf_AT (DW_AT_dwo_name), dwo_file_name);
   if (comp_dir != NULL)
     add_skeleton_AT_string (die, DW_AT_comp_dir, comp_dir);
-  add_AT_pubnames (die);
+  if (!get_AT (die, DW_AT_GNU_pubnames))
+    add_AT_pubnames (die);
   add_AT_lineptr (die, DW_AT_GNU_addr_base, debug_addr_section_label);
 }
 
@@ -31811,11 +31812,8 @@ dwarf2out_early_finish (const char *file
     note_variable_value (node->die);
 
   /* The AT_pubnames attribute needs to go in all skeleton dies, including
-     both the main_cu and all skeleton TUs.  Making this call unconditional
-     would end up either adding a second copy of the AT_pubnames attribute, or
-     requiring a special case in add_top_level_skeleton_die_attrs.  */
-  if (!dwarf_split_debug_info)
-    add_AT_pubnames (comp_unit_die ());
+     both the main_cu and all skeleton TUs.  */
+  add_AT_pubnames (comp_unit_die ());
 
   /* The early debug phase is now finished.  */
   early_dwarf_finished = true;
@@ -31824,6 +31822,11 @@ dwarf2out_early_finish (const char *file
   if (!flag_generate_lto && !flag_generate_offload)
     return;
 
+  /* For the early LTO DWARF we do not want split DWARF because it really
+     doesn't make much sense.  */
+  int saved_dwarf_split_debug_info = dwarf_split_debug_info;
+  dwarf_split_debug_info = 0;
+
   /* Now as we are going to output for LTO initialize sections and labels
      to the LTO variants.  We don't need a random-seed postfix as other
      LTO sections as linking the LTO debug sections into one in a partial
@@ -31858,12 +31861,6 @@ dwarf2out_early_finish (const char *file
 
   save_macinfo_strings ();
 
-  if (dwarf_split_debug_info)
-    {
-      unsigned int index = 0;
-      debug_str_hash->traverse_noresize<unsigned int *, index_string> (&index);
-    }
-
   /* Output all of the compilation units.  We put the main one last so that
      the offsets are available to output_pubnames.  */
   for (limbo_die_node *node = limbo_die_list; node; node = node->next)
@@ -31884,9 +31881,7 @@ dwarf2out_early_finish (const char *file
          attributes.  */
       if (debug_info_level >= DINFO_LEVEL_TERSE)
         add_AT_lineptr (ctnode->root_die, DW_AT_stmt_list,
-                        (!dwarf_split_debug_info
-                         ? debug_line_section_label
-                         : debug_skeleton_line_section_label));
+                        debug_line_section_label);
 
       output_comdat_type_unit (ctnode);
       *slot = ctnode;
@@ -31939,6 +31934,8 @@ dwarf2out_early_finish (const char *file
 
   /* Switch back to the text section.  */
   switch_to_section (text_section);
+
+  dwarf_split_debug_info = saved_dwarf_split_debug_info;
 }
 
 /* Reset all state within dwarf2out.c so that we can rerun the compiler


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]