|
- /* Header file for gimple statement walk support.
- Copyright (C) 2013-2020 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 */
|