summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErick Ochoa <erick.ochoa@theobroma-systems.com>2020-12-03 15:24:30 +0100
committerErick Ochoa <erick.ochoa@theobroma-systems.com>2020-12-03 15:24:30 +0100
commit743eb2d60054c2868bcb95184ffbeb9f12aac949 (patch)
treef728c09d0c94c5f3928803a519ebb3eae25274c4
parentadc77cc4807b0912fd9299dcf7d7b4fe8e307b93 (diff)
some glue code
-rw-r--r--gcc/ipa-dfe.c20
-rw-r--r--gcc/ipa-dfe.h6
-rw-r--r--gcc/ipa-field-reorder.c16
-rw-r--r--gcc/ipa-type-escape-analysis.c49
-rw-r--r--gcc/ipa-type-escape-analysis.h8
5 files changed, 35 insertions, 64 deletions
diff --git a/gcc/ipa-dfe.c b/gcc/ipa-dfe.c
index 033fb7564e7..c4507a95091 100644
--- a/gcc/ipa-dfe.c
+++ b/gcc/ipa-dfe.c
@@ -130,7 +130,7 @@ along with GCC; see the file COPYING3. If not see
* record_field_offset_map.
*/
void
-get_all_types_pointing_to (record_field_offset_map3_t record_field_offset_map,
+get_all_types_pointing_to (record_field_offset_map4_t &record_field_offset_map2,
tpartitions2_t casting,
hash_set<tree> &to_modify2)
{
@@ -138,16 +138,6 @@ get_all_types_pointing_to (record_field_offset_map3_t record_field_offset_map,
type_stringifier stringifier;
hash_set<tree> specific_types2;
- record_field_offset_map4_t record_field_offset_map2;
-
- // Here we are just placing the types of interest in a set.
- for (std::map<tree, field_offsets2_t*>::iterator i
- = record_field_offset_map.begin (),
- e = record_field_offset_map.end ();
- i != e; ++i)
- {
- record_field_offset_map2.put (i->first, i->second);
- }
// Here we are just placing the types of interest in a set.
for (hash_map<tree, field_offsets2_t*>::iterator i
@@ -193,17 +183,11 @@ get_all_types_pointing_to (record_field_offset_map3_t record_field_offset_map,
* The second maps old FIELD_DECLs trees to the new FIELD_DECLs.
*/
reorg_maps_t
-get_types_replacement (record_field_offset_map3_t record_field_offset_map,
+get_types_replacement (record_field_offset_map4_t &record_field_offset_map2,
hash_set<tree> &to_modify, reorg_record_map2_t &map2, reorg_field_map2_t &field_map2)
{
type_stringifier stringifier;
- record_field_offset_map4_t record_field_offset_map2;
- for (auto i = record_field_offset_map.begin(), e = record_field_offset_map.end(); i != e; ++i)
- {
- record_field_offset_map2.put(i->first, i->second);
- }
-
type_reconstructor reconstructor (record_field_offset_map2, "reorg", map2, field_map2);
for (hash_set<tree>::iterator i = to_modify.begin (),
e = to_modify.end ();
diff --git a/gcc/ipa-dfe.h b/gcc/ipa-dfe.h
index d8c9b856d37..99ae3b76805 100644
--- a/gcc/ipa-dfe.h
+++ b/gcc/ipa-dfe.h
@@ -58,11 +58,9 @@ private:
};
/* Map old RECORD_TYPE -> new RECORD_TYPE. */
-typedef std::map<tree, tree> reorg_record_map_t;
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
@@ -245,7 +243,7 @@ private:
// Get a set of all types pointing to types in RECORD_FIELD_OFFSET_MAP.
void
-get_all_types_pointing_to (record_field_offset_map3_t record_field_offset_map,
+get_all_types_pointing_to (record_field_offset_map4_t &record_field_offset_map,
tpartitions2_t casting,
hash_set<tree> &to_modify);
@@ -253,7 +251,7 @@ typedef std::pair<reorg_record_map2_t*, reorg_field_map2_t*> reorg_maps_t;
// Compute the replacement types.
reorg_maps_t
-get_types_replacement (record_field_offset_map3_t record_field_offset_map,
+get_types_replacement (record_field_offset_map4_t &record_field_offset_map,
hash_set<tree> &to_modify,
reorg_record_map2_t &,
reorg_field_map2_t &);
diff --git a/gcc/ipa-field-reorder.c b/gcc/ipa-field-reorder.c
index 07f930a0caf..dd811ff01f6 100644
--- a/gcc/ipa-field-reorder.c
+++ b/gcc/ipa-field-reorder.c
@@ -520,18 +520,12 @@ record_field_map_t static find_fields_accessed ()
* The second maps old FIELD_DECLs trees to the new FIELD_DECLs.
*/
reorg_maps_t
-get_reordered_field_maps (record_field_offset_map3_t record_field_offset_map,
+get_reordered_field_maps (record_field_offset_map4_t &record_field_offset_map2,
hash_set<tree> & to_modify,
reorg_record_map2_t &map2, reorg_field_map2_t &field_map2)
{
type_stringifier stringifier;
- record_field_offset_map4_t record_field_offset_map2;
- for (auto i = record_field_offset_map.begin(), e = record_field_offset_map.end(); i != e; ++i)
- {
- record_field_offset_map2.put(i->first, i->second);
- }
-
TypeReconstructorFieldReordering reconstructor (record_field_offset_map2,
"reorder", map2, field_map2);
for (hash_set<tree>::iterator i = to_modify.begin (),
@@ -599,11 +593,11 @@ lto_fr_execute ()
tpartitions2_t escaping_nonescaping_sets;
partition_types_into_escaping_nonescaping (escaping_nonescaping_sets, whitelisted2);
record_field_map_t record_field_map = find_fields_accessed ();
- record_field_offset_map3_t record_field_offset_map
- = obtain_nonescaping_unaccessed_fields (escaping_nonescaping_sets,
- record_field_map, 0);
+ record_field_offset_map4_t record_field_offset_map;
+ obtain_nonescaping_unaccessed_fields (escaping_nonescaping_sets,
+ record_field_map, 0, record_field_offset_map);
- if (detected_incompatible_syntax || record_field_offset_map.empty ())
+ if (detected_incompatible_syntax || record_field_offset_map.is_empty ())
return 0;
// Prepare for transformation.
diff --git a/gcc/ipa-type-escape-analysis.c b/gcc/ipa-type-escape-analysis.c
index 0f920358424..bcc9901e5cb 100644
--- a/gcc/ipa-type-escape-analysis.c
+++ b/gcc/ipa-type-escape-analysis.c
@@ -362,10 +362,10 @@ lto_dead_field_elimination ()
if (detected_incompatible_syntax) return;
record_field_map_t record_field_map = find_fields_accessed ();
if (detected_incompatible_syntax) return;
- record_field_offset_map3_t record_field_offset_map
- = obtain_nonescaping_unaccessed_fields (escaping_nonescaping_sets,
- record_field_map, OPT_Wdfa);
- if (detected_incompatible_syntax || record_field_offset_map.empty ())
+ record_field_offset_map4_t record_field_offset_map;
+ obtain_nonescaping_unaccessed_fields (escaping_nonescaping_sets,
+ record_field_map, OPT_Wdfa, record_field_offset_map);
+ if (detected_incompatible_syntax || record_field_offset_map.is_empty ())
return;
// Prepare for transformation.
@@ -534,15 +534,15 @@ keep_only_read_fields_from_equivalent_field_maps (
*/
static void
erase_if_no_fields_can_be_deleted (
- record_field_offset_map3_t &record_field_offset_map,
+ record_field_offset_map4_t &record_field_offset_map,
std::set<tree> &to_keep, std::set<tree> &to_erase)
{
- for (std::map<tree, field_offsets2_t*>::iterator i
+ for (hash_map<tree, field_offsets2_t*>::iterator i
= record_field_offset_map.begin (),
e = record_field_offset_map.end ();
i != e; ++i)
{
- tree record = i->first;
+ tree record = (*i).first;
const bool keep = to_keep.find (record) != to_keep.end ();
if (keep)
continue;
@@ -555,7 +555,7 @@ erase_if_no_fields_can_be_deleted (
i != e; ++i)
{
tree record = *i;
- record_field_offset_map.erase (record);
+ record_field_offset_map.remove (record);
}
}
@@ -565,16 +565,16 @@ erase_if_no_fields_can_be_deleted (
*/
static void
mark_escaping_types_to_be_deleted (
- record_field_offset_map3_t &record_field_offset_map,
+ record_field_offset_map4_t &record_field_offset_map,
std::set<tree> &to_erase, tpartitions2_t casting)
{
tset2_t &non_escaping = casting.non_escaping;
- for (std::map<tree, field_offsets2_t*>::iterator i
+ for (hash_map<tree, field_offsets2_t*>::iterator i
= record_field_offset_map.begin (),
e = record_field_offset_map.end ();
i != e; ++i)
{
- tree record = i->first;
+ tree record = (*i).first;
const bool in_set = non_escaping.contains (record);
if (in_set)
continue;
@@ -584,13 +584,13 @@ mark_escaping_types_to_be_deleted (
}
// Obtain nonescaping unaccessed fields
-record_field_offset_map3_t
+void
obtain_nonescaping_unaccessed_fields (tpartitions2_t casting,
record_field_map_t record_field_map,
- int _warning)
+ int _warning,
+ record_field_offset_map4_t &record_field_offset_map)
{
bool has_fields_that_can_be_deleted = false;
- record_field_offset_map3_t record_field_offset_map;
for (std::map<tree, field_access_map_t>::iterator i
= record_field_map.begin (),
e = record_field_map.end ();
@@ -607,7 +607,7 @@ obtain_nonescaping_unaccessed_fields (tpartitions2_t casting,
*field_offset);
// These map holds the following:
// RECORD_TYPE -> unsigned (bit_pos_offset which has been read)
- record_field_offset_map[r_i] = field_offset;
+ record_field_offset_map.put(r_i, field_offset);
}
// So now that we only have the FIELDS which are read,
@@ -618,18 +618,18 @@ obtain_nonescaping_unaccessed_fields (tpartitions2_t casting,
std::set<tree> to_keep;
mark_escaping_types_to_be_deleted (record_field_offset_map, to_erase,
casting);
- for (std::map<tree, field_offsets2_t*>::iterator i
+ for (auto i
= record_field_offset_map.begin (),
e = record_field_offset_map.end ();
i != e; ++i)
{
- tree record = i->first;
+ tree record = (*i).first;
const bool will_be_erased = to_erase.find (record) != to_erase.end ();
// No need to compute which fields can be deleted if type is escaping
if (will_be_erased)
continue;
- field_offsets2_t *field_offset = i->second;
+ field_offsets2_t *field_offset = (*i).second;
for (tree field = TYPE_FIELDS (record); field; field = DECL_CHAIN (field))
{
unsigned f_offset = bitpos_of_field (field);
@@ -653,20 +653,17 @@ obtain_nonescaping_unaccessed_fields (tpartitions2_t casting,
warning (_warning, "RECORD_TYPE %qE has dead field %qE in LTO.\n",
record, field);
}
- record_field_offset_map[record] = field_offset;
+ record_field_offset_map.put(record, field_offset);
}
- // Improve: Make this more elegant.
- if (!has_fields_that_can_be_deleted)
- {
- record_field_offset_map3_t empty;
- return empty;
- }
+ if (!has_fields_that_can_be_deleted) {
+ record_field_offset_map.empty();
+ return;
+ }
erase_if_no_fields_can_be_deleted (record_field_offset_map, to_keep,
to_erase);
- return record_field_offset_map;
}
// Main interface to TypeWalker
diff --git a/gcc/ipa-type-escape-analysis.h b/gcc/ipa-type-escape-analysis.h
index f61c15299e9..805e4b2a3fa 100644
--- a/gcc/ipa-type-escape-analysis.h
+++ b/gcc/ipa-type-escape-analysis.h
@@ -1232,12 +1232,9 @@ private:
// But we might need a gswitch.
};
-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.
@@ -1245,10 +1242,11 @@ void
partition_types_into_escaping_nonescaping (tpartitions2_t &p, hash_map<tree, bool>*);
// Compute set of not escaping unaccessed fields
-record_field_offset_map3_t
+void
obtain_nonescaping_unaccessed_fields (tpartitions2_t casting,
record_field_map_t record_field_map,
- int warning);
+ int warning,
+ record_field_offset_map4_t &a);
extern bool detected_incompatible_syntax;
hash_map<tree, bool> *get_whitelisted_nodes2();