1/* Header file for gimple statement walk support. 2 Copyright (C) 2013-2015 Free Software Foundation, Inc. 3 4This file is part of GCC. 5 6GCC is free software; you can redistribute it and/or modify it under 7the terms of the GNU General Public License as published by the Free 8Software Foundation; either version 3, or (at your option) any later 9version. 10 11GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12WARRANTY; without even the implied warranty of MERCHANTABILITY or 13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 for more details. 15 16You should have received a copy of the GNU General Public License 17along with GCC; see the file COPYING3. If not see 18<http://www.gnu.org/licenses/>. */ 19 20#ifndef GCC_GIMPLE_WALK_H 21#define GCC_GIMPLE_WALK_H 22 23/* Convenience routines to walk all statements of a gimple function. 24 Note that this is useful exclusively before the code is converted 25 into SSA form. Once the program is in SSA form, the standard 26 operand interface should be used to analyze/modify statements. */ 27struct walk_stmt_info 28{ 29 /* Points to the current statement being walked. */ 30 gimple_stmt_iterator gsi; 31 32 /* Additional data that the callback functions may want to carry 33 through the recursion. */ 34 void *info; 35 36 /* Pointer map used to mark visited tree nodes when calling 37 walk_tree on each operand. If set to NULL, duplicate tree nodes 38 will be visited more than once. */ 39 hash_set<tree> *pset; 40 41 /* Operand returned by the callbacks. This is set when calling 42 walk_gimple_seq. If the walk_stmt_fn or walk_tree_fn callback 43 returns non-NULL, this field will contain the tree returned by 44 the last callback. */ 45 tree callback_result; 46 47 /* Indicates whether the operand being examined may be replaced 48 with something that matches is_gimple_val (if true) or something 49 slightly more complicated (if false). "Something" technically 50 means the common subset of is_gimple_lvalue and is_gimple_rhs, 51 but we never try to form anything more complicated than that, so 52 we don't bother checking. 53 54 Also note that CALLBACK should update this flag while walking the 55 sub-expressions of a statement. For instance, when walking the 56 statement 'foo (&var)', the flag VAL_ONLY will initially be set 57 to true, however, when walking &var, the operand of that 58 ADDR_EXPR does not need to be a GIMPLE value. */ 59 BOOL_BITFIELD val_only : 1; 60 61 /* True if we are currently walking the LHS of an assignment. */ 62 BOOL_BITFIELD is_lhs : 1; 63 64 /* Optional. Set to true by the callback functions if they made any 65 changes. */ 66 BOOL_BITFIELD changed : 1; 67 68 /* True if we're interested in location information. */ 69 BOOL_BITFIELD want_locations : 1; 70 71 /* True if we've removed the statement that was processed. */ 72 BOOL_BITFIELD removed_stmt : 1; 73}; 74 75/* Callback for walk_gimple_stmt. Called for every statement found 76 during traversal. The first argument points to the statement to 77 walk. The second argument is a flag that the callback sets to 78 'true' if it the callback handled all the operands and 79 sub-statements of the statement (the default value of this flag is 80 'false'). The third argument is an anonymous pointer to data 81 to be used by the callback. */ 82typedef tree (*walk_stmt_fn) (gimple_stmt_iterator *, bool *, 83 struct walk_stmt_info *); 84 85extern gimple walk_gimple_seq_mod (gimple_seq *, walk_stmt_fn, walk_tree_fn, 86 struct walk_stmt_info *); 87extern gimple walk_gimple_seq (gimple_seq, walk_stmt_fn, walk_tree_fn, 88 struct walk_stmt_info *); 89extern tree walk_gimple_op (gimple, walk_tree_fn, struct walk_stmt_info *); 90extern tree walk_gimple_stmt (gimple_stmt_iterator *, walk_stmt_fn, 91 walk_tree_fn, struct walk_stmt_info *); 92typedef bool (*walk_stmt_load_store_addr_fn) (gimple, tree, tree, void *); 93extern bool walk_stmt_load_store_addr_ops (gimple, void *, 94 walk_stmt_load_store_addr_fn, 95 walk_stmt_load_store_addr_fn, 96 walk_stmt_load_store_addr_fn); 97extern bool walk_stmt_load_store_ops (gimple, void *, 98 walk_stmt_load_store_addr_fn, 99 walk_stmt_load_store_addr_fn); 100#endif /* GCC_GIMPLE_WALK_H */ 101