summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErick Ochoa <erick.ochoa@theobroma-systems.com>2020-11-30 16:45:11 +0100
committerErick Ochoa <erick.ochoa@theobroma-systems.com>2020-11-30 16:45:11 +0100
commitedfb9cc0ac6949afb05fc4e7677b48d427b436fe (patch)
treecc47b1c6a244cb8f9aa42a69a1b6d32ce6b2536b
parent802f9273ddbb7c28ee56b2453cbaa08ab34d7a29 (diff)
almost done with type_reconstructor
-rw-r--r--gcc/ipa-dfe.c18
-rw-r--r--gcc/ipa-dfe.h7
-rw-r--r--gcc/ipa-field-reorder.c10
3 files changed, 24 insertions, 11 deletions
diff --git a/gcc/ipa-dfe.c b/gcc/ipa-dfe.c
index 7f2dd2612db..d60444c54c9 100644
--- a/gcc/ipa-dfe.c
+++ b/gcc/ipa-dfe.c
@@ -225,7 +225,12 @@ get_types_replacement (record_field_offset_map_t record_field_offset_map,
//reorg_record_map_t map = reconstructor.get_map ();
reorg_record_map2_t *map2 = reconstructor.get_map2 ();
- reorg_field_map_t field_map = reconstructor.get_field_map ();
+ reorg_field_map_t field_map;
+ reorg_field_map2_t *field_map2 = reconstructor.get_field_map2 ();
+ for (reorg_field_map2_t::iterator i = field_map2->begin(), e = field_map2->end(); i != e; ++i)
+ {
+ field_map.insert({(*i).first, (*i).second});
+ }
std::map<tree, tree> map;
// Here, we are just making sure that we are not doing anything too crazy.
@@ -362,10 +367,11 @@ type_reconstructor::get_map2 ()
/*
* old FIELD_DECL -> new FIELD_DECL.
*/
-reorg_field_map_t
-type_reconstructor::get_field_map ()
+
+reorg_field_map2_t*
+type_reconstructor::get_field_map2 ()
{
- return _reorg_fields;
+ return _reorg_fields2;
}
void
@@ -741,10 +747,10 @@ type_reconstructor::_walk_field_post (tree t)
// Put the field into the vector
field_tuple_list_t &field_tuple_list = field_list_stack.top ();
field_tuple_list.push_back (tuple);
- const bool already_has_field = _reorg_fields.find (t) != _reorg_fields.end ();
+ const bool already_has_field = _reorg_fields2->get (t);
if (already_has_field)
return;
- _reorg_fields[t] = std::make_pair (copy, can_field_be_deleted);
+ _reorg_fields2->put(t, std::make_pair (copy, can_field_be_deleted));
}
// Relayout parameters
diff --git a/gcc/ipa-dfe.h b/gcc/ipa-dfe.h
index 548dd59f1c2..f99837b9da2 100644
--- a/gcc/ipa-dfe.h
+++ b/gcc/ipa-dfe.h
@@ -63,6 +63,7 @@ typedef hash_map<tree, tree> reorg_record_map2_t;
/* Map RECORD_TYPE -> (FIELD_DECL -> delete). */
typedef std::map<tree, std::pair<tree, bool> > reorg_field_map_t;
+typedef hash_map<tree, std::pair<tree, bool> > reorg_field_map2_t;
/* Class used to create new types derived from types that have fields
* that can be deleted. */
@@ -73,12 +74,14 @@ public:
: _records (records), _suffix (suffix)
{
_reorg_map2 = new reorg_record_map2_t;
+ _reorg_fields2 = new reorg_field_map2_t;
};
~type_reconstructor()
{
// I think we need this a little bit longer...
// but I don't think there is a copy constructor for this...
delete _reorg_map2;
+ delete _reorg_fields2;
}
/* Whether a type has already been modified. */
@@ -88,7 +91,7 @@ public:
reorg_record_map2_t *get_map2 ();
/* Final result for field map. */
- reorg_field_map_t get_field_map ();
+ reorg_field_map2_t *get_field_map2 ();
/* Map RECORD_TYPE -> is_modified. */
typedef std::map<tree, bool> is_modified_map_t;
@@ -125,7 +128,7 @@ protected:
reorg_record_map2_t *_reorg_map2;
// old FIELD_DECL -> new FIELD_DECL
- reorg_field_map_t _reorg_fields;
+ reorg_field_map2_t *_reorg_fields2;
// old RECORD_TYPE -> is_modified
is_modified_map_t modified_map;
diff --git a/gcc/ipa-field-reorder.c b/gcc/ipa-field-reorder.c
index 751c986c380..7a35db6c3b4 100644
--- a/gcc/ipa-field-reorder.c
+++ b/gcc/ipa-field-reorder.c
@@ -329,8 +329,7 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
unsigned haystack_i = bitpos_of_field (field);
if (haystack_i == to_find_i)
{
- _reorg_fields[field]
- = std::make_pair (tree_to_tree (to_find), false);
+ _reorg_fields2->put(field, std::make_pair (tree_to_tree (to_find), false));
log ("substituting %s for %s\n", to_find_str, haystack);
}
}
@@ -554,7 +553,12 @@ get_reordered_field_maps (record_field_offset_map_t record_field_offset_map,
reorg_record_map2_t *map2 = reconstructor.get_map2 ();
std::map<tree, tree> map;
- reorg_field_map_t field_map = reconstructor.get_field_map ();
+ reorg_field_map2_t *field_map2 = reconstructor.get_field_map2 ();
+ reorg_field_map_t field_map;
+ for (reorg_field_map2_t::iterator i = field_map2->begin(), e = field_map2->end(); i != e; ++i)
+ {
+ field_map.insert({(*i).first, (*i).second});
+ }
// 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