Message ID | alpine.LSU.2.11.1609211512420.26629@t29.fhfr.qr |
---|---|
State | New |
Headers | show |
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 ());
Hi Richard, > 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. this patch introduced many pch assembly comparison failures on Solaris (both sparc and x86, 32 and 64-bit, /bin/as only), like FAIL: gcc.dg/pch/common-1.c -O3 -g assembly comparison FAIL: gcc.dg/pch/common-1.c -O0 -g assembly comparison gcc.log shows this diff: < .long .Letext0 > .long While the .Letext0 label is still in the assembly output, it isn't referenced inside .debug_line, as can be seen in the diff. Unlike the gas case, with as HAVE_AS_DWARF2_DEBUG_LINE isn't defined. Rainer
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 ());