summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErick Ochoa <erick.ochoa@theobroma-systems.com>2020-12-01 10:56:58 +0100
committerErick Ochoa <erick.ochoa@theobroma-systems.com>2020-12-01 10:56:58 +0100
commit1f7be4a633cf3046a3601dc1a24c4dbbc05bed9f (patch)
tree8d16c008b93bf6fb3ed30e813b7db0432eaf52ef
parentfcd9a82ac2aabbeefabb7d3961d7982c82398b76 (diff)
STL gcc record_field_offset_map2_t discovery of access unwanted behaviour
-rw-r--r--gcc/ipa-dfe.c5
-rw-r--r--gcc/ipa-dfe.h12
-rw-r--r--gcc/ipa-type-escape-analysis.h1
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