summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <rafael.espindola@gmail.com>2015-06-01 22:47:20 -0400
committerRafael Ávila de Espíndola <rafael.espindola@gmail.com>2015-06-01 22:47:20 -0400
commit400f89447b72cbd48a2fc8b016a09cbc4e590d81 (patch)
treeeeaaf15255ef967ae2120c96520ac8b5b755e096
parentd78b6450515fb163b00bc8874a15469df797ef17 (diff)
downloadbinutils-gdb-400f89447b72cbd48a2fc8b016a09cbc4e590d81.tar.gz
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.
-rw-r--r--gold/ChangeLog7
-rw-r--r--gold/merge.cc31
-rw-r--r--gold/merge.h16
3 files changed, 19 insertions, 35 deletions
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 <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.
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<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_;
};