From: Rafael Ávila de Espíndola Date: Tue, 2 Jun 2015 02:47:20 +0000 (-0400) Subject: Use a std::vector instead of a std::map to hold Input_merge_map. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=400f89447b72cbd48a2fc8b016a09cbc4e590d81;p=binutils-gdb.git Use a std::vector instead of a std::map to hold Input_merge_map. A std::map is hardly the best data structure for a small map from small integers. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index 64ce33f5a8e..8e08d3babe8 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,10 @@ +2015-06-01 Rafael Ávila de Espíndola + + * 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> instead of + a std::map. Remove first_shnum_, first_map_, second_shnum_, second_map_. + 2015-05-16 Alan Modra * reloc.cc (Sized_relobj_file::find_functions): Use function_location. diff --git a/gold/merge.cc b/gold/merge.cc index d3953125005..50d13aff3eb 100644 --- a/gold/merge.cc +++ b/gold/merge.cc @@ -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; } diff --git a/gold/merge.h b/gold/merge.h index 54caed8accf..53846ee76eb 100644 --- a/gold/merge.h +++ b/gold/merge.h @@ -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 Section_merge_maps; + typedef std::vector > + 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_; };