]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
Prune duplicate abbrevs
authorPetr Machata <pmachata@redhat.com>
Wed, 2 Sep 2009 16:43:35 +0000 (18:43 +0200)
committerPetr Machata <pmachata@redhat.com>
Wed, 2 Sep 2009 16:43:35 +0000 (18:43 +0200)
libdw/c++/dwarf_output
libdw/c++/output-shape.cc

index ce03c0b072d900421568f2443d9aba73ff49ed96..8e6a251be4d64aa063d5eee8e5b815a3877cc99f 100644 (file)
@@ -735,12 +735,15 @@ namespace elfutils
       {
        typedef std::map<int, int> 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_type> instance_vec;
-      typedef std::map<bool, instance_vec> instance_map;
-      instance_map _m_instances;
+      typedef std::set<instance_type> 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<bool, abbrev_ptr_t> abbrev_ptr_map;
     abbrev_ptr_map abbrev_ptr;
 
index b539637c3701d89b3f5cc6fd646d409cc8698d90..72a78a1983c84266cfb6ec6e92d283bd1256fe8b 100644 (file)
@@ -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<bool> (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<bool> (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
 }