diff options
author | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-12-01 14:14:28 +0100 |
---|---|---|
committer | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-12-01 14:14:28 +0100 |
commit | 6eed3c1c792b094e9312d4a8abb0a04f9e99f153 (patch) | |
tree | 16fdab1ab3591175094a0b5d4d269d69b0337f47 | |
parent | e928cc50587ce16add1c2e68807121f040110bef (diff) |
abstraction
-rw-r--r-- | gcc/ipa-type-escape-analysis.c | 37 | ||||
-rw-r--r-- | gcc/ipa-type-escape-analysis.h | 12 |
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; |