Line data Source code
1 : /* Iterator routines for manipulating GENERIC tree statement list. -*- C++ -*-
2 : Copyright (C) 2003-2026 Free Software Foundation, Inc.
3 : Contributed by Andrew MacLeod <amacleod@redhat.com>
4 :
5 : This file is part of GCC.
6 :
7 : GCC is free software; you can redistribute it and/or modify
8 : it under the terms of the GNU General Public License as published by
9 : the Free Software Foundation; either version 3, or (at your option)
10 : any later version.
11 :
12 : GCC is distributed in the hope that it will be useful,
13 : but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 : GNU General Public License for more details.
16 :
17 : You should have received a copy of the GNU General Public License
18 : along with GCC; see the file COPYING3. If not see
19 : <http://www.gnu.org/licenses/>. */
20 :
21 :
22 : /* This file is dependent upon the implementation of tree's. It provides an
23 : abstract interface to the tree objects such that if all tree creation and
24 : manipulations are done through this interface, we can easily change the
25 : implementation of tree's, and not impact other code. */
26 :
27 : #ifndef GCC_TREE_ITERATOR_H
28 : #define GCC_TREE_ITERATOR_H 1
29 :
30 : /* Iterator object for GENERIC or GIMPLE TREE statements. */
31 :
32 : struct tree_stmt_iterator {
33 : struct tree_statement_list_node *ptr;
34 : tree container;
35 :
36 : /* No need for user-defined constructors, the implicit definitions (or
37 : aggregate initialization) are fine. */
38 :
39 1546606420 : bool operator== (tree_stmt_iterator b) const
40 337567925 : { return b.ptr == ptr && b.container == container; }
41 11143953210 : bool operator!= (tree_stmt_iterator b) const { return !(*this == b); }
42 3232815237 : tree_stmt_iterator &operator++ () { ptr = ptr->next; return *this; }
43 15338 : tree_stmt_iterator &operator-- () { ptr = ptr->prev; return *this; }
44 167 : tree_stmt_iterator operator++ (int)
45 167 : { tree_stmt_iterator x = *this; ++*this; return x; }
46 : tree_stmt_iterator operator-- (int)
47 : { tree_stmt_iterator x = *this; --*this; return x; }
48 1156437790 : tree &operator* () { return ptr->stmt; }
49 : tree operator* () const { return ptr->stmt; }
50 : };
51 :
52 : inline tree_stmt_iterator
53 1783626187 : tsi_start (tree t)
54 : {
55 1783626187 : tree_stmt_iterator i;
56 :
57 1783626187 : i.ptr = STATEMENT_LIST_HEAD (t);
58 1783626187 : i.container = t;
59 :
60 1783626187 : return i;
61 : }
62 :
63 : inline tree_stmt_iterator
64 1629997399 : tsi_last (tree t)
65 : {
66 1629997399 : tree_stmt_iterator i;
67 :
68 1629997399 : i.ptr = STATEMENT_LIST_TAIL (t);
69 1629997399 : i.container = t;
70 :
71 1629997399 : return i;
72 : }
73 :
74 : inline bool
75 409101048 : tsi_end_p (tree_stmt_iterator i)
76 : {
77 409101048 : return i.ptr == NULL;
78 : }
79 :
80 : inline bool
81 1064684047 : tsi_one_before_end_p (tree_stmt_iterator i)
82 : {
83 1064684047 : return i.ptr != NULL && i.ptr->next == NULL;
84 : }
85 :
86 : inline void
87 1964057052 : tsi_next (tree_stmt_iterator *i)
88 : {
89 1686004929 : ++(*i);
90 1751126974 : }
91 :
92 : inline void
93 15337 : tsi_prev (tree_stmt_iterator *i)
94 : {
95 15143 : --(*i);
96 15078 : }
97 :
98 : inline tree *
99 1414717868 : tsi_stmt_ptr (tree_stmt_iterator i)
100 : {
101 1416450070 : return &(*i);
102 : }
103 :
104 : inline tree
105 1978326734 : tsi_stmt (tree_stmt_iterator i)
106 : {
107 1978326832 : return *i;
108 : }
109 :
110 : /* Make tree_stmt_iterator work as a C++ range, e.g.
111 : for (tree stmt : tsi_range (stmt_list)) { ... } */
112 : class tsi_range
113 : {
114 : tree t;
115 : public:
116 339074989 : tsi_range (tree t): t(t) { }
117 339074989 : tree_stmt_iterator begin() const { return tsi_start (t); }
118 339074989 : tree_stmt_iterator end() const { return { nullptr, t }; }
119 : };
120 :
121 : enum tsi_iterator_update
122 : {
123 : TSI_NEW_STMT, /* Only valid when single statement is added, move
124 : iterator to it. */
125 : TSI_SAME_STMT, /* Leave the iterator at the same statement. */
126 : TSI_CHAIN_START, /* Only valid when chain of statements is added, move
127 : iterator to the first statement in the chain. */
128 : TSI_CHAIN_END, /* Only valid when chain of statements is added, move
129 : iterator to the last statement in the chain. */
130 : TSI_CONTINUE_LINKING /* Move iterator to whatever position is suitable for
131 : linking other statements/chains of statements in
132 : the same direction. */
133 : };
134 :
135 : extern void tsi_link_before (tree_stmt_iterator *, tree,
136 : enum tsi_iterator_update);
137 : extern void tsi_link_after (tree_stmt_iterator *, tree,
138 : enum tsi_iterator_update);
139 :
140 : extern void tsi_delink (tree_stmt_iterator *);
141 : extern tree tsi_split_stmt_list (location_t, tree_stmt_iterator);
142 :
143 : extern tree alloc_stmt_list (void);
144 : extern void free_stmt_list (tree);
145 : extern void append_to_statement_list (tree, tree *);
146 : extern void append_to_statement_list_force (tree, tree *);
147 : extern tree expr_first (tree);
148 : extern tree expr_last (tree);
149 : extern tree expr_single (tree);
150 :
151 : #endif /* GCC_TREE_ITERATOR_H */
|