summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErick Ochoa <erick.ochoa@theobroma-systems.com>2020-12-03 13:11:18 +0100
committerErick Ochoa <erick.ochoa@theobroma-systems.com>2020-12-03 13:11:18 +0100
commit4d0db073fc59bcf7d7171278662610b2596ad3e5 (patch)
treefbfd65b5ce118f6faef4e0b3887c0e8b55ab2630
parentebc0425ea232cb739a7d86d97b4ededcf9f612f1 (diff)
wip
-rw-r--r--gcc/ipa-dfe.c21
-rw-r--r--gcc/ipa-dfe.h16
-rw-r--r--gcc/ipa-field-reorder.c16
-rw-r--r--gcc/ipa-type-escape-analysis.h3
4 files changed, 43 insertions, 13 deletions
diff --git a/gcc/ipa-dfe.c b/gcc/ipa-dfe.c
index ccaf9a64007..93c3c40d202 100644
--- a/gcc/ipa-dfe.c
+++ b/gcc/ipa-dfe.c
@@ -198,7 +198,19 @@ get_types_replacement (record_field_offset_map_t record_field_offset_map,
{
type_stringifier stringifier;
- type_reconstructor reconstructor (record_field_offset_map, "reorg");
+ record_field_offset_map3_t record_field_offset_map2;
+ for (auto i = record_field_offset_map.begin(), e = record_field_offset_map.end(); i != e; ++i)
+ {
+ field_offsets2_t _second2;
+ std::set<unsigned> _second1 = i->second;
+ for (auto j = _second1.begin(), f = _second1.end(); j != f; ++j)
+ {
+ _second2.add (*j);
+ }
+ record_field_offset_map2.insert({i->first, _second2});
+ }
+
+ type_reconstructor reconstructor (record_field_offset_map2, "reorg");
for (hash_set<tree>::iterator i = to_modify.begin (),
e = to_modify.end ();
i != e; ++i)
@@ -718,15 +730,16 @@ type_reconstructor::_walk_field_post (tree t)
// What record does this field belongs to?
tree record = for_reference2.last ();
- field_offsets_t *field_offsets = _records2->get(record);
- if (!field_offsets) return;
+ field_offsets2_t **field_offsets_ptr = _records2->get(record);
+ if (!field_offsets_ptr) return;
+ field_offsets2_t *field_offsets = *field_offsets_ptr;
// 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->contains (f_offset);
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 fdd9a2783e6..26630713f40 100644
--- a/gcc/ipa-dfe.h
+++ b/gcc/ipa-dfe.h
@@ -70,23 +70,26 @@ typedef hash_map<tree, std::pair<tree, bool> > reorg_field_map2_t;
class type_reconstructor : public type_walker
{
public:
- type_reconstructor (record_field_offset_map_t records, const char *suffix)
+ type_reconstructor (record_field_offset_map3_t records, const char *suffix)
: _suffix (suffix), in_progress2(vNULL), for_reference2(vNULL), field_list2_stack2 (vNULL)
{
_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;
+ _records2 = new record_field_offset_map4_t;
for (auto i = records.begin(), e = records.end(); i != e; ++i)
{
- _records2->put(i->first, i->second);
+ field_offsets2_t *new_second = new field_offsets2_t;
+ for (auto j = i->second.begin(), f = i->second.end(); j != f; ++j)
+ {
+ new_second->add (*j);
+ }
+ _records2->put(i->first, new_second);
}
};
~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;
delete modified_map2;
@@ -126,8 +129,7 @@ protected:
typedef vec<field_tuple_list2_t> field_tuple_list2_stack2_t;
// Which records can be modified.
- //record_field_offset_map_t _records;
- record_field_offset_map2_t* _records2;
+ record_field_offset_map4_t* _records2;
const char *get_new_suffix ();
diff --git a/gcc/ipa-field-reorder.c b/gcc/ipa-field-reorder.c
index bf990f182cd..04eea5fb90e 100644
--- a/gcc/ipa-field-reorder.c
+++ b/gcc/ipa-field-reorder.c
@@ -170,7 +170,7 @@ private:
class TypeReconstructorFieldReordering : public type_reconstructor
{
public:
- TypeReconstructorFieldReordering (record_field_offset_map_t records,
+ TypeReconstructorFieldReordering (record_field_offset_map3_t records,
const char *suffix)
: type_reconstructor (records, suffix)
{};
@@ -524,7 +524,19 @@ get_reordered_field_maps (record_field_offset_map_t record_field_offset_map,
{
type_stringifier stringifier;
- TypeReconstructorFieldReordering reconstructor (record_field_offset_map,
+ record_field_offset_map3_t record_field_offset_map2;
+ for (auto i = record_field_offset_map.begin(), e = record_field_offset_map.end(); i != e; ++i)
+ {
+ field_offsets2_t _second2;
+ std::set<unsigned> _second1 = i->second;
+ for (auto j = _second1.begin(), f = _second1.end(); j != f; ++j)
+ {
+ _second2.add (*j);
+ }
+ record_field_offset_map2.insert({i->first, _second2});
+ }
+
+ TypeReconstructorFieldReordering reconstructor (record_field_offset_map2,
"reorder");
for (hash_set<tree>::iterator i = to_modify.begin (),
e = to_modify.end ();
diff --git a/gcc/ipa-type-escape-analysis.h b/gcc/ipa-type-escape-analysis.h
index 1c9826416cd..cf09c0705de 100644
--- a/gcc/ipa-type-escape-analysis.h
+++ b/gcc/ipa-type-escape-analysis.h
@@ -1233,9 +1233,12 @@ private:
};
typedef std::set<unsigned> field_offsets_t;
+typedef hash_set<int_hash <int , -1, -2>> field_offsets2_t;
typedef std::map<tree, field_offsets_t> record_field_offset_map_t;
+typedef std::map<tree, field_offsets2_t> record_field_offset_map3_t;
typedef hash_map<tree, field_offsets_t> record_field_offset_map2_t;
+typedef hash_map<tree, field_offsets2_t*> record_field_offset_map4_t;
// Partition types into escaping or non escaping sets.
void