summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErick Ochoa <erick.ochoa@theobroma-systems.com>2020-12-01 14:14:28 +0100
committerErick Ochoa <erick.ochoa@theobroma-systems.com>2020-12-01 14:14:28 +0100
commit6eed3c1c792b094e9312d4a8abb0a04f9e99f153 (patch)
tree16fdab1ab3591175094a0b5d4d269d69b0337f47
parente928cc50587ce16add1c2e68807121f040110bef (diff)
abstraction
-rw-r--r--gcc/ipa-type-escape-analysis.c37
-rw-r--r--gcc/ipa-type-escape-analysis.h12
2 files changed, 40 insertions, 9 deletions
diff --git a/gcc/ipa-type-escape-analysis.c b/gcc/ipa-type-escape-analysis.c
index 433efbb52b8..e202e15fc4e 100644
--- a/gcc/ipa-type-escape-analysis.c
+++ b/gcc/ipa-type-escape-analysis.c
@@ -2800,6 +2800,12 @@ type_accessor::get_map_ref()
return _map;
}
+field_access_map_t
+type_accessor::get(tree key)
+{
+ return _map[key];
+}
+
bool
type_accessor::is_memoized (tree t)
{
@@ -2935,7 +2941,7 @@ expr_accessor::_walk_ADDR_EXPR_pre (__attribute__ ((unused)) tree e)
const bool record_already_in_map
= _type_accessor.get_map_ref().find (addr_expr_t) != _type_accessor.get_map_ref().end ();
field_access_map_t field_map;
- field_map = record_already_in_map ? _type_accessor.get_map_ref()[addr_expr_t] : field_map;
+ field_map = record_already_in_map ? _type_accessor.get(addr_expr_t) : field_map;
// UNSAFE! But it is necesseary for testing...
// Unless there is someone who is smarter that finds another way to test this.
@@ -2964,13 +2970,34 @@ expr_accessor::_walk_ADDR_EXPR_pre (__attribute__ ((unused)) tree e)
prev_access |= Read;
field_map[field] = prev_access;
add_all_fields_in_struct (addr_expr_t);
- _type_accessor.get_map_ref()[addr_expr_t] = field_map;
+ _type_accessor.insert_in_map (addr_expr_t, field_map);
if (f_offset == offset_int)
break;
}
}
+field_access_map2_t*
+type_accessor::conversion(field_access_map_t &map)
+{
+ field_access_map2_t *retval = new field_access_map2_t;
+ for (auto i = map.begin(), e = map.end(); i != e; ++i)
+ {
+ retval->put(i->first, i->second);
+ }
+ return retval;
+}
+
+void
+type_accessor::insert_in_map(tree t, field_access_map_t map)
+{
+ this->_map[t] = map;
+
+ // We need to convert field_access_map_t
+ // to field_access_map2_t
+ this->_map2[t] = conversion(map);
+}
+
/* Find out if we are taking the address of a FIELD_DECL.
* If this is the case, it means that all FIELDS in this
* RECORD_TYPE should be marked as READ for safety.
@@ -2998,14 +3025,14 @@ expr_accessor::_walk_COMPONENT_REF_pre (tree e)
const bool record_already_in_map
= _type_accessor.get_map_ref().find (op0_t) != _type_accessor.get_map_ref().end ();
field_access_map_t field_map;
- field_map = record_already_in_map ? _type_accessor.get_map_ref()[op0_t] : field_map;
+ field_map = record_already_in_map ? _type_accessor.get(op0_t) : field_map;
const bool field_already_in_map = field_map.find (op1) != field_map.end ();
unsigned prev_access = field_already_in_map ? field_map[op1] : Empty;
prev_access |= _access;
field_map[op1] = prev_access;
add_all_fields_in_struct (op0_t);
- _type_accessor.get_map_ref()[op0_t] = field_map;
+ _type_accessor.insert_in_map(op0_t, field_map);
if (_stack.size () < 4)
return;
@@ -3045,7 +3072,7 @@ expr_accessor::_walk_COMPONENT_REF_pre (tree e)
prev_access |= Read;
field_map[field] = prev_access;
add_all_fields_in_struct (t);
- _type_accessor.get_map_ref()[t] = field_map;
+ _type_accessor.insert_in_map(t, field_map);
}
}
diff --git a/gcc/ipa-type-escape-analysis.h b/gcc/ipa-type-escape-analysis.h
index b8d281feb94..ff9ba59af0d 100644
--- a/gcc/ipa-type-escape-analysis.h
+++ b/gcc/ipa-type-escape-analysis.h
@@ -1139,18 +1139,22 @@ public:
type_accessor ()
{};
- ~type_accessor()
- {
- };
-
record_field_map_t &get_map_ref();
record_field_map_t get_map ();
+ void insert_in_map(tree, field_access_map_t);
+
+ field_access_map_t get(tree);
+
+
private:
+ field_access_map2_t *conversion(field_access_map_t&);
+
// maps RECORD -> (FIELD_DECL -> bitflag).
record_field_map_t _map;
+ record_field_map2_t _map2;
// set of trees which are memoized and we don't need to look into them.
hash_set<tree> memoized_map2;