diff mbox series

Fix -fdebug-types-section with -flto

Message ID alpine.LSU.2.20.1902271106330.23386@zhemvz.fhfr.qr
State New
Headers show
Series Fix -fdebug-types-section with -flto | expand

Commit Message

Richard Biener Feb. 27, 2019, 10:11 a.m. UTC
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.
diff mbox series

Patch

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;
     }