summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErick Ochoa <erick.ochoa@theobroma-systems.com>2020-12-03 14:59:08 +0100
committerErick Ochoa <erick.ochoa@theobroma-systems.com>2020-12-03 14:59:08 +0100
commitadc77cc4807b0912fd9299dcf7d7b4fe8e307b93 (patch)
tree3352ceba0cd4140fc3d399fc874c8c9450fa9c1e
parented7c8c1d785a891bfd5db2fb5446c301205d163d (diff)
preserving after type_reconstructor
-rw-r--r--gcc/ipa-dfe.c95
-rw-r--r--gcc/ipa-dfe.h66
-rw-r--r--gcc/ipa-field-reorder.c51
-rw-r--r--gcc/ipa-type-escape-analysis.c11
4 files changed, 83 insertions, 140 deletions
diff --git a/gcc/ipa-dfe.c b/gcc/ipa-dfe.c
index 5b4926dfd29..033fb7564e7 100644
--- a/gcc/ipa-dfe.c
+++ b/gcc/ipa-dfe.c
@@ -194,7 +194,7 @@ get_all_types_pointing_to (record_field_offset_map3_t record_field_offset_map,
*/
reorg_maps_t
get_types_replacement (record_field_offset_map3_t record_field_offset_map,
- hash_set<tree> &to_modify)
+ hash_set<tree> &to_modify, reorg_record_map2_t &map2, reorg_field_map2_t &field_map2)
{
type_stringifier stringifier;
@@ -204,7 +204,7 @@ get_types_replacement (record_field_offset_map3_t record_field_offset_map,
record_field_offset_map2.put(i->first, i->second);
}
- type_reconstructor reconstructor (record_field_offset_map2, "reorg");
+ type_reconstructor reconstructor (record_field_offset_map2, "reorg", map2, field_map2);
for (hash_set<tree>::iterator i = to_modify.begin (),
e = to_modify.end ();
i != e; ++i)
@@ -221,22 +221,11 @@ get_types_replacement (record_field_offset_map3_t record_field_offset_map,
reconstructor.walk (record);
}
- //reorg_record_map_t map = reconstructor.get_map ();
- reorg_record_map2_t *map2 = reconstructor.get_map2 ();
-
- 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.
// Also, we found some types for which TYPE_CACHED_VALUES_P is not being
// rewritten. This is probably indicative of a bug in TypeReconstructor.
- for (hash_map<tree, tree>::iterator i = map2->begin (),
- e = map2->end ();
+ for (hash_map<tree, tree>::iterator i = map2.begin (),
+ e = map2.end ();
i != e; ++i)
{
tree o_record = (*i).first;
@@ -246,7 +235,6 @@ get_types_replacement (record_field_offset_map3_t record_field_offset_map,
std::string r_name
= r_record ? stringifier.stringify (r_record) : std::string ("");
log ("modified: %s\n", r_name.c_str ());
- map.insert({o_record, r_record});
if (!r_record)
continue;
tree m_record = TYPE_MAIN_VARIANT (r_record);
@@ -255,17 +243,17 @@ get_types_replacement (record_field_offset_map3_t record_field_offset_map,
TYPE_CACHED_VALUES_P (_o_record) = false;
TYPE_CACHED_VALUES_P (m_record) = false;
- bool in_map = map2->get (m_record);
+ bool in_map = map2.get (m_record);
if (!in_map)
continue;
- tree mm_record = *map2->get (m_record);
+ tree mm_record = *map2.get (m_record);
// Info: I think this is no longer needed...
// Please verify
TYPE_MAIN_VARIANT (r_record) = mm_record;
}
// TODO: Ok, we will need to change this some time...
- return std::make_pair (map, field_map);
+ return std::make_pair (&map2, &field_map2);
}
/* Walk the gimple program and substitute
@@ -273,8 +261,8 @@ get_types_replacement (record_field_offset_map3_t record_field_offset_map,
* * the trees in field_map with field_map's values.
*/
void
-substitute_types_in_program (reorg_record_map_t map,
- reorg_field_map_t field_map, bool _delete)
+substitute_types_in_program (reorg_record_map2_t &map,
+ reorg_field_map2_t &field_map, bool _delete)
{
gimple_type_rewriter rewriter (map, field_map, _delete);
rewriter.walk ();
@@ -353,30 +341,11 @@ specific_type_collector::_walk_RECORD_TYPE_post (tree t)
path2.remove (t);
}
-/*
- * old RECORD_TYPE -> new RECORD_TYPE.
- */
-reorg_record_map2_t*
-type_reconstructor::get_map2 ()
-{
- return _reorg_map2;
-}
-
-/*
- * old FIELD_DECL -> new FIELD_DECL.
- */
-
-reorg_field_map2_t*
-type_reconstructor::get_field_map2 ()
-{
- return _reorg_fields2;
-}
-
void
type_reconstructor::set_is_not_modified_yet (tree t)
{
gcc_assert (t);
- const bool is_in_reorg_map = _reorg_map2->get (t);
+ const bool is_in_reorg_map = _reorg_map2.get (t);
modified_map2->put(t, false);
if (is_in_reorg_map)
mark_all_pointing_here_as_modified ();
@@ -385,11 +354,11 @@ type_reconstructor::set_is_not_modified_yet (tree t)
if (!tt)
return;
- const bool is_in_reorg_map_2 = _reorg_map2->get (tt);
+ const bool is_in_reorg_map_2 = _reorg_map2.get (tt);
if (!is_in_reorg_map_2)
return;
- tree type = *_reorg_map2->get(tt);
+ tree type = *_reorg_map2.get(tt);
bool is_modified
= strstr (type_stringifier::get_type_identifier (type).c_str (), ".reorg");
is_modified
@@ -435,7 +404,7 @@ type_reconstructor::get_is_modified (tree t)
bool
type_reconstructor::is_memoized (tree t)
{
- const bool already_changed = _reorg_map2->get (t);
+ const bool already_changed = _reorg_map2.get (t);
mark_all_pointing_here_as_modified ();
return already_changed;
}
@@ -508,7 +477,7 @@ type_reconstructor::_walk_ARRAY_TYPE_post (tree t)
TREE_TYPE (copy) = build_variant_type_copy (TREE_TYPE (copy));
copy = is_modified ? build_distinct_type_copy (copy) : copy;
- TREE_TYPE (copy) = is_modified ? *_reorg_map2->get(TREE_TYPE (t)) : TREE_TYPE (copy);
+ TREE_TYPE (copy) = is_modified ? *_reorg_map2.get(TREE_TYPE (t)) : TREE_TYPE (copy);
TYPE_NAME (copy) = is_modified
? get_new_identifier (copy, this->get_new_suffix ())
: TYPE_NAME (copy);
@@ -537,7 +506,7 @@ type_reconstructor::_walk_ARRAY_TYPE_post (tree t)
if (!points_to_record)
return;
- _reorg_map2->put (t, is_modified ? copy : _t);
+ _reorg_map2.put (t, is_modified ? copy : _t);
}
void
@@ -563,7 +532,7 @@ type_reconstructor::_walk_POINTER_TYPE_post (tree t)
bool is_modified = get_is_modified (t);
copy = is_modified ? build_variant_type_copy (copy) : copy;
- TREE_TYPE (copy) = is_modified ? *_reorg_map2->get(TREE_TYPE (t)) : TREE_TYPE (copy);
+ TREE_TYPE (copy) = is_modified ? *_reorg_map2.get(TREE_TYPE (t)) : TREE_TYPE (copy);
TYPE_NAME (copy) = is_modified
? get_new_identifier (copy, this->get_new_suffix ())
: TYPE_NAME (copy);
@@ -579,7 +548,7 @@ type_reconstructor::_walk_POINTER_TYPE_post (tree t)
if (!points_to_record)
return;
- _reorg_map2->put(t, is_modified ? copy : _t);
+ _reorg_map2.put(t, is_modified ? copy : _t);
}
void
@@ -659,7 +628,7 @@ type_reconstructor::_walk_RECORD_TYPE_post (tree t)
if (!is_main_variant)
{
tree main = TYPE_MAIN_VARIANT (t);
- tree main_reorg = *_reorg_map2->get(main);
+ tree main_reorg = *_reorg_map2.get(main);
tree copy_variant = build_variant_type_copy (main_reorg);
TYPE_NAME (copy_variant)
= get_new_identifier (copy, this->get_new_suffix ());
@@ -667,7 +636,7 @@ type_reconstructor::_walk_RECORD_TYPE_post (tree t)
TYPE_MAIN_VARIANT (copy_variant) = main_reorg;
TYPE_SIZE (main_reorg) = NULL;
layout_type (copy_variant);
- _reorg_map2->put(t, copy_variant);
+ _reorg_map2.put(t, copy_variant);
}
else
{
@@ -683,10 +652,10 @@ type_reconstructor::_walk_RECORD_TYPE_post (tree t)
if (is_modified)
layout_type (copy);
tree _t = tree_to_tree (t);
- _reorg_map2->put(t, is_modified ? copy : _t);
+ _reorg_map2.put(t, is_modified ? copy : _t);
}
- tree record = *_reorg_map2->get(t);
+ tree record = *_reorg_map2.get(t);
for (tree field = TYPE_FIELDS (record); field; field = DECL_CHAIN (field))
{
relayout_decl (field);
@@ -740,17 +709,17 @@ type_reconstructor::_walk_field_post (tree t)
const bool type_memoized = is_memoized (original_type);
TREE_TYPE (copy)
- = type_memoized ? *_reorg_map2->get(original_type) : TREE_TYPE (copy);
+ = type_memoized ? *_reorg_map2.get(original_type) : TREE_TYPE (copy);
field_tuple_t tuple = std::make_pair (t, can_field_be_deleted ? NULL : copy);
// Put the field into the vector
field_tuple_list2_t &field_tuple_list2 = field_list2_stack2.last ();
field_tuple_list2.safe_push (tuple);
- const bool already_has_field = _reorg_fields2->get (t);
+ const bool already_has_field = _reorg_fields2.get (t);
if (already_has_field)
return;
- _reorg_fields2->put(t, std::make_pair (copy, can_field_be_deleted));
+ _reorg_fields2.put(t, std::make_pair (copy, can_field_be_deleted));
}
// Relayout parameters
@@ -786,11 +755,11 @@ expr_type_rewriter::_walk_FUNCTION_DECL_post (tree t)
// Therefore it is awkward to do this in the expr-walker...
// const bool is_interesting = is_interesting_type (ret_type);
// Instead use the following map
- const bool is_interesting = _map2->get (ret_type);
+ const bool is_interesting = _map2.get (ret_type);
if (!is_interesting)
return;
- tree r_t = *_map2->get(ret_type);
+ tree r_t = *_map2.get(ret_type);
TREE_TYPE (fn_type) = r_t;
}
@@ -800,7 +769,7 @@ expr_type_rewriter::_walk_MEM_REF_post (tree e)
{
tree op0 = TREE_OPERAND (e, 0);
tree t2 = TREE_TYPE (op0);
- const bool in_map2 = _map2->get(t2);
+ const bool in_map2 = _map2.get(t2);
log ("trying out substituting expression in component_Ref directly\n");
type_stringifier stringifier;
@@ -809,7 +778,7 @@ expr_type_rewriter::_walk_MEM_REF_post (tree e)
if (in_map2)
{
log ("success\n");
- tree r_t = *_map2->get(t2);
+ tree r_t = *_map2.get(t2);
tree _e = tree_to_tree (op0);
TREE_TYPE (_e) = r_t;
}
@@ -1141,11 +1110,11 @@ expr_type_rewriter::_walk_post (tree e)
{
gcc_assert (e);
tree t = TREE_TYPE (e);
- const bool in_map = _map2->get(t);
+ const bool in_map = _map2.get(t);
if (!in_map)
return;
- tree r_t = *_map2->get(t);
+ tree r_t = *_map2.get(t);
tree _e = tree_to_tree (e);
TREE_TYPE (_e) = r_t;
}
@@ -1158,11 +1127,11 @@ expr_type_rewriter::_walk_COMPONENT_REF_post (tree e)
tree f = TREE_OPERAND (e, 1);
// So, what we need is a map between this field and the new field
- const bool in_map = _fields2->get(f);
+ const bool in_map = _fields2.get(f);
if (!in_map)
return;
- std::pair<tree, bool> p = *_fields2->get(f);
+ std::pair<tree, bool> p = *_fields2.get(f);
tree n_f = p.first;
bool is_deleted = p.second;
tree _e = tree_to_tree (e);
diff --git a/gcc/ipa-dfe.h b/gcc/ipa-dfe.h
index 8a83a954b98..d8c9b856d37 100644
--- a/gcc/ipa-dfe.h
+++ b/gcc/ipa-dfe.h
@@ -70,33 +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_map4_t &records, const char *suffix)
- : _records2(records), _suffix (suffix), in_progress2(vNULL), for_reference2(vNULL), field_list2_stack2 (vNULL)
+ type_reconstructor (record_field_offset_map4_t &records, const char *suffix, reorg_record_map2_t &a, reorg_field_map2_t &b)
+ : _records2(records), _suffix (suffix), in_progress2(vNULL), for_reference2(vNULL), field_list2_stack2 (vNULL), _reorg_map2(a), _reorg_fields2(b)
{
- _reorg_map2 = new reorg_record_map2_t;
- _reorg_fields2 = new reorg_field_map2_t;
modified_map2 = new is_modified_map2_t;
};
~type_reconstructor()
{
- delete _reorg_map2;
- delete _reorg_fields2;
delete modified_map2;
}
/* Whether a type has already been modified. */
virtual bool is_memoized (tree t);
- // Final result for record map.
- reorg_record_map2_t *get_map2 ();
-
- /* Final result for field map. */
- reorg_field_map2_t *get_field_map2 ();
-
/* Map RECORD_TYPE -> is_modified. */
typedef hash_map<tree, bool> is_modified_map2_t;
protected:
+ // Which records can be modified.
+ record_field_offset_map4_t& _records2;
+
// The new suffix
const char *_suffix;
@@ -116,19 +109,16 @@ protected:
// of field_tuple_list_t
typedef vec<field_tuple_list2_t> field_tuple_list2_stack2_t;
- // Which records can be modified.
- record_field_offset_map4_t& _records2;
-
const char *get_new_suffix ();
// Which fields will be deleted.
field_tuple_list2_stack2_t field_list2_stack2;
// old RECORD_TYPE -> new RECORD_TYPE
- reorg_record_map2_t *_reorg_map2;
+ reorg_record_map2_t &_reorg_map2;
// old FIELD_DECL -> new FIELD_DECL
- reorg_field_map2_t *_reorg_fields2;
+ reorg_field_map2_t &_reorg_fields2;
// old RECORD_TYPE -> is_modified
is_modified_map2_t *modified_map2;
@@ -167,38 +157,22 @@ private:
class expr_type_rewriter : public expr_walker
{
public:
- expr_type_rewriter (reorg_record_map_t map, reorg_field_map_t map2,
+ expr_type_rewriter (reorg_record_map2_t &map, reorg_field_map2_t &map2,
bool can_delete)
- : _delete (false), _can_delete (can_delete)
+ : _delete (false), _can_delete (can_delete), _map2(map), _fields2(map2)
{
/* Create an inverse map new RECORD_TYPE -> old RECORD_TYPE. */
-
- _map2 = new reorg_record_map2_t;
- _fields2 = new reorg_field_map2_t;
- for (auto i = map.begin(), e = map.end(); i != e; ++i)
- {
- _map2->put (i->first, i->second);
- }
-
- for (auto i = map2.begin(), e = map2.end(); i != e; ++i)
- {
- _fields2->put (i->first, i->second);
- }
-
_imap2 = new hash_map<tree, tree>;
- for (reorg_record_map_t::iterator i = map.begin (),
- e = map.end (); i != e; ++i)
+ for (auto i = map.begin (), e = map.end (); i != e; ++i)
{
- tree original = i->first;
- tree modified = i->second;
+ tree original = (*i).first;
+ tree modified = (*i).second;
_imap2->put (modified, original);
}
};
~expr_type_rewriter()
{
- delete _map2;
- delete _fields2;
delete _imap2;
};
@@ -221,10 +195,10 @@ public:
private:
// Old RECORD_TYPE -> new RECORD_TYPE.
- reorg_record_map2_t* _map2;
+ reorg_record_map2_t& _map2;
// Old FIELD_DECL -> new FIELD_DECL.
- reorg_field_map2_t* _fields2;
+ reorg_field_map2_t& _fields2;
// New RECORD_TYPE -> old RECORD_TYPE.
hash_map<tree, tree>* _imap2;
@@ -248,7 +222,7 @@ private:
class gimple_type_rewriter : public gimple_walker
{
public:
- gimple_type_rewriter (reorg_record_map_t map, reorg_field_map_t map2,
+ gimple_type_rewriter (reorg_record_map2_t &map, reorg_field_map2_t &map2,
bool can_delete)
: exprTypeRewriter (map, map2, can_delete)
{};
@@ -275,17 +249,19 @@ get_all_types_pointing_to (record_field_offset_map3_t record_field_offset_map,
tpartitions2_t casting,
hash_set<tree> &to_modify);
-typedef std::pair<reorg_record_map_t, reorg_field_map_t> reorg_maps_t;
+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,
- hash_set<tree> &to_modify);
+ hash_set<tree> &to_modify,
+ reorg_record_map2_t &,
+ reorg_field_map2_t &);
// Substitute types.
void
-substitute_types_in_program (reorg_record_map_t map,
- reorg_field_map_t field_map, bool _delete);
+substitute_types_in_program (reorg_record_map2_t &map,
+ reorg_field_map2_t &field_map, bool _delete);
tree
get_new_identifier (tree type, const char *suffix);
diff --git a/gcc/ipa-field-reorder.c b/gcc/ipa-field-reorder.c
index f02f57b5888..07f930a0caf 100644
--- a/gcc/ipa-field-reorder.c
+++ b/gcc/ipa-field-reorder.c
@@ -171,8 +171,9 @@ class TypeReconstructorFieldReordering : public type_reconstructor
{
public:
TypeReconstructorFieldReordering (record_field_offset_map4_t &records,
- const char *suffix)
- : type_reconstructor (records, suffix)
+ const char *suffix,
+ reorg_record_map2_t &a, reorg_field_map2_t &b)
+ : type_reconstructor (records, suffix, a, b)
{};
private:
@@ -329,7 +330,7 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
unsigned haystack_i = bitpos_of_field (field);
if (haystack_i == to_find_i)
{
- _reorg_fields2->put(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);
}
}
@@ -341,7 +342,7 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
if (!is_main_variant)
{
tree main = TYPE_MAIN_VARIANT (t);
- tree main_reorg = *_reorg_map2->get(main);
+ tree main_reorg = *_reorg_map2.get(main);
tree copy_variant = build_distinct_type_copy (main_reorg);
TYPE_NAME (copy_variant)
= get_new_identifier (copy, this->get_new_suffix ());
@@ -349,7 +350,7 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
TYPE_ALIAS_SET (copy_variant) = -1;
layout_type (copy_variant);
TYPE_MAIN_VARIANT (copy_variant) = main_reorg;
- _reorg_map2->put (t, copy_variant);
+ _reorg_map2.put (t, copy_variant);
}
else
{
@@ -365,10 +366,10 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
if (is_modified)
layout_type (copy);
tree _t = tree_to_tree (t);
- _reorg_map2->put (t, is_modified ? copy : _t);
+ _reorg_map2.put (t, is_modified ? copy : _t);
}
- tree record = *_reorg_map2->get(t);
+ tree record = *_reorg_map2.get(t);
for (tree field = TYPE_FIELDS (record); field; field = DECL_CHAIN (field))
{
relayout_decl (field);
@@ -520,7 +521,8 @@ record_field_map_t static find_fields_accessed ()
*/
reorg_maps_t
get_reordered_field_maps (record_field_offset_map3_t record_field_offset_map,
- hash_set<tree> & to_modify)
+ hash_set<tree> & to_modify,
+ reorg_record_map2_t &map2, reorg_field_map2_t &field_map2)
{
type_stringifier stringifier;
@@ -531,7 +533,7 @@ get_reordered_field_maps (record_field_offset_map3_t record_field_offset_map,
}
TypeReconstructorFieldReordering reconstructor (record_field_offset_map2,
- "reorder");
+ "reorder", map2, field_map2);
for (hash_set<tree>::iterator i = to_modify.begin (),
e = to_modify.end ();
i != e; ++i)
@@ -549,22 +551,13 @@ get_reordered_field_maps (record_field_offset_map3_t record_field_offset_map,
}
typedef hash_map<tree, tree> reorg_record_map2_t;
- reorg_record_map2_t *map2 = reconstructor.get_map2 ();
- std::map<tree, tree> 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
// rewritten. This is probably indicative of a bug in
// TypeReconstructorFieldReordering.
- for (reorg_record_map2_t::iterator i = map2->begin (),
- e = map2->end ();
+ for (reorg_record_map2_t::iterator i = map2.begin (),
+ e = map2.end ();
i != e; ++i)
{
tree o_record = (*i).first;
@@ -574,7 +567,6 @@ get_reordered_field_maps (record_field_offset_map3_t record_field_offset_map,
std::string r_name
= r_record ? stringifier.stringify (r_record) : std::string ("");
log ("modified: %s\n", r_name.c_str ());
- map.insert({o_record, r_record});
if (!r_record)
continue;
tree m_record = TYPE_MAIN_VARIANT (r_record);
@@ -583,17 +575,17 @@ get_reordered_field_maps (record_field_offset_map3_t record_field_offset_map,
TYPE_CACHED_VALUES_P (_o_record) = false;
TYPE_CACHED_VALUES_P (m_record) = false;
- bool in_map = map2->get (m_record);
+ bool in_map = map2.get (m_record);
if (!in_map)
continue;
- tree mm_record = *map2->get(m_record);
+ tree mm_record = *map2.get(m_record);
// Info: I think this is no longer needed...
// Please verify
TYPE_MAIN_VARIANT (r_record) = mm_record;
}
// TODO: change this to return the GCC types...
- return std::make_pair (map, field_map);
+ return std::make_pair (&map2, &field_map2);
}
/* Top level function. */
@@ -619,11 +611,14 @@ lto_fr_execute ()
get_all_types_pointing_to (record_field_offset_map,
escaping_nonescaping_sets, to_modify);
+ reorg_record_map2_t a;
+ reorg_field_map2_t b;
reorg_maps_t replacements
- = get_reordered_field_maps (record_field_offset_map, to_modify);
- reorg_record_map_t map = replacements.first;
- reorg_field_map_t field_map = replacements.second;
- substitute_types_in_program (map, field_map, false);
+ = get_reordered_field_maps (record_field_offset_map, to_modify, a, b);
+ reorg_record_map2_t *map = replacements.first;
+ reorg_field_map2_t *field_map = replacements.second;
+ gcc_assert(map && field_map);
+ substitute_types_in_program (*map, *field_map, false);
gimple_walker walker;
walker.walk ();
diff --git a/gcc/ipa-type-escape-analysis.c b/gcc/ipa-type-escape-analysis.c
index 5b78bbe424f..0f920358424 100644
--- a/gcc/ipa-type-escape-analysis.c
+++ b/gcc/ipa-type-escape-analysis.c
@@ -372,12 +372,15 @@ lto_dead_field_elimination ()
hash_set<tree> to_modify2;
get_all_types_pointing_to (record_field_offset_map,
escaping_nonescaping_sets, to_modify2);
+ reorg_record_map2_t a;
+ reorg_field_map2_t b;
reorg_maps_t replacements
- = get_types_replacement (record_field_offset_map, to_modify2);
- reorg_record_map_t map = replacements.first;
- reorg_field_map_t field_map = replacements.second;
+ = get_types_replacement (record_field_offset_map, to_modify2, a, b);
+ reorg_record_map2_t *map = replacements.first;
+ reorg_field_map2_t *field_map = replacements.second;
+ gcc_assert(map && field_map);
// Transformation.
- substitute_types_in_program (map, field_map, true);
+ substitute_types_in_program (*map, *field_map, true);
}
/* Iterate all gimple bodies and collect trees