public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Re: [PATCH] Refactor section/label init for early LTO debug
@ 2016-09-27 10:24 Dominique d'Humières
  0 siblings, 0 replies; 8+ messages in thread
From: Dominique d'Humières @ 2016-09-27 10:24 UTC (permalink / raw)
  To: Rainer Orth; +Cc: Richard Biener, gcc-patches

> this patch introduced many pch assembly comparison failures on Solaris
> (both sparc and x86, 32 and 64-bit, /bin/as only), like
Something on darwin.

TIA

Dominique

^ permalink raw reply	[flat|nested] 8+ messages in thread
* [PATCH] Refactor section/label init for early LTO debug
@ 2016-09-21 13:34 Richard Biener
  2016-09-23 19:37 ` Jason Merrill
  2016-09-27 10:23 ` Rainer Orth
  0 siblings, 2 replies; 8+ messages in thread
From: Richard Biener @ 2016-09-21 13:34 UTC (permalink / raw)
  To: gcc-patches; +Cc: jason


The following patch ports a refactoring of section/label in it from
the early LTO debug work to trunk.  For early LTO debug we need to
be able to emit two sets of debug infos into two sets of different
sections - early LTO into .gnu.debuglto_ prefixed sections and
regular (early + late) debug for the FAT part of the object.

Thus this preparation splits out the section and label generation
from dwarf2out_init moving the text section related stuff to 
dwarf2out_assembly_start and the rest to a new function
init_sections_and_labels which is now called only before we start
outputting dwarf (in dwarf2out_finish).  It also removes some
dwarf_split_debug_info checks from the macro section name defines
(in the end I'll have up to four variants - regular, regular LTO,
DWO, DWO LTO).

And it removes an unused function.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.  I've
also bootstrapped with -O2 -g3 to exercise the .debug_macro path.

Ok?

Just noticed that DEBUG_STR_OFFSETS_SECTION needs similar massaging
for its dwarf_split_debug_info condition - will followup as obvious
if this one is approved.

Thanks,
Richard.

2016-09-21  Richard Biener  <rguenther@suse.de>

	* dwarf2out.c (stripattributes): Remove unused function.
	(DEBUG_NORM_MACINFO_SECTION): Rename to DEBUG_MACINFO_SECTION.
	Push dwarf_split_debug_info handling into init_sections_and_labels.
	(DEBUG_NORM_MACRO_SECTION): Likewise to DEBUG_MACRO_SECTION.
	(DEBUG_MACRO_SECTION_FLAGS): Remove.
	(debug_macinfo_section_name): New global.
	(output_macinfo): Use debug_macinfo_section_name.
	(init_sections_and_labels): Split out section and label generation
	from dwarf2out_init.  Set debug_macinfo_section_name.
	(dwarf2out_init): Move text section label generation and emission
	to ...
	(dwarf2out_assembly_start): ... here.
	(dwarf2out_finish): Call init_sections_and_labels before DWARF
	output starts.

Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 240303)
+++ gcc/dwarf2out.c	(working copy)
@@ -159,6 +159,7 @@ static GTY(()) section *debug_skeleton_a
 static GTY(()) section *debug_aranges_section;
 static GTY(()) section *debug_addr_section;
 static GTY(()) section *debug_macinfo_section;
+static const char *debug_macinfo_section_name;
 static GTY(()) section *debug_line_section;
 static GTY(()) section *debug_skeleton_line_section;
 static GTY(()) section *debug_loc_section;
@@ -265,7 +266,6 @@ static GTY(()) dw_die_ref decltype_auto_
 
 /* Forward declarations for functions defined in this file.  */
 
-static char *stripattributes (const char *);
 static void output_call_frame_info (int);
 static void dwarf2out_note_section_used (void);
 
@@ -410,24 +410,6 @@ should_emit_struct_debug (tree type, enu
   return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
 }
 \f
-/* Return a pointer to a copy of the section string name S with all
-   attributes stripped off, and an asterisk prepended (for assemble_name).  */
-
-static inline char *
-stripattributes (const char *s)
-{
-  char *stripped = XNEWVEC (char, strlen (s) + 2);
-  char *p = stripped;
-
-  *p++ = '*';
-
-  while (*s && *s != ',')
-    *p++ = *s++;
-
-  *p = '\0';
-  return stripped;
-}
-
 /* Switch [BACK] to eh_frame_section.  If we don't have an eh_frame_section,
    switch to the data section instead, and write out a synthetic start label
    for collect2 the first time around.  */
@@ -3514,27 +3496,17 @@ new_addr_loc_descr (rtx addr, enum dtpre
 #ifndef DEBUG_ADDR_SECTION
 #define DEBUG_ADDR_SECTION     ".debug_addr"
 #endif
-#ifndef DEBUG_NORM_MACINFO_SECTION
-#define DEBUG_NORM_MACINFO_SECTION     ".debug_macinfo"
+#ifndef DEBUG_MACINFO_SECTION
+#define DEBUG_MACINFO_SECTION     ".debug_macinfo"
 #endif
 #ifndef DEBUG_DWO_MACINFO_SECTION
 #define DEBUG_DWO_MACINFO_SECTION      ".debug_macinfo.dwo"
 #endif
-#ifndef DEBUG_MACINFO_SECTION
-#define DEBUG_MACINFO_SECTION                                           \
-  (!dwarf_split_debug_info                                              \
-   ? (DEBUG_NORM_MACINFO_SECTION) : (DEBUG_DWO_MACINFO_SECTION))
-#endif
-#ifndef DEBUG_NORM_MACRO_SECTION
-#define DEBUG_NORM_MACRO_SECTION ".debug_macro"
-#endif
 #ifndef DEBUG_DWO_MACRO_SECTION
 #define DEBUG_DWO_MACRO_SECTION        ".debug_macro.dwo"
 #endif
 #ifndef DEBUG_MACRO_SECTION
-#define DEBUG_MACRO_SECTION                                             \
-  (!dwarf_split_debug_info                                              \
-   ? (DEBUG_NORM_MACRO_SECTION) : (DEBUG_DWO_MACRO_SECTION))
+#define DEBUG_MACRO_SECTION	".debug_macro"
 #endif
 #ifndef DEBUG_LINE_SECTION
 #define DEBUG_LINE_SECTION	".debug_line"
@@ -3580,10 +3552,6 @@ new_addr_loc_descr (rtx addr, enum dtpre
 #define TEXT_SECTION_NAME	".text"
 #endif
 
-/* Section flags for .debug_macinfo/.debug_macro section.  */
-#define DEBUG_MACRO_SECTION_FLAGS                                       \
-  (dwarf_split_debug_info ? SECTION_DEBUG | SECTION_EXCLUDE : SECTION_DEBUG)
-
 /* Section flags for .debug_str section.  */
 #define DEBUG_STR_SECTION_FLAGS                                 \
   (HAVE_GAS_SHF_MERGE && flag_merge_debug_strings               \
@@ -25520,7 +25488,7 @@ output_macinfo (void)
 	  tree comdat_key = get_identifier (ref->info);
 	  /* Terminate the previous .debug_macinfo section.  */
 	  dw2_asm_output_data (1, 0, "End compilation unit");
-	  targetm.asm_out.named_section (DEBUG_MACRO_SECTION,
+	  targetm.asm_out.named_section (debug_macinfo_section_name,
 					 SECTION_DEBUG
 					 | SECTION_LINKONCE,
 					 comdat_key);
@@ -25548,53 +25516,11 @@ output_macinfo (void)
       }
 }
 
-/* Set up for Dwarf output at the start of compilation.  */
+/* Initialize the various sections and labels for dwarf output.  */
 
 static void
-dwarf2out_init (const char *filename ATTRIBUTE_UNUSED)
+init_sections_and_labels (void)
 {
-  /* This option is currently broken, see (PR53118 and PR46102).  */
-  if (flag_eliminate_dwarf2_dups
-      && strstr (lang_hooks.name, "C++"))
-    {
-      warning (0, "-feliminate-dwarf2-dups is broken for C++, ignoring");
-      flag_eliminate_dwarf2_dups = 0;
-    }
-
-  /* Allocate the file_table.  */
-  file_table = hash_table<dwarf_file_hasher>::create_ggc (50);
-
-#ifndef DWARF2_LINENO_DEBUGGING_INFO
-  /* Allocate the decl_die_table.  */
-  decl_die_table = hash_table<decl_die_hasher>::create_ggc (10);
-
-  /* Allocate the decl_loc_table.  */
-  decl_loc_table = hash_table<decl_loc_hasher>::create_ggc (10);
-
-  /* Allocate the cached_dw_loc_list_table.  */
-  cached_dw_loc_list_table = hash_table<dw_loc_list_hasher>::create_ggc (10);
-
-  /* Allocate the initial hunk of the decl_scope_table.  */
-  vec_alloc (decl_scope_table, 256);
-
-  /* Allocate the initial hunk of the abbrev_die_table.  */
-  abbrev_die_table = ggc_cleared_vec_alloc<dw_die_ref>
-    (ABBREV_DIE_TABLE_INCREMENT);
-  abbrev_die_table_allocated = ABBREV_DIE_TABLE_INCREMENT;
-  /* Zero-th entry is allocated, but unused.  */
-  abbrev_die_table_in_use = 1;
-
-  /* Allocate the dwarf_proc_stack_usage_map.  */
-  dwarf_proc_stack_usage_map = new hash_map<dw_die_ref, int>;
-
-  /* Allocate the pubtypes and pubnames vectors.  */
-  vec_alloc (pubname_table, 32);
-  vec_alloc (pubtype_table, 32);
-
-  vec_alloc (incomplete_types, 64);
-
-  vec_alloc (used_rtx_array, 32);
-
   if (!dwarf_split_debug_info)
     {
       debug_info_section = get_section (DEBUG_INFO_SECTION,
@@ -25603,6 +25529,10 @@ dwarf2out_init (const char *filename ATT
                                           SECTION_DEBUG, NULL);
       debug_loc_section = get_section (DEBUG_LOC_SECTION,
                                        SECTION_DEBUG, NULL);
+      debug_macinfo_section_name
+	= dwarf_strict ? DEBUG_MACINFO_SECTION : DEBUG_MACRO_SECTION;
+      debug_macinfo_section = get_section (debug_macinfo_section_name,
+					   SECTION_DEBUG, NULL);
     }
   else
     {
@@ -25623,8 +25553,8 @@ dwarf2out_init (const char *filename ATT
       /* Somewhat confusing detail: The skeleton_[abbrev|info] sections stay in
          the main .o, but the skeleton_line goes into the split off dwo.  */
       debug_skeleton_line_section
-          = get_section (DEBUG_DWO_LINE_SECTION,
-                         SECTION_DEBUG | SECTION_EXCLUDE, NULL);
+        = get_section (DEBUG_DWO_LINE_SECTION,
+		       SECTION_DEBUG | SECTION_EXCLUDE, NULL);
       ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_line_section_label,
                                    DEBUG_SKELETON_LINE_SECTION_LABEL, 0);
       debug_str_offsets_section = get_section (DEBUG_STR_OFFSETS_SECTION,
@@ -25636,13 +25566,14 @@ dwarf2out_init (const char *filename ATT
                                        SECTION_DEBUG | SECTION_EXCLUDE, NULL);
       debug_str_dwo_section = get_section (DEBUG_STR_DWO_SECTION,
                                            DEBUG_STR_DWO_SECTION_FLAGS, NULL);
+      debug_macinfo_section_name
+	= dwarf_strict ? DEBUG_DWO_MACINFO_SECTION : DEBUG_DWO_MACRO_SECTION;
+      debug_macinfo_section = get_section (debug_macinfo_section_name,
+					   SECTION_DEBUG | SECTION_EXCLUDE,
+					   NULL);
     }
   debug_aranges_section = get_section (DEBUG_ARANGES_SECTION,
 				       SECTION_DEBUG, NULL);
-  debug_macinfo_section = get_section (dwarf_strict
-				       ? DEBUG_MACINFO_SECTION
-				       : DEBUG_MACRO_SECTION,
-                                       DEBUG_MACRO_SECTION_FLAGS, NULL);
   debug_line_section = get_section (DEBUG_LINE_SECTION,
 				    SECTION_DEBUG, NULL);
   debug_pubnames_section = get_section (DEBUG_PUBNAMES_SECTION,
@@ -25656,14 +25587,8 @@ dwarf2out_init (const char *filename ATT
   debug_frame_section = get_section (DEBUG_FRAME_SECTION,
 				     SECTION_DEBUG, NULL);
 
-  ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0);
   ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label,
 			       DEBUG_ABBREV_SECTION_LABEL, 0);
-  ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_SECTION_LABEL, 0);
-  ASM_GENERATE_INTERNAL_LABEL (cold_text_section_label,
-			       COLD_TEXT_SECTION_LABEL, 0);
-  ASM_GENERATE_INTERNAL_LABEL (cold_end_label, COLD_END_LABEL, 0);
-
   ASM_GENERATE_INTERNAL_LABEL (debug_info_section_label,
 			       DEBUG_INFO_SECTION_LABEL, 0);
   ASM_GENERATE_INTERNAL_LABEL (debug_line_section_label,
@@ -25677,12 +25602,57 @@ dwarf2out_init (const char *filename ATT
 			       ? DEBUG_MACINFO_SECTION_LABEL
 			       : DEBUG_MACRO_SECTION_LABEL, 0);
   ASM_GENERATE_INTERNAL_LABEL (loc_section_label, DEBUG_LOC_SECTION_LABEL, 0);
+}
+
+/* Set up for Dwarf output at the start of compilation.  */
+
+static void
+dwarf2out_init (const char *filename ATTRIBUTE_UNUSED)
+{
+  /* This option is currently broken, see (PR53118 and PR46102).  */
+  if (flag_eliminate_dwarf2_dups
+      && strstr (lang_hooks.name, "C++"))
+    {
+      warning (0, "-feliminate-dwarf2-dups is broken for C++, ignoring");
+      flag_eliminate_dwarf2_dups = 0;
+    }
+
+  /* Allocate the file_table.  */
+  file_table = hash_table<dwarf_file_hasher>::create_ggc (50);
+
+#ifndef DWARF2_LINENO_DEBUGGING_INFO
+  /* Allocate the decl_die_table.  */
+  decl_die_table = hash_table<decl_die_hasher>::create_ggc (10);
+
+  /* Allocate the decl_loc_table.  */
+  decl_loc_table = hash_table<decl_loc_hasher>::create_ggc (10);
+
+  /* Allocate the cached_dw_loc_list_table.  */
+  cached_dw_loc_list_table = hash_table<dw_loc_list_hasher>::create_ggc (10);
+
+  /* Allocate the initial hunk of the decl_scope_table.  */
+  vec_alloc (decl_scope_table, 256);
+
+  /* Allocate the initial hunk of the abbrev_die_table.  */
+  abbrev_die_table = ggc_cleared_vec_alloc<dw_die_ref>
+    (ABBREV_DIE_TABLE_INCREMENT);
+  abbrev_die_table_allocated = ABBREV_DIE_TABLE_INCREMENT;
+  /* Zero-th entry is allocated, but unused.  */
+  abbrev_die_table_in_use = 1;
+
+  /* Allocate the dwarf_proc_stack_usage_map.  */
+  dwarf_proc_stack_usage_map = new hash_map<dw_die_ref, int>;
+
+  /* Allocate the pubtypes and pubnames vectors.  */
+  vec_alloc (pubname_table, 32);
+  vec_alloc (pubtype_table, 32);
+
+  vec_alloc (incomplete_types, 64);
+
+  vec_alloc (used_rtx_array, 32);
 
   if (debug_info_level >= DINFO_LEVEL_VERBOSE)
     vec_alloc (macinfo_table, 64);
-
-  switch_to_section (text_section);
-  ASM_OUTPUT_LABEL (asm_out_file, text_section_label);
 #endif
 
   /* Make sure the line number table for .text always exists.  */
@@ -25705,6 +25675,17 @@ dwarf2out_init (const char *filename ATT
 static void
 dwarf2out_assembly_start (void)
 {
+#ifndef DWARF2_LINENO_DEBUGGING_INFO
+  ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_SECTION_LABEL, 0);
+  ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0);
+  ASM_GENERATE_INTERNAL_LABEL (cold_text_section_label,
+			       COLD_TEXT_SECTION_LABEL, 0);
+  ASM_GENERATE_INTERNAL_LABEL (cold_end_label, COLD_END_LABEL, 0);
+
+  switch_to_section (text_section);
+  ASM_OUTPUT_LABEL (asm_out_file, text_section_label);
+#endif
+
   if (HAVE_GAS_CFI_SECTIONS_DIRECTIVE
       && dwarf2out_do_cfi_asm ()
       && (!(flag_unwind_tables || flag_exceptions)
@@ -27858,6 +27839,9 @@ dwarf2out_finish (const char *)
   if (flag_eliminate_dwarf2_dups)
     break_out_includes (comp_unit_die ());
 
+  /* Initialize sections and labels used for actual assembler output.  */
+  init_sections_and_labels ();
+
   /* Traverse the DIE's and add sibling attributes to those DIE's that
      have children.  */
   add_sibling_attributes (comp_unit_die ());

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2016-09-28  8:00 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-27 10:24 [PATCH] Refactor section/label init for early LTO debug Dominique d'Humières
  -- strict thread matches above, loose matches on Subject: below --
2016-09-21 13:34 Richard Biener
2016-09-23 19:37 ` Jason Merrill
2016-09-27 10:23 ` Rainer Orth
2016-09-27 10:41   ` Richard Biener
2016-09-27 10:55     ` Rainer Orth
2016-09-28  8:04       ` Richard Biener
2016-09-28  8:37         ` Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).