From: Petr Machata Date: Wed, 2 Sep 2009 16:43:35 +0000 (+0200) Subject: Prune duplicate abbrevs X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=627875b9e5b02a7292d41f188ee2c441c7bd2aa8;p=thirdparty%2Felfutils.git Prune duplicate abbrevs --- diff --git a/libdw/c++/dwarf_output b/libdw/c++/dwarf_output index ce03c0b07..8e6a251be 100644 --- a/libdw/c++/dwarf_output +++ b/libdw/c++/dwarf_output @@ -735,12 +735,15 @@ namespace elfutils { typedef std::map forms_type; forms_type forms; // attribute->form - size_t code; // or 0 if not assigned yet + mutable size_t code; // or 0 if not assigned yet instance_type () : code (0) {} + bool operator < (instance_type const &other) const + { + return forms < other.forms; + } }; - typedef std::vector instance_vec; - typedef std::map instance_map; - instance_map _m_instances; + typedef std::set instance_set; + instance_set _m_instances; shape_info (debug_info_entry const &die) { @@ -1083,7 +1086,7 @@ namespace elfutils std::bitset<2> _m_with_sibling; unsigned int _m_uses; - typedef dwarf_output::shape_info::instance_vec::iterator abbrev_ptr_t; + typedef dwarf_output::shape_info::instance_set::iterator abbrev_ptr_t; typedef std::map abbrev_ptr_map; abbrev_ptr_map abbrev_ptr; diff --git a/libdw/c++/output-shape.cc b/libdw/c++/output-shape.cc index b539637c3..72a78a198 100644 --- a/libdw/c++/output-shape.cc +++ b/libdw/c++/output-shape.cc @@ -807,12 +807,6 @@ dwarf_output::shape_info::instantiate bool with_sibling = shape._m_with_sibling[true] && shape._m_has_children; bool without_sibling = shape._m_with_sibling[false] || !with_sibling; - // Prevent instance pointers from invalidation upon push_back. - if (without_sibling) - _m_instances[false].reserve (_m_users.size ()); - if (with_sibling) - _m_instances[true].reserve (_m_users.size ()); - struct { void operator () (instance_type &inst, @@ -894,16 +888,12 @@ dwarf_output::shape_info::instantiate die_info &i = col._m_unique.find (die)->second; if (without_sibling) - { - i.abbrev_ptr[false] = _m_instances[false].end (); - _m_instances[false].push_back (inst); - } + i.abbrev_ptr[false] = _m_instances.insert (inst).first; if (with_sibling) { handle_attrib (inst, die, DW_AT_sibling, addr_64, dwarf_64); - i.abbrev_ptr[true] = _m_instances[true].end (); - _m_instances[true].push_back (inst); + i.abbrev_ptr[true] = _m_instances.insert (inst).first; } } @@ -1010,14 +1000,10 @@ dwarf_output::writer::writer (dwarf_output_collector &col, it != _m_shapes.end (); ++it) { it->second.instantiate (it->first, col, addr_64, dwarf_64); - for (int i = 0; i < 2; ++i) - { - bool b = static_cast (i); - for (dwarf_output::shape_info::instance_vec::iterator jt - = it->second._m_instances[b].begin (); - jt != it->second._m_instances[b].end (); ++jt) - jt->code = ++code; - } + for (dwarf_output::shape_info::instance_set::iterator jt + = it->second._m_instances.begin (); + jt != it->second._m_instances.end (); ++jt) + jt->code = ++code; } } @@ -1026,14 +1012,10 @@ dwarf_output::writer::output_debug_abbrev (section_appender &appender) { for (shape_map::iterator it = _m_shapes.begin (); it != _m_shapes.end (); ++it) - for (int i = 0; i < 2; ++i) - { - bool b = static_cast (i); - for (dwarf_output::shape_info::instance_vec::iterator jt - = it->second._m_instances[b].begin (); - jt != it->second._m_instances[b].end (); ++jt) - it->second.build_data (it->first, *jt, appender); - } + for (dwarf_output::shape_info::instance_set::iterator jt + = it->second._m_instances.begin (); + jt != it->second._m_instances.end (); ++jt) + it->second.build_data (it->first, *jt, appender); appender.push_back (0); // terminate table }