123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- /* Header file for gimple statement walk support.
- Copyright (C) 2013-2019 Free Software Foundation, Inc.
- This file is part of GCC.
- GCC is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 3, or (at your option) any later
- version.
- GCC is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
- <http://www.gnu.org/licenses/>. */
- #ifndef GCC_GIMPLE_WALK_H
- #define GCC_GIMPLE_WALK_H
- /* Convenience routines to walk all statements of a gimple function.
- Note that this is useful exclusively before the code is converted
- into SSA form. Once the program is in SSA form, the standard
- operand interface should be used to analyze/modify statements. */
- struct walk_stmt_info
- {
- /* Points to the current statement being walked. */
- gimple_stmt_iterator gsi;
- gimple *stmt;
- /* Additional data that the callback functions may want to carry
- through the recursion. */
- void *info;
- /* Pointer map used to mark visited tree nodes when calling
- walk_tree on each operand. If set to NULL, duplicate tree nodes
- will be visited more than once. */
- hash_set<tree> *pset;
- /* Operand returned by the callbacks. This is set when calling
- walk_gimple_seq. If the walk_stmt_fn or walk_tree_fn callback
- returns non-NULL, this field will contain the tree returned by
- the last callback. */
- tree callback_result;
- /* Indicates whether the operand being examined may be replaced
- with something that matches is_gimple_val (if true) or something
- slightly more complicated (if false). "Something" technically
- means the common subset of is_gimple_lvalue and is_gimple_rhs,
- but we never try to form anything more complicated than that, so
- we don't bother checking.
- Also note that CALLBACK should update this flag while walking the
- sub-expressions of a statement. For instance, when walking the
- statement 'foo (&var)', the flag VAL_ONLY will initially be set
- to true, however, when walking &var, the operand of that
- ADDR_EXPR does not need to be a GIMPLE value. */
- BOOL_BITFIELD val_only : 1;
- /* True if we are currently walking the LHS of an assignment. */
- BOOL_BITFIELD is_lhs : 1;
- /* Optional. Set to true by the callback functions if they made any
- changes. */
- BOOL_BITFIELD changed : 1;
- /* True if we're interested in location information. */
- BOOL_BITFIELD want_locations : 1;
- /* True if we've removed the statement that was processed. */
- BOOL_BITFIELD removed_stmt : 1;
- };
- /* Callback for walk_gimple_stmt. Called for every statement found
- during traversal. The first argument points to the statement to
- walk. The second argument is a flag that the callback sets to
- 'true' if it the callback handled all the operands and
- sub-statements of the statement (the default value of this flag is
- 'false'). The third argument is an anonymous pointer to data
- to be used by the callback. */
- typedef tree (*walk_stmt_fn) (gimple_stmt_iterator *, bool *,
- struct walk_stmt_info *);
- extern gimple *walk_gimple_seq_mod (gimple_seq *, walk_stmt_fn, walk_tree_fn,
- struct walk_stmt_info *);
- extern gimple *walk_gimple_seq (gimple_seq, walk_stmt_fn, walk_tree_fn,
- struct walk_stmt_info *);
- extern tree walk_gimple_op (gimple *, walk_tree_fn, struct walk_stmt_info *);
- extern tree walk_gimple_stmt (gimple_stmt_iterator *, walk_stmt_fn,
- walk_tree_fn, struct walk_stmt_info *);
- typedef bool (*walk_stmt_load_store_addr_fn) (gimple *, tree, tree, void *);
- extern bool walk_stmt_load_store_addr_ops (gimple *, void *,
- walk_stmt_load_store_addr_fn,
- walk_stmt_load_store_addr_fn,
- walk_stmt_load_store_addr_fn);
- extern bool walk_stmt_load_store_ops (gimple *, void *,
- walk_stmt_load_store_addr_fn,
- walk_stmt_load_store_addr_fn);
- #endif /* GCC_GIMPLE_WALK_H */
|