From a99291e49112eb7f2a8a39beef4a55b78e4c5141 Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Sat, 13 Nov 2010 12:50:37 +0000 Subject: [PATCH] don't emit debug sections until they are required gcc: * dwarf2out.c (macinfo_entry): New struct. (output_comp_unit): Emit the section start label here and flag that we will emit an info section. (dwarf2out_start_source_file): Save data in a macinfo entry rather than emitting directly. (dwarf2out_end_source_file): Likewise. (dwarf2out_define): Likewise. (dwarf2out_undef): Likewise. (output_macinfo): New. (dwarf2out_init): Do not emit debug section switches here, allocate a vec for macinfo, when required. (dwarf2out_finish): First switch to debug_abbrev_section here. debug_line_section, debug_macinfo_section, Likewise. Check that the pubtypes table has at least one unpruned entry before trying to emit it. From-SVN: r166704 --- gcc/ChangeLog | 18 +++++++ gcc/dwarf2out.c | 163 +++++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 143 insertions(+), 38 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4a036dc3290..b093e5461de 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,21 @@ +2010-11-13 Iain Sandoe + + * dwarf2out.c (macinfo_entry): New struct. + (output_comp_unit): Emit the section start label here and flag that we + will emit an info section. + (dwarf2out_start_source_file): Save data in a macinfo entry rather than + emitting directly. + (dwarf2out_end_source_file): Likewise. + (dwarf2out_define): Likewise. + (dwarf2out_undef): Likewise. + (output_macinfo): New. + (dwarf2out_init): Do not emit debug section switches here, allocate a + vec for macinfo, when required. + (dwarf2out_finish): First switch to debug_abbrev_section here. + debug_line_section, debug_macinfo_section, Likewise. + Check that the pubtypes table has at least one unpruned entry before + trying to emit it. + 2010-10-30 Paolo Bonzini PR c/20385 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 9bb569bbe2e..144c2862422 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -5760,6 +5760,18 @@ struct GTY(()) dw_ranges_struct { int num; }; +/* A structure to hold a macinfo entry. */ + +typedef struct GTY(()) macinfo_struct { + unsigned HOST_WIDE_INT code; + unsigned HOST_WIDE_INT lineno; + const char *info; +} +macinfo_entry; + +DEF_VEC_O(macinfo_entry); +DEF_VEC_ALLOC_O(macinfo_entry, gc); + struct GTY(()) dw_ranges_by_label_struct { const char *begin; const char *end; @@ -5989,6 +6001,10 @@ static GTY(()) unsigned separate_line_info_table_in_use; line_info_table. */ #define LINE_INFO_TABLE_INCREMENT 1024 +/* A flag to tell pubnames/types export if there is an info section to + refer to. */ +static bool info_section_emitted; + /* A pointer to the base of a table that contains a list of publicly accessible names. */ static GTY (()) VEC (pubname_entry, gc) * pubname_table; @@ -5997,6 +6013,10 @@ static GTY (()) VEC (pubname_entry, gc) * pubname_table; accessible types. */ static GTY (()) VEC (pubname_entry, gc) * pubtype_table; +/* A pointer to the base of a table that contains a list of macro + defines/undefines (and file start/end markers). */ +static GTY (()) VEC (macinfo_entry, gc) * macinfo_table; + /* Array of dies for which we should generate .debug_arange info. */ static GTY((length ("arange_table_allocated"))) dw_die_ref *arange_table; @@ -11263,7 +11283,11 @@ output_comp_unit (dw_die_ref die, int output_if_empty) switch_to_section (get_section (secname, SECTION_DEBUG, NULL)); } else - switch_to_section (debug_info_section); + { + switch_to_section (debug_info_section); + ASM_OUTPUT_LABEL (asm_out_file, debug_info_section_label); + info_section_emitted = true; + } /* Output debugging information. */ output_compilation_unit_header (); @@ -21666,14 +21690,11 @@ dwarf2out_start_source_file (unsigned int lineno, const char *filename) if (debug_info_level >= DINFO_LEVEL_VERBOSE) { - int file_num = maybe_emit_file (lookup_filename (filename)); - - switch_to_section (debug_macinfo_section); - dw2_asm_output_data (1, DW_MACINFO_start_file, "Start new file"); - dw2_asm_output_data_uleb128 (lineno, "Included from line number %d", - lineno); - - dw2_asm_output_data_uleb128 (file_num, "file %s", filename); + macinfo_entry e; + e.code = DW_MACINFO_start_file; + e.lineno = lineno; + e.info = xstrdup (filename); + VEC_safe_push (macinfo_entry, gc, macinfo_table, &e); } } @@ -21688,8 +21709,11 @@ dwarf2out_end_source_file (unsigned int lineno ATTRIBUTE_UNUSED) if (debug_info_level >= DINFO_LEVEL_VERBOSE) { - switch_to_section (debug_macinfo_section); - dw2_asm_output_data (1, DW_MACINFO_end_file, "End file"); + macinfo_entry e; + e.code = DW_MACINFO_end_file; + e.lineno = lineno; + e.info = NULL; + VEC_safe_push (macinfo_entry, gc, macinfo_table, &e); } } @@ -21703,10 +21727,11 @@ dwarf2out_define (unsigned int lineno ATTRIBUTE_UNUSED, { if (debug_info_level >= DINFO_LEVEL_VERBOSE) { - switch_to_section (debug_macinfo_section); - dw2_asm_output_data (1, DW_MACINFO_define, "Define macro"); - dw2_asm_output_data_uleb128 (lineno, "At line number %d", lineno); - dw2_asm_output_nstring (buffer, -1, "The macro"); + macinfo_entry e; + e.code = DW_MACINFO_define; + e.lineno = lineno; + e.info = xstrdup (buffer);; + VEC_safe_push (macinfo_entry, gc, macinfo_table, &e); } } @@ -21720,10 +21745,58 @@ dwarf2out_undef (unsigned int lineno ATTRIBUTE_UNUSED, { if (debug_info_level >= DINFO_LEVEL_VERBOSE) { - switch_to_section (debug_macinfo_section); - dw2_asm_output_data (1, DW_MACINFO_undef, "Undefine macro"); - dw2_asm_output_data_uleb128 (lineno, "At line number %d", lineno); - dw2_asm_output_nstring (buffer, -1, "The macro"); + macinfo_entry e; + e.code = DW_MACINFO_undef; + e.lineno = lineno; + e.info = xstrdup (buffer);; + VEC_safe_push (macinfo_entry, gc, macinfo_table, &e); + } +} + +static void +output_macinfo (void) +{ + unsigned i; + unsigned long length = VEC_length (macinfo_entry, macinfo_table); + macinfo_entry *ref; + + if (! length) + return; + + for (i = 0; VEC_iterate (macinfo_entry, macinfo_table, i, ref); i++) + { + switch (ref->code) + { + case DW_MACINFO_start_file: + { + int file_num = maybe_emit_file (lookup_filename (ref->info)); + dw2_asm_output_data (1, DW_MACINFO_start_file, "Start new file"); + dw2_asm_output_data_uleb128 + (ref->lineno, "Included from line number %lu", + (unsigned long)ref->lineno); + dw2_asm_output_data_uleb128 (file_num, "file %s", ref->info); + } + break; + case DW_MACINFO_end_file: + dw2_asm_output_data (1, DW_MACINFO_end_file, "End file"); + break; + case DW_MACINFO_define: + dw2_asm_output_data (1, DW_MACINFO_define, "Define macro"); + dw2_asm_output_data_uleb128 (ref->lineno, "At line number %lu", + (unsigned long)ref->lineno); + dw2_asm_output_nstring (ref->info, -1, "The macro"); + break; + case DW_MACINFO_undef: + dw2_asm_output_data (1, DW_MACINFO_undef, "Undefine macro"); + dw2_asm_output_data_uleb128 (ref->lineno, "At line number %lu", + (unsigned long)ref->lineno); + dw2_asm_output_nstring (ref->info, -1, "The macro"); + break; + default: + fprintf (asm_out_file, "%s unrecognized macinfo code %lu\n", + ASM_COMMENT_START, (unsigned long)ref->code); + break; + } } } @@ -21815,20 +21888,11 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED) DEBUG_LINE_SECTION_LABEL, 0); ASM_GENERATE_INTERNAL_LABEL (ranges_section_label, DEBUG_RANGES_SECTION_LABEL, 0); - switch_to_section (debug_abbrev_section); - ASM_OUTPUT_LABEL (asm_out_file, abbrev_section_label); - switch_to_section (debug_info_section); - ASM_OUTPUT_LABEL (asm_out_file, debug_info_section_label); - switch_to_section (debug_line_section); - ASM_OUTPUT_LABEL (asm_out_file, debug_line_section_label); + ASM_GENERATE_INTERNAL_LABEL (macinfo_section_label, + DEBUG_MACINFO_SECTION_LABEL, 0); if (debug_info_level >= DINFO_LEVEL_VERBOSE) - { - switch_to_section (debug_macinfo_section); - ASM_GENERATE_INTERNAL_LABEL (macinfo_section_label, - DEBUG_MACINFO_SECTION_LABEL, 0); - ASM_OUTPUT_LABEL (asm_out_file, macinfo_section_label); - } + macinfo_table = VEC_alloc (macinfo_entry, gc, 64); switch_to_section (text_section); ASM_OUTPUT_LABEL (asm_out_file, text_section_label); @@ -23042,11 +23106,12 @@ dwarf2out_finish (const char *filename) htab_delete (comdat_type_table); /* Output the main compilation unit if non-empty or if .debug_macinfo - has been emitted. */ + will be emitted. */ output_comp_unit (comp_unit_die (), debug_info_level >= DINFO_LEVEL_VERBOSE); /* Output the abbreviation table. */ switch_to_section (debug_abbrev_section); + ASM_OUTPUT_LABEL (asm_out_file, abbrev_section_label); output_abbrev_section (); /* Output location list section if necessary. */ @@ -23063,6 +23128,7 @@ dwarf2out_finish (const char *filename) /* Output public names table if necessary. */ if (!VEC_empty (pubname_entry, pubname_table)) { + gcc_assert (info_section_emitted); switch_to_section (debug_pubnames_section); output_pubnames (pubname_table); } @@ -23073,8 +23139,27 @@ dwarf2out_finish (const char *filename) simply won't look for the section. */ if (!VEC_empty (pubname_entry, pubtype_table)) { - switch_to_section (debug_pubtypes_section); - output_pubnames (pubtype_table); + bool empty = false; + + if (flag_eliminate_unused_debug_types) + { + /* The pubtypes table might be emptied by pruning unused items. */ + unsigned i; + pubname_ref p; + empty = true; + FOR_EACH_VEC_ELT (pubname_entry, pubtype_table, i, p) + if (p->die->die_offset != 0) + { + empty = false; + break; + } + } + if (!empty) + { + gcc_assert (info_section_emitted); + switch_to_section (debug_pubtypes_section); + output_pubnames (pubtype_table); + } } /* Output direct and virtual call tables if necessary. */ @@ -23111,16 +23196,18 @@ dwarf2out_finish (const char *filename) .debug_info section. IRIX 6.5 `nm' will then complain when examining the file. This is done late so that any filenames used by the debug_info section are marked as 'used'. */ + switch_to_section (debug_line_section); + ASM_OUTPUT_LABEL (asm_out_file, debug_line_section_label); if (! DWARF2_ASM_LINE_DEBUG_INFO) - { - switch_to_section (debug_line_section); - output_line_info (); - } + output_line_info (); /* Have to end the macro section. */ if (debug_info_level >= DINFO_LEVEL_VERBOSE) { switch_to_section (debug_macinfo_section); + ASM_OUTPUT_LABEL (asm_out_file, macinfo_section_label); + if (!VEC_empty (macinfo_entry, macinfo_table)) + output_macinfo (); dw2_asm_output_data (1, 0, "End compilation unit"); } -- 2.11.4.GIT