diff options
Diffstat (limited to 'gcc/gimple-accesser.c')
-rw-r--r-- | gcc/gimple-accesser.c | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/gcc/gimple-accesser.c b/gcc/gimple-accesser.c new file mode 100644 index 00000000000..18d74f499c0 --- /dev/null +++ b/gcc/gimple-accesser.c @@ -0,0 +1,105 @@ +#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 "types-inlines.h" +#include "gimple-accesser.hpp" + + +void +GimpleAccesser::_walk_pre(gassign *s) +{ + // There seems to be quite a bit of code duplication here... + const enum gimple_rhs_class code = gimple_assign_rhs_class(s); + switch (code) + { + case GIMPLE_TERNARY_RHS: + { + const_tree rhs3 = gimple_assign_rhs3(s); + gcc_assert(rhs3); + exprAccessor.update(rhs3, Read); + } + /* fall-through */ + case GIMPLE_BINARY_RHS: + { + const_tree rhs2 = gimple_assign_rhs2(s); + gcc_assert(rhs2); + exprAccessor.update(rhs2, Read); + } + /* fall-through */ + case GIMPLE_UNARY_RHS: + case GIMPLE_SINGLE_RHS: + { + const_tree rhs1 = gimple_assign_rhs1(s); + exprAccessor.update(rhs1, Read); + const_tree lhs = gimple_assign_lhs(s); + if (!lhs) break; + exprAccessor.update(lhs, Write); + break; + } + default: + gcc_unreachable(); + break; + } +} + +void +GimpleAccesser::_walk_pre(gcall *s) +{ + tree fndecl = gimple_call_fndecl(s); + unsigned n = gimple_call_num_args(s); + for (unsigned i = 0; i < n; i++) + { + const_tree a = gimple_call_arg(s, i); + gcc_assert(a); + exprAccessor.update(a, Read); + } + + const_tree lhs = gimple_call_lhs(s); + if (!lhs) return; + exprAccessor.update(lhs, Write); +} + +void +GimpleAccesser::_walk_pre(greturn *s) +{ + const_tree val = gimple_return_retval(s); + if (!val) return; + exprAccessor.update(val, Read); +} + +void +GimpleAccesser::_walk_pre(gcond *s) +{ + const_tree lhs = gimple_cond_lhs(s); + const_tree rhs = gimple_cond_rhs(s); + gcc_assert(lhs && rhs); + exprAccessor.update(lhs, Read); + exprAccessor.update(rhs, Read); +} |