diff options
author | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-11-30 16:45:11 +0100 |
---|---|---|
committer | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-11-30 16:45:11 +0100 |
commit | edfb9cc0ac6949afb05fc4e7677b48d427b436fe (patch) | |
tree | cc47b1c6a244cb8f9aa42a69a1b6d32ce6b2536b | |
parent | 802f9273ddbb7c28ee56b2453cbaa08ab34d7a29 (diff) |
almost done with type_reconstructor
-rw-r--r-- | gcc/ipa-dfe.c | 18 | ||||
-rw-r--r-- | gcc/ipa-dfe.h | 7 | ||||
-rw-r--r-- | gcc/ipa-field-reorder.c | 10 |
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 |