diff options
author | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-12-01 10:56:58 +0100 |
---|---|---|
committer | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-12-01 10:56:58 +0100 |
commit | 1f7be4a633cf3046a3601dc1a24c4dbbc05bed9f (patch) | |
tree | 8d16c008b93bf6fb3ed30e813b7db0432eaf52ef | |
parent | fcd9a82ac2aabbeefabb7d3961d7982c82398b76 (diff) |
STL gcc record_field_offset_map2_t discovery of access unwanted behaviour
-rw-r--r-- | gcc/ipa-dfe.c | 5 | ||||
-rw-r--r-- | gcc/ipa-dfe.h | 12 | ||||
-rw-r--r-- | gcc/ipa-type-escape-analysis.h | 1 |
3 files changed, 14 insertions, 4 deletions
diff --git a/gcc/ipa-dfe.c b/gcc/ipa-dfe.c index e942a27b477..2f2174d8cf4 100644 --- a/gcc/ipa-dfe.c +++ b/gcc/ipa-dfe.c @@ -726,14 +726,15 @@ type_reconstructor::_walk_field_post (tree t) // What record does this field belongs to? tree record = for_reference.top (); - field_offsets_t field_offsets = _records[record]; + field_offsets_t *field_offsets = _records2->get(record); + if (!field_offsets) return; // What's the field offset? unsigned f_byte_offset = tree_to_uhwi (DECL_FIELD_OFFSET (t)); unsigned f_bit_offset = tree_to_uhwi (DECL_FIELD_BIT_OFFSET (t)); unsigned f_offset = 8 * f_byte_offset + f_bit_offset; const bool can_field_be_deleted - = field_offsets.find (f_offset) != field_offsets.end (); + = field_offsets->find (f_offset) != field_offsets->end (); if (can_field_be_deleted) mark_all_pointing_here_as_modified (); tree original_type = TREE_TYPE (t); diff --git a/gcc/ipa-dfe.h b/gcc/ipa-dfe.h index f59b7e97dfc..6fc7128c9cf 100644 --- a/gcc/ipa-dfe.h +++ b/gcc/ipa-dfe.h @@ -71,11 +71,17 @@ class type_reconstructor : public type_walker { public: type_reconstructor (record_field_offset_map_t records, const char *suffix) - : _records (records), _suffix (suffix) + : _suffix (suffix) { _reorg_map2 = new reorg_record_map2_t; _reorg_fields2 = new reorg_field_map2_t; modified_map2 = new is_modified_map2_t; + _records2 = new record_field_offset_map2_t; + + for (auto i = records.begin(), e = records.end(); i != e; ++i) + { + _records2->put(i->first, i->second); + } }; ~type_reconstructor() { @@ -84,6 +90,7 @@ public: delete _reorg_map2; delete _reorg_fields2; delete modified_map2; + delete _records2; } /* Whether a type has already been modified. */ @@ -118,7 +125,8 @@ protected: typedef std::stack<field_tuple_list_t> field_tuple_list_stack_t; // Which records can be modified. - record_field_offset_map_t _records; + //record_field_offset_map_t _records; + record_field_offset_map2_t* _records2; // The new suffix const char *_suffix; diff --git a/gcc/ipa-type-escape-analysis.h b/gcc/ipa-type-escape-analysis.h index 304d5d43666..dc30725b4a7 100644 --- a/gcc/ipa-type-escape-analysis.h +++ b/gcc/ipa-type-escape-analysis.h @@ -1247,6 +1247,7 @@ private: typedef std::set<unsigned> field_offsets_t; typedef std::map<tree, field_offsets_t> record_field_offset_map_t; +typedef hash_map<tree, field_offsets_t> record_field_offset_map2_t; // Partition types into escaping or non escaping sets. tpartitions_t |