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]

Re: [PATCH] Refactor section/label init for early LTO debug


OK.

On Wed, Sep 21, 2016 at 9:19 AM, Richard Biener <rguenther@suse.de> wrote:
>
> 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);
>  }
>
> -/* 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 ());


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