summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErick Ochoa <erick.ochoa@theobroma-systems.com>2020-11-30 14:15:51 +0100
committerErick Ochoa <erick.ochoa@theobroma-systems.com>2020-11-30 14:15:51 +0100
commit93224ca74e929d3163fa1f6d468f2dbdab523e8e (patch)
tree492063bcd3015bd664b60094673621338f63f483
parent654541a30e74bfdb1c8d1910c6caca39f7e08674 (diff)
intra
-rw-r--r--gcc/ipa-field-reorder.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/gcc/ipa-field-reorder.c b/gcc/ipa-field-reorder.c
index ce767e232f0..11e5320b096 100644
--- a/gcc/ipa-field-reorder.c
+++ b/gcc/ipa-field-reorder.c
@@ -523,41 +523,56 @@ reorg_maps_t
get_reordered_field_maps (record_field_offset_map_t record_field_offset_map,
std::set<tree> to_modify)
{
+ hash_set<tree> to_modify2;
+ for (std::set<tree>::const_iterator i = to_modify.begin(), e = to_modify.end(); i !=e; ++i)
+ {
+ tree record = *i;
+ to_modify2.add(record);
+ }
+
type_stringifier stringifier;
TypeReconstructorFieldReordering reconstructor (record_field_offset_map,
"reorder");
- for (std::set<tree>::const_iterator i = to_modify.begin (),
- e = to_modify.end ();
+ for (hash_set<tree>::iterator i = to_modify2.begin (),
+ e = to_modify2.end ();
i != e; ++i)
{
tree record = *i;
reconstructor.walk (TYPE_MAIN_VARIANT (record));
}
- for (std::set<tree>::const_iterator i = to_modify.begin (),
- e = to_modify.end ();
+ for (hash_set<tree>::iterator i = to_modify2.begin (),
+ e = to_modify2.end ();
i != e; ++i)
{
tree record = *i;
reconstructor.walk (record);
}
+ typedef hash_map<tree, tree> reorg_record_map2_t;
+ reorg_record_map2_t map2;
reorg_record_map_t map = reconstructor.get_map ();
+
+ for (auto i = map.begin(), e = map.end(); i != e; ++i)
+ {
+ map2.put((*i).first, (*i).second);
+ }
+
reorg_field_map_t field_map = reconstructor.get_field_map ();
// Here, we are just making sure that we are not doing anything too crazy.
// Also, we found some types for which TYPE_CACHED_VALUES_P is not being
// rewritten. This is probably indicative of a bug in
// TypeReconstructorFieldReordering.
- for (std::map<tree, tree>::const_iterator i = map.begin (),
- e = map.end ();
+ for (reorg_record_map2_t::iterator i = map2.begin (),
+ e = map2.end ();
i != e; ++i)
{
- tree o_record = i->first;
+ tree o_record = (*i).first;
std::string o_name = stringifier.stringify (o_record);
log ("original: %s\n", o_name.c_str ());
- tree r_record = i->second;
+ tree r_record = (*i).second;
std::string r_name
= r_record ? stringifier.stringify (r_record) : std::string ("");
log ("modified: %s\n", r_name.c_str ());
@@ -569,15 +584,16 @@ get_reordered_field_maps (record_field_offset_map_t record_field_offset_map,
TYPE_CACHED_VALUES_P (_o_record) = false;
TYPE_CACHED_VALUES_P (m_record) = false;
- bool in_map = map.find (m_record) != map.end ();
+ bool in_map = map2.get (m_record);
if (!in_map)
continue;
- tree mm_record = map[m_record];
+ tree mm_record = *map2.get(m_record);
// Info: I think this is no longer needed...
// Please verify
TYPE_MAIN_VARIANT (r_record) = mm_record;
}
+ // TODO: change this to return the GCC types...
return std::make_pair (map, field_map);
}