diff options
Diffstat (limited to 'gcc/type-collector.c')
-rw-r--r-- | gcc/type-collector.c | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/gcc/type-collector.c b/gcc/type-collector.c new file mode 100644 index 00000000000..3def624c4ac --- /dev/null +++ b/gcc/type-collector.c @@ -0,0 +1,245 @@ +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "backend.h" +#include "tree.h" +#include "gimple-expr.h" +#include "predict.h" +#include "alloc-pool.h" +#include "tree-pass.h" +#include "cgraph.h" +#include "diagnostic.h" +#include "fold-const.h" +#include "gimple-fold.h" +#include "symbol-summary.h" +#include "tree-vrp.h" +#include "ipa-prop.h" +#include "tree-pretty-print.h" +#include "tree-inline.h" +#include "ipa-fnsummary.h" +#include "ipa-utils.h" +#include "tree-ssa-ccp.h" +#include "stringpool.h" +#include "attribs.h" +#include "tree-ssa-alias.h" +#include "tree-ssanames.h" +#include "gimple.h" +#include "cfg.h" +#include "gimple-iterator.h" +#include "gimple-ssa.h" + +#include "type-collector.hpp" +#include "type-stringifier.hpp" +#include "types-inlines.h" + +void +TypeCollector::collect(const_tree t) +{ + const bool in_set = ptrset->in_universe(t); + // memoization... + if (in_set) return; + gcc_assert(ptrset && t); + + if (!ptr.empty()) + { + TypeStringifier stringifier; + std::string in_name = stringifier.stringify(t); + log("in %s size = %d\n", in_name.c_str(), ptr.size()); + gcc_unreachable(); + } + walk(t); +} + +bool +TypeCollector::is_memoized(const_tree t) +{ + const bool in_set = ptrset->in_universe(t); + if (!in_set) return false; + + const bool points_to_record = ptrset->in_points_to_record(t); + for (auto i = ptr.begin(), e = ptr.end(); i != e; ++i) + { + i->second |= points_to_record; + } + return true; +} + +void +TypeCollector::_walk_void_pre(const_tree t) +{ + ptr[t] = false; +} + +void +TypeCollector::_walk_void_post(const_tree t) +{ + _collect_simple(t); +} + +void +TypeCollector::_walk_integer_pre(const_tree t) +{ + ptr[t] = false; +} + +void +TypeCollector::_walk_integer_post(const_tree t) +{ + _collect_simple(t); +} + +void +TypeCollector::_walk_real_pre(const_tree t) +{ + ptr[t] = false; +} + +void +TypeCollector::_walk_real_post(const_tree t) +{ + _collect_simple(t); +} + +void +TypeCollector::_walk_fixed_point_pre(const_tree t) +{ + ptr[t] = false; +} + +void +TypeCollector::_walk_fixed_point_post(const_tree t) +{ + _collect_simple(t); +} + +void +TypeCollector::_walk_complex_pre(const_tree t) +{ + ptr[t] = false; +} + +void +TypeCollector::_walk_complex_post(const_tree t) +{ + _collect_simple(t); +} + +void +TypeCollector::_walk_enumeral_pre(const_tree t) +{ + ptr[t] = false; +} + +void +TypeCollector::_walk_enumeral_post(const_tree t) +{ + _collect_simple(t); +} + +void +TypeCollector::_walk_boolean_pre(const_tree t) +{ + ptr[t] = false; +} + +void +TypeCollector::_walk_boolean_post(const_tree t) +{ + _collect_simple(t); +} + +void +TypeCollector::_collect_simple(const_tree t) +{ + ptrset->insert(t, ptr[t]); + ptr.erase(t); +} + +void +TypeCollector::_walk_array_pre(const_tree t) +{ + ptr[t] = false; +} + +void +TypeCollector::_walk_array_post(const_tree t) +{ + _collect_simple(t); +} + +void +TypeCollector::_walk_pointer_pre(const_tree t) +{ + ptr[t] = false; +} + +void +TypeCollector::_walk_pointer_post(const_tree t) +{ + _collect_simple(t); +} + +void +TypeCollector::_walk_reference_pre(const_tree t) +{ + ptr[t] = false; +} + +void +TypeCollector::_walk_reference_post(const_tree t) +{ + _collect_simple(t); +} + +void +TypeCollector::_walk_record_post(const_tree t) +{ + // All in ptr point to record + for (auto i = ptr.begin(), e = ptr.end(); i != e; ++i) + { + i->second = true; + } + _collect_simple(t); +} + +void +TypeCollector::_walk_record_pre(const_tree t) +{ + ptr[t] = false; +} + +void +TypeCollector::_walk_union_pre(const_tree t) +{ + ptr[t] = false; +} + +void +TypeCollector::_walk_union_post(const_tree t) +{ + _collect_simple(t); +} + +void +TypeCollector::_walk_function_post(const_tree t) +{ + _collect_simple(t); +} + +void +TypeCollector::_walk_function_pre(const_tree t) +{ + ptr[t] = false; +} + +void +TypeCollector::_walk_method_post(const_tree t) +{ + _collect_simple(t); +} + +void +TypeCollector::_walk_method_pre(const_tree t) +{ + ptr[t] = false; +} |