Use a std::vector instead of a std::map to hold Input_merge_map.
authorRafael Ávila de Espíndola <rafael.espindola@gmail.com>
Tue, 2 Jun 2015 02:47:20 +0000 (22:47 -0400)
committerRafael Ávila de Espíndola <rafael.espindola@gmail.com>
Tue, 2 Jun 2015 02:47:20 +0000 (22:47 -0400)
A std::map is hardly the best data structure for a small map from small
integers.

gold/ChangeLog
gold/merge.cc
gold/merge.h

index 64ce33f5a8e3d23fa17fd2a435b876ad5ac049ed..8e08d3babe89007a0f24b4cbf5318def54e501fe 100644 (file)
@@ -1,3 +1,10 @@
+2015-06-01  Rafael Ávila de Espíndola <rafael.espindola@gmail.com>
+
+       * merge.cc (get_input_merge_map): Update for data structure change.
+       (get_or_make_input_merge_map): Update for data structure change.
+       * merge.h (Object_merge_map): Use a std::vector<std::pair>> instead of
+       a std::map. Remove first_shnum_, first_map_, second_shnum_, second_map_.
+
 2015-05-16  Alan Modra  <amodra@gmail.com>
 
        * reloc.cc (Sized_relobj_file::find_functions): Use function_location.
index d3953125005c87693dca3d4819a997b730bea120..50d13aff3eb101d9d4894167e8713b8004673056 100644 (file)
@@ -49,13 +49,13 @@ const Object_merge_map::Input_merge_map*
 Object_merge_map::get_input_merge_map(unsigned int shndx) const
 {
   gold_assert(shndx != -1U);
-  if (shndx == this->first_shnum_)
-    return &this->first_map_;
-  if (shndx == this->second_shnum_)
-    return &this->second_map_;
-  Section_merge_maps::const_iterator p = this->section_merge_maps_.find(shndx);
-  if (p != this->section_merge_maps_.end())
-    return p->second;
+  const Section_merge_maps &maps = this->section_merge_maps_;
+  for (Section_merge_maps::const_iterator i = maps.begin(), e = maps.end();
+       i != e; ++i)
+    {
+      if (i->first == shndx)
+       return i->second;
+    }
   return NULL;
 }
 
@@ -73,23 +73,10 @@ Object_merge_map::get_or_make_input_merge_map(
       return map;
     }
 
-  // We need to create a new entry.
-  if (this->first_shnum_ == -1U)
-    {
-      this->first_shnum_ = shndx;
-      this->first_map_.output_data = output_data;
-      return &this->first_map_;
-    }
-  if (this->second_shnum_ == -1U)
-    {
-      this->second_shnum_ = shndx;
-      this->second_map_.output_data = output_data;
-      return &this->second_map_;
-    }
-
   Input_merge_map* new_map = new Input_merge_map;
   new_map->output_data = output_data;
-  this->section_merge_maps_[shndx] = new_map;
+  Section_merge_maps &maps = this->section_merge_maps_;
+  maps.push_back(std::make_pair(shndx, new_map));
   return new_map;
 }
 
index 54caed8accfa5b7c9f92e6eac11edb80dd1d2a12..53846ee76eb87a01a57d11b7eaf4b763dd9dcf22 100644 (file)
@@ -42,9 +42,7 @@ class Object_merge_map
 {
  public:
   Object_merge_map()
-    : first_shnum_(-1U), first_map_(),
-      second_shnum_(-1U), second_map_(),
-      section_merge_maps_()
+    : section_merge_maps_()
   { }
 
   ~Object_merge_map();
@@ -152,7 +150,8 @@ class Object_merge_map
   };
 
   // Map input section indices to merge maps.
-  typedef std::map<unsigned int, Input_merge_map*> Section_merge_maps;
+  typedef std::vector<std::pair<unsigned int, Input_merge_map*> >
+      Section_merge_maps;
 
   // Return a pointer to the Input_merge_map to use for the input
   // section SHNDX, or NULL.
@@ -165,15 +164,6 @@ class Object_merge_map
                                              this)->get_input_merge_map(shndx));
   }
 
-  // Any given object file will normally only have a couple of input
-  // sections with mergeable contents.  So we keep the first two input
-  // section numbers inline, and push any further ones into a map.  A
-  // value of -1U in first_shnum_ or second_shnum_ means that we don't
-  // have a corresponding entry.
-  unsigned int first_shnum_;
-  Input_merge_map first_map_;
-  unsigned int second_shnum_;
-  Input_merge_map second_map_;
   Section_merge_maps section_merge_maps_;
 };
 
This page took 0.03339 seconds and 4 git commands to generate.