diff options
Diffstat (limited to 'gcc48-rh1278872.patch')
-rw-r--r-- | gcc48-rh1278872.patch | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/gcc48-rh1278872.patch b/gcc48-rh1278872.patch new file mode 100644 index 0000000..ce82c3d --- /dev/null +++ b/gcc48-rh1278872.patch @@ -0,0 +1,78 @@ +2013-07-25 Sterling Augustine <saugustine@google.com> + + * dwarf2out.c (size_of_pubnames): Move code to... + (include_pubname_in_output): ...here. New. + (output_pubnames): Call include_pubname_in_output. Move assertion. + +--- gcc/dwarf2out.c (revision 201254) ++++ gcc/dwarf2out.c (revision 201255) +@@ -7806,6 +7806,30 @@ unmark_all_dies (dw_die_ref die) + unmark_all_dies (AT_ref (a)); + } + ++/* Calculate if the entry should appear in the final output file. It may be ++ from a pruned a type. */ ++ ++static bool ++include_pubname_in_output (vec<pubname_entry, va_gc> *table, pubname_entry *p) ++{ ++ if (table == pubname_table) ++ { ++ /* Enumerator names are part of the pubname table, but the parent ++ DW_TAG_enumeration_type die may have been pruned. Don't output ++ them if that is the case. */ ++ if (p->die->die_tag == DW_TAG_enumerator && !p->die->die_mark) ++ return false; ++ ++ /* Everything else in the pubname table is included. */ ++ return true; ++ } ++ ++ /* The pubtypes table shouldn't include types that have been ++ pruned. */ ++ return (p->die->die_offset != 0 ++ || !flag_eliminate_unused_debug_types); ++} ++ + /* Return the size of the .debug_pubnames or .debug_pubtypes table + generated for the compilation unit. */ + +@@ -7818,9 +7842,7 @@ size_of_pubnames (vec<pubname_entry, va_ + + size = DWARF_PUBNAMES_HEADER_SIZE; + FOR_EACH_VEC_ELT (*names, i, p) +- if (names != pubtype_table +- || p->die->die_offset != 0 +- || !flag_eliminate_unused_debug_types) ++ if (include_pubname_in_output (names, p)) + size += strlen (p->name) + DWARF_OFFSET_SIZE + 1; + + size += DWARF_OFFSET_SIZE; +@@ -8999,22 +9021,14 @@ output_pubnames (vec<pubname_entry, va_g + + FOR_EACH_VEC_ELT (*names, i, pub) + { +- /* Enumerator names are part of the pubname table, but the parent +- DW_TAG_enumeration_type die may have been pruned. Don't output +- them if that is the case. */ +- if (pub->die->die_tag == DW_TAG_enumerator && !pub->die->die_mark) +- continue; +- +- /* We shouldn't see pubnames for DIEs outside of the main CU. */ +- if (names == pubname_table) +- gcc_assert (pub->die->die_mark); +- +- if (names != pubtype_table +- || pub->die->die_offset != 0 +- || !flag_eliminate_unused_debug_types) ++ if (include_pubname_in_output (names, pub)) + { + dw_offset die_offset = pub->die->die_offset; + ++ /* We shouldn't see pubnames for DIEs outside of the main CU. */ ++ if (names == pubname_table) ++ gcc_assert (pub->die->die_mark); ++ + /* If we're putting types in their own .debug_types sections, + the .debug_pubtypes table will still point to the compile + unit (not the type unit), so we want to use the offset of |