[PATCH] Fix -fdebug-types-section with -flto

Richard Biener rguenther@suse.de
Wed Feb 27 10:35:00 GMT 2019


This makes -fdebug-types-section actually work with -flto, causing
type units to be created and referred to by early debug.

I've lightly tested the result with hello-world style examples
where before this patch gdb wasn't able to see any types
(there were signature refs but the type units were missing) and
after the patch things work as expected.

The combination with -gsplit-dwarf is still broken, but that's
a different bug (-gsplit-dwarf plus -flto is broken).

Bootstrap & regtest running on x86_64-unknown-linux-gnu.

Richard.

2019-02-27  Richard Biener  <rguenther@suse.de>

	PR debug/88878
	* dwarf2out.c (output_comdat_type_unit): Add early_lto_debug
	parameter, prefix section name with .gnu.debuglto_ if true.
	(dwarf2out_finish): Pass false to output_comdat_type_unit.
	(dwarf2out_early_finish): Pass true to output_comdat_type_unit.
	 
Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 269242)
+++ gcc/dwarf2out.c	(working copy)
@@ -3746,7 +3746,7 @@ static void output_die_abbrevs (unsigned
 static void output_die (dw_die_ref);
 static void output_compilation_unit_header (enum dwarf_unit_type);
 static void output_comp_unit (dw_die_ref, int, const unsigned char *);
-static void output_comdat_type_unit (comdat_type_node *);
+static void output_comdat_type_unit (comdat_type_node *, bool);
 static const char *dwarf2_name (tree, int);
 static void add_pubname (tree, dw_die_ref);
 static void add_enumerator_pubname (const char *, dw_die_ref);
@@ -11225,7 +11230,7 @@ output_skeleton_debug_sections (dw_die_r
 /* Output a comdat type unit DIE and its children.  */
 
 static void
-output_comdat_type_unit (comdat_type_node *node)
+output_comdat_type_unit (comdat_type_node *node, bool early_lto_debug)
 {
   const char *secname;
   char *tmp;
@@ -11252,14 +11257,16 @@ output_comdat_type_unit (comdat_type_nod
   if (dwarf_version >= 5)
     {
       if (!dwarf_split_debug_info)
-	secname = ".debug_info";
+	secname = early_lto_debug ? DEBUG_LTO_INFO_SECTION : DEBUG_INFO_SECTION;
       else
-	secname = ".debug_info.dwo";
+	secname = (early_lto_debug
+		   ? DEBUG_LTO_DWO_INFO_SECTION : DEBUG_DWO_INFO_SECTION);
     }
   else if (!dwarf_split_debug_info)
-    secname = ".debug_types";
+    secname = early_lto_debug ? ".gnu.debuglto_.debug_types" : ".debug_types";
   else
-    secname = ".debug_types.dwo";
+    secname = (early_lto_debug
+	       ? ".gnu.debuglto_.debug_types.dwo" : ".debug_types.dwo");
 
   tmp = XALLOCAVEC (char, 4 + DWARF_TYPE_SIGNATURE_SIZE * 2);
   sprintf (tmp, dwarf_version >= 5 ? "wi." : "wt.");
@@ -31498,7 +31505,7 @@ dwarf2out_finish (const char *filename)
                          ? dl_section_ref
                          : debug_skeleton_line_section_label));
 
-      output_comdat_type_unit (ctnode);
+      output_comdat_type_unit (ctnode, false);
       *slot = ctnode;
     }
 
@@ -32189,7 +32196,7 @@ dwarf2out_early_finish (const char *file
                          ? debug_line_section_label
                          : debug_skeleton_line_section_label));
 
-      output_comdat_type_unit (ctnode);
+      output_comdat_type_unit (ctnode, true);
       *slot = ctnode;
     }
 



More information about the Gcc-patches mailing list