1 |
284 |
jeremybenn |
@c Copyright (c) 2008, 2009, 2010 Free Software Foundation, Inc.
|
2 |
|
|
@c Free Software Foundation, Inc.
|
3 |
|
|
@c This is part of the GCC manual.
|
4 |
|
|
@c For copying conditions, see the file gcc.texi.
|
5 |
|
|
|
6 |
|
|
@node GIMPLE
|
7 |
|
|
@chapter GIMPLE
|
8 |
|
|
@cindex GIMPLE
|
9 |
|
|
|
10 |
|
|
GIMPLE is a three-address representation derived from GENERIC by
|
11 |
|
|
breaking down GENERIC expressions into tuples of no more than 3
|
12 |
|
|
operands (with some exceptions like function calls). GIMPLE was
|
13 |
|
|
heavily influenced by the SIMPLE IL used by the McCAT compiler
|
14 |
|
|
project at McGill University, though we have made some different
|
15 |
|
|
choices. For one thing, SIMPLE doesn't support @code{goto}.
|
16 |
|
|
|
17 |
|
|
Temporaries are introduced to hold intermediate values needed to
|
18 |
|
|
compute complex expressions. Additionally, all the control
|
19 |
|
|
structures used in GENERIC are lowered into conditional jumps,
|
20 |
|
|
lexical scopes are removed and exception regions are converted
|
21 |
|
|
into an on the side exception region tree.
|
22 |
|
|
|
23 |
|
|
The compiler pass which converts GENERIC into GIMPLE is referred to as
|
24 |
|
|
the @samp{gimplifier}. The gimplifier works recursively, generating
|
25 |
|
|
GIMPLE tuples out of the original GENERIC expressions.
|
26 |
|
|
|
27 |
|
|
One of the early implementation strategies used for the GIMPLE
|
28 |
|
|
representation was to use the same internal data structures used
|
29 |
|
|
by front ends to represent parse trees. This simplified
|
30 |
|
|
implementation because we could leverage existing functionality
|
31 |
|
|
and interfaces. However, GIMPLE is a much more restrictive
|
32 |
|
|
representation than abstract syntax trees (AST), therefore it
|
33 |
|
|
does not require the full structural complexity provided by the
|
34 |
|
|
main tree data structure.
|
35 |
|
|
|
36 |
|
|
The GENERIC representation of a function is stored in the
|
37 |
|
|
@code{DECL_SAVED_TREE} field of the associated @code{FUNCTION_DECL}
|
38 |
|
|
tree node. It is converted to GIMPLE by a call to
|
39 |
|
|
@code{gimplify_function_tree}.
|
40 |
|
|
|
41 |
|
|
If a front end wants to include language-specific tree codes in the tree
|
42 |
|
|
representation which it provides to the back end, it must provide a
|
43 |
|
|
definition of @code{LANG_HOOKS_GIMPLIFY_EXPR} which knows how to
|
44 |
|
|
convert the front end trees to GIMPLE@. Usually such a hook will involve
|
45 |
|
|
much of the same code for expanding front end trees to RTL@. This function
|
46 |
|
|
can return fully lowered GIMPLE, or it can return GENERIC trees and let the
|
47 |
|
|
main gimplifier lower them the rest of the way; this is often simpler.
|
48 |
|
|
GIMPLE that is not fully lowered is known as ``High GIMPLE'' and
|
49 |
|
|
consists of the IL before the pass @code{pass_lower_cf}. High GIMPLE
|
50 |
|
|
contains some container statements like lexical scopes
|
51 |
|
|
(represented by @code{GIMPLE_BIND}) and nested expressions (e.g.,
|
52 |
|
|
@code{GIMPLE_TRY}), while ``Low GIMPLE'' exposes all of the
|
53 |
|
|
implicit jumps for control and exception expressions directly in
|
54 |
|
|
the IL and EH region trees.
|
55 |
|
|
|
56 |
|
|
The C and C++ front ends currently convert directly from front end
|
57 |
|
|
trees to GIMPLE, and hand that off to the back end rather than first
|
58 |
|
|
converting to GENERIC@. Their gimplifier hooks know about all the
|
59 |
|
|
@code{_STMT} nodes and how to convert them to GENERIC forms. There
|
60 |
|
|
was some work done on a genericization pass which would run first, but
|
61 |
|
|
the existence of @code{STMT_EXPR} meant that in order to convert all
|
62 |
|
|
of the C statements into GENERIC equivalents would involve walking the
|
63 |
|
|
entire tree anyway, so it was simpler to lower all the way. This
|
64 |
|
|
might change in the future if someone writes an optimization pass
|
65 |
|
|
which would work better with higher-level trees, but currently the
|
66 |
|
|
optimizers all expect GIMPLE@.
|
67 |
|
|
|
68 |
|
|
You can request to dump a C-like representation of the GIMPLE form
|
69 |
|
|
with the flag @option{-fdump-tree-gimple}.
|
70 |
|
|
|
71 |
|
|
@menu
|
72 |
|
|
* Tuple representation::
|
73 |
|
|
* GIMPLE instruction set::
|
74 |
|
|
* GIMPLE Exception Handling::
|
75 |
|
|
* Temporaries::
|
76 |
|
|
* Operands::
|
77 |
|
|
* Manipulating GIMPLE statements::
|
78 |
|
|
* Tuple specific accessors::
|
79 |
|
|
* GIMPLE sequences::
|
80 |
|
|
* Sequence iterators::
|
81 |
|
|
* Adding a new GIMPLE statement code::
|
82 |
|
|
* Statement and operand traversals::
|
83 |
|
|
@end menu
|
84 |
|
|
|
85 |
|
|
@node Tuple representation
|
86 |
|
|
@section Tuple representation
|
87 |
|
|
@cindex tuples
|
88 |
|
|
|
89 |
|
|
GIMPLE instructions are tuples of variable size divided in two
|
90 |
|
|
groups: a header describing the instruction and its locations,
|
91 |
|
|
and a variable length body with all the operands. Tuples are
|
92 |
|
|
organized into a hierarchy with 3 main classes of tuples.
|
93 |
|
|
|
94 |
|
|
@subsection @code{gimple_statement_base} (gsbase)
|
95 |
|
|
@cindex gimple_statement_base
|
96 |
|
|
|
97 |
|
|
This is the root of the hierarchy, it holds basic information
|
98 |
|
|
needed by most GIMPLE statements. There are some fields that
|
99 |
|
|
may not be relevant to every GIMPLE statement, but those were
|
100 |
|
|
moved into the base structure to take advantage of holes left by
|
101 |
|
|
other fields (thus making the structure more compact). The
|
102 |
|
|
structure takes 4 words (32 bytes) on 64 bit hosts:
|
103 |
|
|
|
104 |
|
|
@multitable {@code{references_memory_p}} {Size (bits)}
|
105 |
|
|
@item Field @tab Size (bits)
|
106 |
|
|
@item @code{code} @tab 8
|
107 |
|
|
@item @code{subcode} @tab 16
|
108 |
|
|
@item @code{no_warning} @tab 1
|
109 |
|
|
@item @code{visited} @tab 1
|
110 |
|
|
@item @code{nontemporal_move} @tab 1
|
111 |
|
|
@item @code{plf} @tab 2
|
112 |
|
|
@item @code{modified} @tab 1
|
113 |
|
|
@item @code{has_volatile_ops} @tab 1
|
114 |
|
|
@item @code{references_memory_p} @tab 1
|
115 |
|
|
@item @code{uid} @tab 32
|
116 |
|
|
@item @code{location} @tab 32
|
117 |
|
|
@item @code{num_ops} @tab 32
|
118 |
|
|
@item @code{bb} @tab 64
|
119 |
|
|
@item @code{block} @tab 63
|
120 |
|
|
@item Total size @tab 32 bytes
|
121 |
|
|
@end multitable
|
122 |
|
|
|
123 |
|
|
@itemize @bullet
|
124 |
|
|
@item @code{code}
|
125 |
|
|
Main identifier for a GIMPLE instruction.
|
126 |
|
|
|
127 |
|
|
@item @code{subcode}
|
128 |
|
|
Used to distinguish different variants of the same basic
|
129 |
|
|
instruction or provide flags applicable to a given code. The
|
130 |
|
|
@code{subcode} flags field has different uses depending on the code of
|
131 |
|
|
the instruction, but mostly it distinguishes instructions of the
|
132 |
|
|
same family. The most prominent use of this field is in
|
133 |
|
|
assignments, where subcode indicates the operation done on the
|
134 |
|
|
RHS of the assignment. For example, a = b + c is encoded as
|
135 |
|
|
@code{GIMPLE_ASSIGN <PLUS_EXPR, a, b, c>}.
|
136 |
|
|
|
137 |
|
|
@item @code{no_warning}
|
138 |
|
|
Bitflag to indicate whether a warning has already been issued on
|
139 |
|
|
this statement.
|
140 |
|
|
|
141 |
|
|
@item @code{visited}
|
142 |
|
|
General purpose ``visited'' marker. Set and cleared by each pass
|
143 |
|
|
when needed.
|
144 |
|
|
|
145 |
|
|
@item @code{nontemporal_move}
|
146 |
|
|
Bitflag used in assignments that represent non-temporal moves.
|
147 |
|
|
Although this bitflag is only used in assignments, it was moved
|
148 |
|
|
into the base to take advantage of the bit holes left by the
|
149 |
|
|
previous fields.
|
150 |
|
|
|
151 |
|
|
@item @code{plf}
|
152 |
|
|
Pass Local Flags. This 2-bit mask can be used as general purpose
|
153 |
|
|
markers by any pass. Passes are responsible for clearing and
|
154 |
|
|
setting these two flags accordingly.
|
155 |
|
|
|
156 |
|
|
@item @code{modified}
|
157 |
|
|
Bitflag to indicate whether the statement has been modified.
|
158 |
|
|
Used mainly by the operand scanner to determine when to re-scan a
|
159 |
|
|
statement for operands.
|
160 |
|
|
|
161 |
|
|
@item @code{has_volatile_ops}
|
162 |
|
|
Bitflag to indicate whether this statement contains operands that
|
163 |
|
|
have been marked volatile.
|
164 |
|
|
|
165 |
|
|
@item @code{references_memory_p}
|
166 |
|
|
Bitflag to indicate whether this statement contains memory
|
167 |
|
|
references (i.e., its operands are either global variables, or
|
168 |
|
|
pointer dereferences or anything that must reside in memory).
|
169 |
|
|
|
170 |
|
|
@item @code{uid}
|
171 |
|
|
This is an unsigned integer used by passes that want to assign
|
172 |
|
|
IDs to every statement. These IDs must be assigned and used by
|
173 |
|
|
each pass.
|
174 |
|
|
|
175 |
|
|
@item @code{location}
|
176 |
|
|
This is a @code{location_t} identifier to specify source code
|
177 |
|
|
location for this statement. It is inherited from the front
|
178 |
|
|
end.
|
179 |
|
|
|
180 |
|
|
@item @code{num_ops}
|
181 |
|
|
Number of operands that this statement has. This specifies the
|
182 |
|
|
size of the operand vector embedded in the tuple. Only used in
|
183 |
|
|
some tuples, but it is declared in the base tuple to take
|
184 |
|
|
advantage of the 32-bit hole left by the previous fields.
|
185 |
|
|
|
186 |
|
|
@item @code{bb}
|
187 |
|
|
Basic block holding the instruction.
|
188 |
|
|
|
189 |
|
|
@item @code{block}
|
190 |
|
|
Lexical block holding this statement. Also used for debug
|
191 |
|
|
information generation.
|
192 |
|
|
@end itemize
|
193 |
|
|
|
194 |
|
|
@subsection @code{gimple_statement_with_ops}
|
195 |
|
|
@cindex gimple_statement_with_ops
|
196 |
|
|
|
197 |
|
|
This tuple is actually split in two:
|
198 |
|
|
@code{gimple_statement_with_ops_base} and
|
199 |
|
|
@code{gimple_statement_with_ops}. This is needed to accommodate the
|
200 |
|
|
way the operand vector is allocated. The operand vector is
|
201 |
|
|
defined to be an array of 1 element. So, to allocate a dynamic
|
202 |
|
|
number of operands, the memory allocator (@code{gimple_alloc}) simply
|
203 |
|
|
allocates enough memory to hold the structure itself plus @code{N
|
204 |
|
|
- 1} operands which run ``off the end'' of the structure. For
|
205 |
|
|
example, to allocate space for a tuple with 3 operands,
|
206 |
|
|
@code{gimple_alloc} reserves @code{sizeof (struct
|
207 |
|
|
gimple_statement_with_ops) + 2 * sizeof (tree)} bytes.
|
208 |
|
|
|
209 |
|
|
On the other hand, several fields in this tuple need to be shared
|
210 |
|
|
with the @code{gimple_statement_with_memory_ops} tuple. So, these
|
211 |
|
|
common fields are placed in @code{gimple_statement_with_ops_base} which
|
212 |
|
|
is then inherited from the other two tuples.
|
213 |
|
|
|
214 |
|
|
|
215 |
|
|
@multitable {@code{addresses_taken}} {56 + 8 * @code{num_ops} bytes}
|
216 |
|
|
@item @code{gsbase} @tab 256
|
217 |
|
|
@item @code{addresses_taken} @tab 64
|
218 |
|
|
@item @code{def_ops} @tab 64
|
219 |
|
|
@item @code{use_ops} @tab 64
|
220 |
|
|
@item @code{op} @tab @code{num_ops} * 64
|
221 |
|
|
@item Total size @tab 56 + 8 * @code{num_ops} bytes
|
222 |
|
|
@end multitable
|
223 |
|
|
|
224 |
|
|
@itemize @bullet
|
225 |
|
|
@item @code{gsbase}
|
226 |
|
|
Inherited from @code{struct gimple_statement_base}.
|
227 |
|
|
|
228 |
|
|
@item @code{addresses_taken}
|
229 |
|
|
Bitmap holding the UIDs of all the @code{VAR_DECL}s whose addresses are
|
230 |
|
|
taken by this statement. For example, a statement of the form
|
231 |
|
|
@code{p = &b} will have the UID for symbol @code{b} in this set.
|
232 |
|
|
|
233 |
|
|
@item @code{def_ops}
|
234 |
|
|
Array of pointers into the operand array indicating all the slots that
|
235 |
|
|
contain a variable written-to by the statement. This array is
|
236 |
|
|
also used for immediate use chaining. Note that it would be
|
237 |
|
|
possible to not rely on this array, but the changes required to
|
238 |
|
|
implement this are pretty invasive.
|
239 |
|
|
|
240 |
|
|
@item @code{use_ops}
|
241 |
|
|
Similar to @code{def_ops} but for variables read by the statement.
|
242 |
|
|
|
243 |
|
|
@item @code{op}
|
244 |
|
|
Array of trees with @code{num_ops} slots.
|
245 |
|
|
@end itemize
|
246 |
|
|
|
247 |
|
|
@subsection @code{gimple_statement_with_memory_ops}
|
248 |
|
|
|
249 |
|
|
This tuple is essentially identical to @code{gimple_statement_with_ops},
|
250 |
|
|
except that it contains 4 additional fields to hold vectors
|
251 |
|
|
related memory stores and loads. Similar to the previous case,
|
252 |
|
|
the structure is split in two to accommodate for the operand
|
253 |
|
|
vector (@code{gimple_statement_with_memory_ops_base} and
|
254 |
|
|
@code{gimple_statement_with_memory_ops}).
|
255 |
|
|
|
256 |
|
|
|
257 |
|
|
@multitable {@code{addresses_taken}} {88 + 8 * @code{num_ops} bytes}
|
258 |
|
|
@item Field @tab Size (bits)
|
259 |
|
|
@item @code{gsbase} @tab 256
|
260 |
|
|
@item @code{addresses_taken} @tab 64
|
261 |
|
|
@item @code{def_ops} @tab 64
|
262 |
|
|
@item @code{use_ops} @tab 64
|
263 |
|
|
@item @code{vdef_ops} @tab 64
|
264 |
|
|
@item @code{vuse_ops} @tab 64
|
265 |
|
|
@item @code{stores} @tab 64
|
266 |
|
|
@item @code{loads} @tab 64
|
267 |
|
|
@item @code{op} @tab @code{num_ops} * 64
|
268 |
|
|
@item Total size @tab 88 + 8 * @code{num_ops} bytes
|
269 |
|
|
@end multitable
|
270 |
|
|
|
271 |
|
|
@itemize @bullet
|
272 |
|
|
@item @code{vdef_ops}
|
273 |
|
|
Similar to @code{def_ops} but for @code{VDEF} operators. There is
|
274 |
|
|
one entry per memory symbol written by this statement. This is
|
275 |
|
|
used to maintain the memory SSA use-def and def-def chains.
|
276 |
|
|
|
277 |
|
|
@item @code{vuse_ops}
|
278 |
|
|
Similar to @code{use_ops} but for @code{VUSE} operators. There is
|
279 |
|
|
one entry per memory symbol loaded by this statement. This is
|
280 |
|
|
used to maintain the memory SSA use-def chains.
|
281 |
|
|
|
282 |
|
|
@item @code{stores}
|
283 |
|
|
Bitset with all the UIDs for the symbols written-to by the
|
284 |
|
|
statement. This is different than @code{vdef_ops} in that all the
|
285 |
|
|
affected symbols are mentioned in this set. If memory
|
286 |
|
|
partitioning is enabled, the @code{vdef_ops} vector will refer to memory
|
287 |
|
|
partitions. Furthermore, no SSA information is stored in this
|
288 |
|
|
set.
|
289 |
|
|
|
290 |
|
|
@item @code{loads}
|
291 |
|
|
Similar to @code{stores}, but for memory loads. (Note that there
|
292 |
|
|
is some amount of redundancy here, it should be possible to
|
293 |
|
|
reduce memory utilization further by removing these sets).
|
294 |
|
|
@end itemize
|
295 |
|
|
|
296 |
|
|
All the other tuples are defined in terms of these three basic
|
297 |
|
|
ones. Each tuple will add some fields. The main gimple type
|
298 |
|
|
is defined to be the union of all these structures (@code{GTY} markers
|
299 |
|
|
elided for clarity):
|
300 |
|
|
|
301 |
|
|
@smallexample
|
302 |
|
|
union gimple_statement_d
|
303 |
|
|
@{
|
304 |
|
|
struct gimple_statement_base gsbase;
|
305 |
|
|
struct gimple_statement_with_ops gsops;
|
306 |
|
|
struct gimple_statement_with_memory_ops gsmem;
|
307 |
|
|
struct gimple_statement_omp omp;
|
308 |
|
|
struct gimple_statement_bind gimple_bind;
|
309 |
|
|
struct gimple_statement_catch gimple_catch;
|
310 |
|
|
struct gimple_statement_eh_filter gimple_eh_filter;
|
311 |
|
|
struct gimple_statement_phi gimple_phi;
|
312 |
|
|
struct gimple_statement_resx gimple_resx;
|
313 |
|
|
struct gimple_statement_try gimple_try;
|
314 |
|
|
struct gimple_statement_wce gimple_wce;
|
315 |
|
|
struct gimple_statement_asm gimple_asm;
|
316 |
|
|
struct gimple_statement_omp_critical gimple_omp_critical;
|
317 |
|
|
struct gimple_statement_omp_for gimple_omp_for;
|
318 |
|
|
struct gimple_statement_omp_parallel gimple_omp_parallel;
|
319 |
|
|
struct gimple_statement_omp_task gimple_omp_task;
|
320 |
|
|
struct gimple_statement_omp_sections gimple_omp_sections;
|
321 |
|
|
struct gimple_statement_omp_single gimple_omp_single;
|
322 |
|
|
struct gimple_statement_omp_continue gimple_omp_continue;
|
323 |
|
|
struct gimple_statement_omp_atomic_load gimple_omp_atomic_load;
|
324 |
|
|
struct gimple_statement_omp_atomic_store gimple_omp_atomic_store;
|
325 |
|
|
@};
|
326 |
|
|
@end smallexample
|
327 |
|
|
|
328 |
|
|
|
329 |
|
|
@node GIMPLE instruction set
|
330 |
|
|
@section GIMPLE instruction set
|
331 |
|
|
@cindex GIMPLE instruction set
|
332 |
|
|
|
333 |
|
|
The following table briefly describes the GIMPLE instruction set.
|
334 |
|
|
|
335 |
|
|
@multitable {@code{GIMPLE_OMP_SECTIONS_SWITCH}} {High GIMPLE} {Low GIMPLE}
|
336 |
|
|
@item Instruction @tab High GIMPLE @tab Low GIMPLE
|
337 |
|
|
@item @code{GIMPLE_ASM} @tab x @tab x
|
338 |
|
|
@item @code{GIMPLE_ASSIGN} @tab x @tab x
|
339 |
|
|
@item @code{GIMPLE_BIND} @tab x @tab
|
340 |
|
|
@item @code{GIMPLE_CALL} @tab x @tab x
|
341 |
|
|
@item @code{GIMPLE_CATCH} @tab x @tab
|
342 |
|
|
@item @code{GIMPLE_COND} @tab x @tab x
|
343 |
|
|
@item @code{GIMPLE_DEBUG} @tab x @tab x
|
344 |
|
|
@item @code{GIMPLE_EH_FILTER} @tab x @tab
|
345 |
|
|
@item @code{GIMPLE_GOTO} @tab x @tab x
|
346 |
|
|
@item @code{GIMPLE_LABEL} @tab x @tab x
|
347 |
|
|
@item @code{GIMPLE_NOP} @tab x @tab x
|
348 |
|
|
@item @code{GIMPLE_OMP_ATOMIC_LOAD} @tab x @tab x
|
349 |
|
|
@item @code{GIMPLE_OMP_ATOMIC_STORE} @tab x @tab x
|
350 |
|
|
@item @code{GIMPLE_OMP_CONTINUE} @tab x @tab x
|
351 |
|
|
@item @code{GIMPLE_OMP_CRITICAL} @tab x @tab x
|
352 |
|
|
@item @code{GIMPLE_OMP_FOR} @tab x @tab x
|
353 |
|
|
@item @code{GIMPLE_OMP_MASTER} @tab x @tab x
|
354 |
|
|
@item @code{GIMPLE_OMP_ORDERED} @tab x @tab x
|
355 |
|
|
@item @code{GIMPLE_OMP_PARALLEL} @tab x @tab x
|
356 |
|
|
@item @code{GIMPLE_OMP_RETURN} @tab x @tab x
|
357 |
|
|
@item @code{GIMPLE_OMP_SECTION} @tab x @tab x
|
358 |
|
|
@item @code{GIMPLE_OMP_SECTIONS} @tab x @tab x
|
359 |
|
|
@item @code{GIMPLE_OMP_SECTIONS_SWITCH} @tab x @tab x
|
360 |
|
|
@item @code{GIMPLE_OMP_SINGLE} @tab x @tab x
|
361 |
|
|
@item @code{GIMPLE_PHI} @tab @tab x
|
362 |
|
|
@item @code{GIMPLE_RESX} @tab @tab x
|
363 |
|
|
@item @code{GIMPLE_RETURN} @tab x @tab x
|
364 |
|
|
@item @code{GIMPLE_SWITCH} @tab x @tab x
|
365 |
|
|
@item @code{GIMPLE_TRY} @tab x @tab
|
366 |
|
|
@end multitable
|
367 |
|
|
|
368 |
|
|
@node GIMPLE Exception Handling
|
369 |
|
|
@section Exception Handling
|
370 |
|
|
@cindex GIMPLE Exception Handling
|
371 |
|
|
|
372 |
|
|
Other exception handling constructs are represented using
|
373 |
|
|
@code{GIMPLE_TRY_CATCH}. @code{GIMPLE_TRY_CATCH} has two operands. The
|
374 |
|
|
first operand is a sequence of statements to execute. If executing
|
375 |
|
|
these statements does not throw an exception, then the second operand
|
376 |
|
|
is ignored. Otherwise, if an exception is thrown, then the second
|
377 |
|
|
operand of the @code{GIMPLE_TRY_CATCH} is checked. The second
|
378 |
|
|
operand may have the following forms:
|
379 |
|
|
|
380 |
|
|
@enumerate
|
381 |
|
|
|
382 |
|
|
@item A sequence of statements to execute. When an exception occurs,
|
383 |
|
|
these statements are executed, and then the exception is rethrown.
|
384 |
|
|
|
385 |
|
|
@item A sequence of @code{GIMPLE_CATCH} statements. Each
|
386 |
|
|
@code{GIMPLE_CATCH} has a list of applicable exception types and
|
387 |
|
|
handler code. If the thrown exception matches one of the caught
|
388 |
|
|
types, the associated handler code is executed. If the handler
|
389 |
|
|
code falls off the bottom, execution continues after the original
|
390 |
|
|
@code{GIMPLE_TRY_CATCH}.
|
391 |
|
|
|
392 |
|
|
@item A @code{GIMPLE_EH_FILTER} statement. This has a list of
|
393 |
|
|
permitted exception types, and code to handle a match failure. If the
|
394 |
|
|
thrown exception does not match one of the allowed types, the
|
395 |
|
|
associated match failure code is executed. If the thrown exception
|
396 |
|
|
does match, it continues unwinding the stack looking for the next
|
397 |
|
|
handler.
|
398 |
|
|
|
399 |
|
|
@end enumerate
|
400 |
|
|
|
401 |
|
|
Currently throwing an exception is not directly represented in
|
402 |
|
|
GIMPLE, since it is implemented by calling a function. At some
|
403 |
|
|
point in the future we will want to add some way to express that
|
404 |
|
|
the call will throw an exception of a known type.
|
405 |
|
|
|
406 |
|
|
Just before running the optimizers, the compiler lowers the
|
407 |
|
|
high-level EH constructs above into a set of @samp{goto}s, magic
|
408 |
|
|
labels, and EH regions. Continuing to unwind at the end of a
|
409 |
|
|
cleanup is represented with a @code{GIMPLE_RESX}.
|
410 |
|
|
|
411 |
|
|
|
412 |
|
|
@node Temporaries
|
413 |
|
|
@section Temporaries
|
414 |
|
|
@cindex Temporaries
|
415 |
|
|
|
416 |
|
|
When gimplification encounters a subexpression that is too
|
417 |
|
|
complex, it creates a new temporary variable to hold the value of
|
418 |
|
|
the subexpression, and adds a new statement to initialize it
|
419 |
|
|
before the current statement. These special temporaries are known
|
420 |
|
|
as @samp{expression temporaries}, and are allocated using
|
421 |
|
|
@code{get_formal_tmp_var}. The compiler tries to always evaluate
|
422 |
|
|
identical expressions into the same temporary, to simplify
|
423 |
|
|
elimination of redundant calculations.
|
424 |
|
|
|
425 |
|
|
We can only use expression temporaries when we know that it will
|
426 |
|
|
not be reevaluated before its value is used, and that it will not
|
427 |
|
|
be otherwise modified@footnote{These restrictions are derived
|
428 |
|
|
from those in Morgan 4.8.}. Other temporaries can be allocated
|
429 |
|
|
using @code{get_initialized_tmp_var} or @code{create_tmp_var}.
|
430 |
|
|
|
431 |
|
|
Currently, an expression like @code{a = b + 5} is not reduced any
|
432 |
|
|
further. We tried converting it to something like
|
433 |
|
|
@smallexample
|
434 |
|
|
T1 = b + 5;
|
435 |
|
|
a = T1;
|
436 |
|
|
@end smallexample
|
437 |
|
|
but this bloated the representation for minimal benefit. However, a
|
438 |
|
|
variable which must live in memory cannot appear in an expression; its
|
439 |
|
|
value is explicitly loaded into a temporary first. Similarly, storing
|
440 |
|
|
the value of an expression to a memory variable goes through a
|
441 |
|
|
temporary.
|
442 |
|
|
|
443 |
|
|
@node Operands
|
444 |
|
|
@section Operands
|
445 |
|
|
@cindex Operands
|
446 |
|
|
|
447 |
|
|
In general, expressions in GIMPLE consist of an operation and the
|
448 |
|
|
appropriate number of simple operands; these operands must either be a
|
449 |
|
|
GIMPLE rvalue (@code{is_gimple_val}), i.e.@: a constant or a register
|
450 |
|
|
variable. More complex operands are factored out into temporaries, so
|
451 |
|
|
that
|
452 |
|
|
@smallexample
|
453 |
|
|
a = b + c + d
|
454 |
|
|
@end smallexample
|
455 |
|
|
becomes
|
456 |
|
|
@smallexample
|
457 |
|
|
T1 = b + c;
|
458 |
|
|
a = T1 + d;
|
459 |
|
|
@end smallexample
|
460 |
|
|
|
461 |
|
|
The same rule holds for arguments to a @code{GIMPLE_CALL}.
|
462 |
|
|
|
463 |
|
|
The target of an assignment is usually a variable, but can also be an
|
464 |
|
|
@code{INDIRECT_REF} or a compound lvalue as described below.
|
465 |
|
|
|
466 |
|
|
@menu
|
467 |
|
|
* Compound Expressions::
|
468 |
|
|
* Compound Lvalues::
|
469 |
|
|
* Conditional Expressions::
|
470 |
|
|
* Logical Operators::
|
471 |
|
|
@end menu
|
472 |
|
|
|
473 |
|
|
@node Compound Expressions
|
474 |
|
|
@subsection Compound Expressions
|
475 |
|
|
@cindex Compound Expressions
|
476 |
|
|
|
477 |
|
|
The left-hand side of a C comma expression is simply moved into a separate
|
478 |
|
|
statement.
|
479 |
|
|
|
480 |
|
|
@node Compound Lvalues
|
481 |
|
|
@subsection Compound Lvalues
|
482 |
|
|
@cindex Compound Lvalues
|
483 |
|
|
|
484 |
|
|
Currently compound lvalues involving array and structure field references
|
485 |
|
|
are not broken down; an expression like @code{a.b[2] = 42} is not reduced
|
486 |
|
|
any further (though complex array subscripts are). This restriction is a
|
487 |
|
|
workaround for limitations in later optimizers; if we were to convert this
|
488 |
|
|
to
|
489 |
|
|
|
490 |
|
|
@smallexample
|
491 |
|
|
T1 = &a.b;
|
492 |
|
|
T1[2] = 42;
|
493 |
|
|
@end smallexample
|
494 |
|
|
|
495 |
|
|
alias analysis would not remember that the reference to @code{T1[2]} came
|
496 |
|
|
by way of @code{a.b}, so it would think that the assignment could alias
|
497 |
|
|
another member of @code{a}; this broke @code{struct-alias-1.c}. Future
|
498 |
|
|
optimizer improvements may make this limitation unnecessary.
|
499 |
|
|
|
500 |
|
|
@node Conditional Expressions
|
501 |
|
|
@subsection Conditional Expressions
|
502 |
|
|
@cindex Conditional Expressions
|
503 |
|
|
|
504 |
|
|
A C @code{?:} expression is converted into an @code{if} statement with
|
505 |
|
|
each branch assigning to the same temporary. So,
|
506 |
|
|
|
507 |
|
|
@smallexample
|
508 |
|
|
a = b ? c : d;
|
509 |
|
|
@end smallexample
|
510 |
|
|
becomes
|
511 |
|
|
@smallexample
|
512 |
|
|
if (b == 1)
|
513 |
|
|
T1 = c;
|
514 |
|
|
else
|
515 |
|
|
T1 = d;
|
516 |
|
|
a = T1;
|
517 |
|
|
@end smallexample
|
518 |
|
|
|
519 |
|
|
The GIMPLE level if-conversion pass re-introduces @code{?:}
|
520 |
|
|
expression, if appropriate. It is used to vectorize loops with
|
521 |
|
|
conditions using vector conditional operations.
|
522 |
|
|
|
523 |
|
|
Note that in GIMPLE, @code{if} statements are represented using
|
524 |
|
|
@code{GIMPLE_COND}, as described below.
|
525 |
|
|
|
526 |
|
|
@node Logical Operators
|
527 |
|
|
@subsection Logical Operators
|
528 |
|
|
@cindex Logical Operators
|
529 |
|
|
|
530 |
|
|
Except when they appear in the condition operand of a
|
531 |
|
|
@code{GIMPLE_COND}, logical `and' and `or' operators are simplified
|
532 |
|
|
as follows: @code{a = b && c} becomes
|
533 |
|
|
|
534 |
|
|
@smallexample
|
535 |
|
|
T1 = (bool)b;
|
536 |
|
|
if (T1 == true)
|
537 |
|
|
T1 = (bool)c;
|
538 |
|
|
a = T1;
|
539 |
|
|
@end smallexample
|
540 |
|
|
|
541 |
|
|
Note that @code{T1} in this example cannot be an expression temporary,
|
542 |
|
|
because it has two different assignments.
|
543 |
|
|
|
544 |
|
|
@subsection Manipulating operands
|
545 |
|
|
|
546 |
|
|
All gimple operands are of type @code{tree}. But only certain
|
547 |
|
|
types of trees are allowed to be used as operand tuples. Basic
|
548 |
|
|
validation is controlled by the function
|
549 |
|
|
@code{get_gimple_rhs_class}, which given a tree code, returns an
|
550 |
|
|
@code{enum} with the following values of type @code{enum
|
551 |
|
|
gimple_rhs_class}
|
552 |
|
|
|
553 |
|
|
@itemize @bullet
|
554 |
|
|
@item @code{GIMPLE_INVALID_RHS}
|
555 |
|
|
The tree cannot be used as a GIMPLE operand.
|
556 |
|
|
|
557 |
|
|
@item @code{GIMPLE_BINARY_RHS}
|
558 |
|
|
The tree is a valid GIMPLE binary operation.
|
559 |
|
|
|
560 |
|
|
@item @code{GIMPLE_UNARY_RHS}
|
561 |
|
|
The tree is a valid GIMPLE unary operation.
|
562 |
|
|
|
563 |
|
|
@item @code{GIMPLE_SINGLE_RHS}
|
564 |
|
|
The tree is a single object, that cannot be split into simpler
|
565 |
|
|
operands (for instance, @code{SSA_NAME}, @code{VAR_DECL}, @code{COMPONENT_REF}, etc).
|
566 |
|
|
|
567 |
|
|
This operand class also acts as an escape hatch for tree nodes
|
568 |
|
|
that may be flattened out into the operand vector, but would need
|
569 |
|
|
more than two slots on the RHS. For instance, a @code{COND_EXPR}
|
570 |
|
|
expression of the form @code{(a op b) ? x : y} could be flattened
|
571 |
|
|
out on the operand vector using 4 slots, but it would also
|
572 |
|
|
require additional processing to distinguish @code{c = a op b}
|
573 |
|
|
from @code{c = a op b ? x : y}. Something similar occurs with
|
574 |
|
|
@code{ASSERT_EXPR}. In time, these special case tree
|
575 |
|
|
expressions should be flattened into the operand vector.
|
576 |
|
|
@end itemize
|
577 |
|
|
|
578 |
|
|
For tree nodes in the categories @code{GIMPLE_BINARY_RHS} and
|
579 |
|
|
@code{GIMPLE_UNARY_RHS}, they cannot be stored inside tuples directly.
|
580 |
|
|
They first need to be flattened and separated into individual
|
581 |
|
|
components. For instance, given the GENERIC expression
|
582 |
|
|
|
583 |
|
|
@smallexample
|
584 |
|
|
a = b + c
|
585 |
|
|
@end smallexample
|
586 |
|
|
|
587 |
|
|
its tree representation is:
|
588 |
|
|
|
589 |
|
|
@smallexample
|
590 |
|
|
MODIFY_EXPR <VAR_DECL <a>, PLUS_EXPR <VAR_DECL <b>, VAR_DECL <c>>>
|
591 |
|
|
@end smallexample
|
592 |
|
|
|
593 |
|
|
In this case, the GIMPLE form for this statement is logically
|
594 |
|
|
identical to its GENERIC form but in GIMPLE, the @code{PLUS_EXPR}
|
595 |
|
|
on the RHS of the assignment is not represented as a tree,
|
596 |
|
|
instead the two operands are taken out of the @code{PLUS_EXPR} sub-tree
|
597 |
|
|
and flattened into the GIMPLE tuple as follows:
|
598 |
|
|
|
599 |
|
|
@smallexample
|
600 |
|
|
GIMPLE_ASSIGN <PLUS_EXPR, VAR_DECL <a>, VAR_DECL <b>, VAR_DECL <c>>
|
601 |
|
|
@end smallexample
|
602 |
|
|
|
603 |
|
|
@subsection Operand vector allocation
|
604 |
|
|
|
605 |
|
|
The operand vector is stored at the bottom of the three tuple
|
606 |
|
|
structures that accept operands. This means, that depending on
|
607 |
|
|
the code of a given statement, its operand vector will be at
|
608 |
|
|
different offsets from the base of the structure. To access
|
609 |
|
|
tuple operands use the following accessors
|
610 |
|
|
|
611 |
|
|
@deftypefn {GIMPLE function} unsigned gimple_num_ops (gimple g)
|
612 |
|
|
Returns the number of operands in statement G.
|
613 |
|
|
@end deftypefn
|
614 |
|
|
|
615 |
|
|
@deftypefn {GIMPLE function} tree gimple_op (gimple g, unsigned i)
|
616 |
|
|
Returns operand @code{I} from statement @code{G}.
|
617 |
|
|
@end deftypefn
|
618 |
|
|
|
619 |
|
|
@deftypefn {GIMPLE function} tree *gimple_ops (gimple g)
|
620 |
|
|
Returns a pointer into the operand vector for statement @code{G}. This
|
621 |
|
|
is computed using an internal table called @code{gimple_ops_offset_}[].
|
622 |
|
|
This table is indexed by the gimple code of @code{G}.
|
623 |
|
|
|
624 |
|
|
When the compiler is built, this table is filled-in using the
|
625 |
|
|
sizes of the structures used by each statement code defined in
|
626 |
|
|
gimple.def. Since the operand vector is at the bottom of the
|
627 |
|
|
structure, for a gimple code @code{C} the offset is computed as sizeof
|
628 |
|
|
(struct-of @code{C}) - sizeof (tree).
|
629 |
|
|
|
630 |
|
|
This mechanism adds one memory indirection to every access when
|
631 |
|
|
using @code{gimple_op}(), if this becomes a bottleneck, a pass can
|
632 |
|
|
choose to memoize the result from @code{gimple_ops}() and use that to
|
633 |
|
|
access the operands.
|
634 |
|
|
@end deftypefn
|
635 |
|
|
|
636 |
|
|
@subsection Operand validation
|
637 |
|
|
|
638 |
|
|
When adding a new operand to a gimple statement, the operand will
|
639 |
|
|
be validated according to what each tuple accepts in its operand
|
640 |
|
|
vector. These predicates are called by the
|
641 |
|
|
@code{gimple_<name>_set_...()}. Each tuple will use one of the
|
642 |
|
|
following predicates (Note, this list is not exhaustive):
|
643 |
|
|
|
644 |
|
|
@deftypefn {GIMPLE function} is_gimple_operand (tree t)
|
645 |
|
|
This is the most permissive of the predicates. It essentially
|
646 |
|
|
checks whether t has a @code{gimple_rhs_class} of @code{GIMPLE_SINGLE_RHS}.
|
647 |
|
|
@end deftypefn
|
648 |
|
|
|
649 |
|
|
|
650 |
|
|
@deftypefn {GIMPLE function} is_gimple_val (tree t)
|
651 |
|
|
Returns true if t is a "GIMPLE value", which are all the
|
652 |
|
|
non-addressable stack variables (variables for which
|
653 |
|
|
@code{is_gimple_reg} returns true) and constants (expressions for which
|
654 |
|
|
@code{is_gimple_min_invariant} returns true).
|
655 |
|
|
@end deftypefn
|
656 |
|
|
|
657 |
|
|
@deftypefn {GIMPLE function} is_gimple_addressable (tree t)
|
658 |
|
|
Returns true if t is a symbol or memory reference whose address
|
659 |
|
|
can be taken.
|
660 |
|
|
@end deftypefn
|
661 |
|
|
|
662 |
|
|
@deftypefn {GIMPLE function} is_gimple_asm_val (tree t)
|
663 |
|
|
Similar to @code{is_gimple_val} but it also accepts hard registers.
|
664 |
|
|
@end deftypefn
|
665 |
|
|
|
666 |
|
|
@deftypefn {GIMPLE function} is_gimple_call_addr (tree t)
|
667 |
|
|
Return true if t is a valid expression to use as the function
|
668 |
|
|
called by a @code{GIMPLE_CALL}.
|
669 |
|
|
@end deftypefn
|
670 |
|
|
|
671 |
|
|
@deftypefn {GIMPLE function} is_gimple_constant (tree t)
|
672 |
|
|
Return true if t is a valid gimple constant.
|
673 |
|
|
@end deftypefn
|
674 |
|
|
|
675 |
|
|
@deftypefn {GIMPLE function} is_gimple_min_invariant (tree t)
|
676 |
|
|
Return true if t is a valid minimal invariant. This is different
|
677 |
|
|
from constants, in that the specific value of t may not be known
|
678 |
|
|
at compile time, but it is known that it doesn't change (e.g.,
|
679 |
|
|
the address of a function local variable).
|
680 |
|
|
@end deftypefn
|
681 |
|
|
|
682 |
|
|
@deftypefn {GIMPLE function} is_gimple_min_invariant_address (tree t)
|
683 |
|
|
Return true if t is an @code{ADDR_EXPR} that does not change once a
|
684 |
|
|
function is running.
|
685 |
|
|
@end deftypefn
|
686 |
|
|
|
687 |
|
|
@deftypefn {GIMPLE function} is_gimple_ip_invariant (tree t)
|
688 |
|
|
Return true if t is an interprocedural invariant. This means that t
|
689 |
|
|
is a valid invariant in all functions (e.g. it can be an address of a
|
690 |
|
|
global variable but not of a local one).
|
691 |
|
|
@end deftypefn
|
692 |
|
|
|
693 |
|
|
@deftypefn {GIMPLE function} is_gimple_ip_invariant_address (tree t)
|
694 |
|
|
Return true if t is an @code{ADDR_EXPR} that does not change once the
|
695 |
|
|
program is running (and which is valid in all functions).
|
696 |
|
|
@end deftypefn
|
697 |
|
|
|
698 |
|
|
|
699 |
|
|
@subsection Statement validation
|
700 |
|
|
|
701 |
|
|
@deftypefn {GIMPLE function} is_gimple_assign (gimple g)
|
702 |
|
|
Return true if the code of g is @code{GIMPLE_ASSIGN}.
|
703 |
|
|
@end deftypefn
|
704 |
|
|
|
705 |
|
|
@deftypefn {GIMPLE function} is_gimple_call (gimple g)
|
706 |
|
|
Return true if the code of g is @code{GIMPLE_CALL}.
|
707 |
|
|
@end deftypefn
|
708 |
|
|
|
709 |
|
|
@deftypefn {GIMPLE function} is_gimple_debug (gimple g)
|
710 |
|
|
Return true if the code of g is @code{GIMPLE_DEBUG}.
|
711 |
|
|
@end deftypefn
|
712 |
|
|
|
713 |
|
|
@deftypefn {GIMPLE function} gimple_assign_cast_p (gimple g)
|
714 |
|
|
Return true if g is a @code{GIMPLE_ASSIGN} that performs a type cast
|
715 |
|
|
operation.
|
716 |
|
|
@end deftypefn
|
717 |
|
|
|
718 |
|
|
@deftypefn {GIMPLE function} gimple_debug_bind_p (gimple g)
|
719 |
|
|
Return true if g is a @code{GIMPLE_DEBUG} that binds the value of an
|
720 |
|
|
expression to a variable.
|
721 |
|
|
@end deftypefn
|
722 |
|
|
|
723 |
|
|
@node Manipulating GIMPLE statements
|
724 |
|
|
@section Manipulating GIMPLE statements
|
725 |
|
|
@cindex Manipulating GIMPLE statements
|
726 |
|
|
|
727 |
|
|
This section documents all the functions available to handle each
|
728 |
|
|
of the GIMPLE instructions.
|
729 |
|
|
|
730 |
|
|
@subsection Common accessors
|
731 |
|
|
The following are common accessors for gimple statements.
|
732 |
|
|
|
733 |
|
|
@deftypefn {GIMPLE function} enum gimple_code gimple_code (gimple g)
|
734 |
|
|
Return the code for statement @code{G}.
|
735 |
|
|
@end deftypefn
|
736 |
|
|
|
737 |
|
|
@deftypefn {GIMPLE function} basic_block gimple_bb (gimple g)
|
738 |
|
|
Return the basic block to which statement @code{G} belongs to.
|
739 |
|
|
@end deftypefn
|
740 |
|
|
|
741 |
|
|
@deftypefn {GIMPLE function} tree gimple_block (gimple g)
|
742 |
|
|
Return the lexical scope block holding statement @code{G}.
|
743 |
|
|
@end deftypefn
|
744 |
|
|
|
745 |
|
|
@deftypefn {GIMPLE function} tree gimple_expr_type (gimple stmt)
|
746 |
|
|
Return the type of the main expression computed by @code{STMT}. Return
|
747 |
|
|
@code{void_type_node} if @code{STMT} computes nothing. This will only return
|
748 |
|
|
something meaningful for @code{GIMPLE_ASSIGN}, @code{GIMPLE_COND} and
|
749 |
|
|
@code{GIMPLE_CALL}. For all other tuple codes, it will return
|
750 |
|
|
@code{void_type_node}.
|
751 |
|
|
@end deftypefn
|
752 |
|
|
|
753 |
|
|
@deftypefn {GIMPLE function} enum tree_code gimple_expr_code (gimple stmt)
|
754 |
|
|
Return the tree code for the expression computed by @code{STMT}. This
|
755 |
|
|
is only meaningful for @code{GIMPLE_CALL}, @code{GIMPLE_ASSIGN} and
|
756 |
|
|
@code{GIMPLE_COND}. If @code{STMT} is @code{GIMPLE_CALL}, it will return @code{CALL_EXPR}.
|
757 |
|
|
For @code{GIMPLE_COND}, it returns the code of the comparison predicate.
|
758 |
|
|
For @code{GIMPLE_ASSIGN} it returns the code of the operation performed
|
759 |
|
|
by the @code{RHS} of the assignment.
|
760 |
|
|
@end deftypefn
|
761 |
|
|
|
762 |
|
|
@deftypefn {GIMPLE function} void gimple_set_block (gimple g, tree block)
|
763 |
|
|
Set the lexical scope block of @code{G} to @code{BLOCK}.
|
764 |
|
|
@end deftypefn
|
765 |
|
|
|
766 |
|
|
@deftypefn {GIMPLE function} location_t gimple_locus (gimple g)
|
767 |
|
|
Return locus information for statement @code{G}.
|
768 |
|
|
@end deftypefn
|
769 |
|
|
|
770 |
|
|
@deftypefn {GIMPLE function} void gimple_set_locus (gimple g, location_t locus)
|
771 |
|
|
Set locus information for statement @code{G}.
|
772 |
|
|
@end deftypefn
|
773 |
|
|
|
774 |
|
|
@deftypefn {GIMPLE function} bool gimple_locus_empty_p (gimple g)
|
775 |
|
|
Return true if @code{G} does not have locus information.
|
776 |
|
|
@end deftypefn
|
777 |
|
|
|
778 |
|
|
@deftypefn {GIMPLE function} bool gimple_no_warning_p (gimple stmt)
|
779 |
|
|
Return true if no warnings should be emitted for statement @code{STMT}.
|
780 |
|
|
@end deftypefn
|
781 |
|
|
|
782 |
|
|
@deftypefn {GIMPLE function} void gimple_set_visited (gimple stmt, bool visited_p)
|
783 |
|
|
Set the visited status on statement @code{STMT} to @code{VISITED_P}.
|
784 |
|
|
@end deftypefn
|
785 |
|
|
|
786 |
|
|
@deftypefn {GIMPLE function} bool gimple_visited_p (gimple stmt)
|
787 |
|
|
Return the visited status on statement @code{STMT}.
|
788 |
|
|
@end deftypefn
|
789 |
|
|
|
790 |
|
|
@deftypefn {GIMPLE function} void gimple_set_plf (gimple stmt, enum plf_mask plf, bool val_p)
|
791 |
|
|
Set pass local flag @code{PLF} on statement @code{STMT} to @code{VAL_P}.
|
792 |
|
|
@end deftypefn
|
793 |
|
|
|
794 |
|
|
@deftypefn {GIMPLE function} unsigned int gimple_plf (gimple stmt, enum plf_mask plf)
|
795 |
|
|
Return the value of pass local flag @code{PLF} on statement @code{STMT}.
|
796 |
|
|
@end deftypefn
|
797 |
|
|
|
798 |
|
|
@deftypefn {GIMPLE function} bool gimple_has_ops (gimple g)
|
799 |
|
|
Return true if statement @code{G} has register or memory operands.
|
800 |
|
|
@end deftypefn
|
801 |
|
|
|
802 |
|
|
@deftypefn {GIMPLE function} bool gimple_has_mem_ops (gimple g)
|
803 |
|
|
Return true if statement @code{G} has memory operands.
|
804 |
|
|
@end deftypefn
|
805 |
|
|
|
806 |
|
|
@deftypefn {GIMPLE function} unsigned gimple_num_ops (gimple g)
|
807 |
|
|
Return the number of operands for statement @code{G}.
|
808 |
|
|
@end deftypefn
|
809 |
|
|
|
810 |
|
|
@deftypefn {GIMPLE function} tree *gimple_ops (gimple g)
|
811 |
|
|
Return the array of operands for statement @code{G}.
|
812 |
|
|
@end deftypefn
|
813 |
|
|
|
814 |
|
|
@deftypefn {GIMPLE function} tree gimple_op (gimple g, unsigned i)
|
815 |
|
|
Return operand @code{I} for statement @code{G}.
|
816 |
|
|
@end deftypefn
|
817 |
|
|
|
818 |
|
|
@deftypefn {GIMPLE function} tree *gimple_op_ptr (gimple g, unsigned i)
|
819 |
|
|
Return a pointer to operand @code{I} for statement @code{G}.
|
820 |
|
|
@end deftypefn
|
821 |
|
|
|
822 |
|
|
@deftypefn {GIMPLE function} void gimple_set_op (gimple g, unsigned i, tree op)
|
823 |
|
|
Set operand @code{I} of statement @code{G} to @code{OP}.
|
824 |
|
|
@end deftypefn
|
825 |
|
|
|
826 |
|
|
@deftypefn {GIMPLE function} bitmap gimple_addresses_taken (gimple stmt)
|
827 |
|
|
Return the set of symbols that have had their address taken by
|
828 |
|
|
@code{STMT}.
|
829 |
|
|
@end deftypefn
|
830 |
|
|
|
831 |
|
|
@deftypefn {GIMPLE function} struct def_optype_d *gimple_def_ops (gimple g)
|
832 |
|
|
Return the set of @code{DEF} operands for statement @code{G}.
|
833 |
|
|
@end deftypefn
|
834 |
|
|
|
835 |
|
|
@deftypefn {GIMPLE function} void gimple_set_def_ops (gimple g, struct def_optype_d *def)
|
836 |
|
|
Set @code{DEF} to be the set of @code{DEF} operands for statement @code{G}.
|
837 |
|
|
@end deftypefn
|
838 |
|
|
|
839 |
|
|
@deftypefn {GIMPLE function} struct use_optype_d *gimple_use_ops (gimple g)
|
840 |
|
|
Return the set of @code{USE} operands for statement @code{G}.
|
841 |
|
|
@end deftypefn
|
842 |
|
|
|
843 |
|
|
@deftypefn {GIMPLE function} void gimple_set_use_ops (gimple g, struct use_optype_d *use)
|
844 |
|
|
Set @code{USE} to be the set of @code{USE} operands for statement @code{G}.
|
845 |
|
|
@end deftypefn
|
846 |
|
|
|
847 |
|
|
@deftypefn {GIMPLE function} struct voptype_d *gimple_vuse_ops (gimple g)
|
848 |
|
|
Return the set of @code{VUSE} operands for statement @code{G}.
|
849 |
|
|
@end deftypefn
|
850 |
|
|
|
851 |
|
|
@deftypefn {GIMPLE function} void gimple_set_vuse_ops (gimple g, struct voptype_d *ops)
|
852 |
|
|
Set @code{OPS} to be the set of @code{VUSE} operands for statement @code{G}.
|
853 |
|
|
@end deftypefn
|
854 |
|
|
|
855 |
|
|
@deftypefn {GIMPLE function} struct voptype_d *gimple_vdef_ops (gimple g)
|
856 |
|
|
Return the set of @code{VDEF} operands for statement @code{G}.
|
857 |
|
|
@end deftypefn
|
858 |
|
|
|
859 |
|
|
@deftypefn {GIMPLE function} void gimple_set_vdef_ops (gimple g, struct voptype_d *ops)
|
860 |
|
|
Set @code{OPS} to be the set of @code{VDEF} operands for statement @code{G}.
|
861 |
|
|
@end deftypefn
|
862 |
|
|
|
863 |
|
|
@deftypefn {GIMPLE function} bitmap gimple_loaded_syms (gimple g)
|
864 |
|
|
Return the set of symbols loaded by statement @code{G}. Each element of
|
865 |
|
|
the set is the @code{DECL_UID} of the corresponding symbol.
|
866 |
|
|
@end deftypefn
|
867 |
|
|
|
868 |
|
|
@deftypefn {GIMPLE function} bitmap gimple_stored_syms (gimple g)
|
869 |
|
|
Return the set of symbols stored by statement @code{G}. Each element of
|
870 |
|
|
the set is the @code{DECL_UID} of the corresponding symbol.
|
871 |
|
|
@end deftypefn
|
872 |
|
|
|
873 |
|
|
@deftypefn {GIMPLE function} bool gimple_modified_p (gimple g)
|
874 |
|
|
Return true if statement @code{G} has operands and the modified field
|
875 |
|
|
has been set.
|
876 |
|
|
@end deftypefn
|
877 |
|
|
|
878 |
|
|
@deftypefn {GIMPLE function} bool gimple_has_volatile_ops (gimple stmt)
|
879 |
|
|
Return true if statement @code{STMT} contains volatile operands.
|
880 |
|
|
@end deftypefn
|
881 |
|
|
|
882 |
|
|
@deftypefn {GIMPLE function} void gimple_set_has_volatile_ops (gimple stmt, bool volatilep)
|
883 |
|
|
Return true if statement @code{STMT} contains volatile operands.
|
884 |
|
|
@end deftypefn
|
885 |
|
|
|
886 |
|
|
@deftypefn {GIMPLE function} void update_stmt (gimple s)
|
887 |
|
|
Mark statement @code{S} as modified, and update it.
|
888 |
|
|
@end deftypefn
|
889 |
|
|
|
890 |
|
|
@deftypefn {GIMPLE function} void update_stmt_if_modified (gimple s)
|
891 |
|
|
Update statement @code{S} if it has been marked modified.
|
892 |
|
|
@end deftypefn
|
893 |
|
|
|
894 |
|
|
@deftypefn {GIMPLE function} gimple gimple_copy (gimple stmt)
|
895 |
|
|
Return a deep copy of statement @code{STMT}.
|
896 |
|
|
@end deftypefn
|
897 |
|
|
|
898 |
|
|
@node Tuple specific accessors
|
899 |
|
|
@section Tuple specific accessors
|
900 |
|
|
@cindex Tuple specific accessors
|
901 |
|
|
|
902 |
|
|
@menu
|
903 |
|
|
* @code{GIMPLE_ASM}::
|
904 |
|
|
* @code{GIMPLE_ASSIGN}::
|
905 |
|
|
* @code{GIMPLE_BIND}::
|
906 |
|
|
* @code{GIMPLE_CALL}::
|
907 |
|
|
* @code{GIMPLE_CATCH}::
|
908 |
|
|
* @code{GIMPLE_COND}::
|
909 |
|
|
* @code{GIMPLE_DEBUG}::
|
910 |
|
|
* @code{GIMPLE_EH_FILTER}::
|
911 |
|
|
* @code{GIMPLE_LABEL}::
|
912 |
|
|
* @code{GIMPLE_NOP}::
|
913 |
|
|
* @code{GIMPLE_OMP_ATOMIC_LOAD}::
|
914 |
|
|
* @code{GIMPLE_OMP_ATOMIC_STORE}::
|
915 |
|
|
* @code{GIMPLE_OMP_CONTINUE}::
|
916 |
|
|
* @code{GIMPLE_OMP_CRITICAL}::
|
917 |
|
|
* @code{GIMPLE_OMP_FOR}::
|
918 |
|
|
* @code{GIMPLE_OMP_MASTER}::
|
919 |
|
|
* @code{GIMPLE_OMP_ORDERED}::
|
920 |
|
|
* @code{GIMPLE_OMP_PARALLEL}::
|
921 |
|
|
* @code{GIMPLE_OMP_RETURN}::
|
922 |
|
|
* @code{GIMPLE_OMP_SECTION}::
|
923 |
|
|
* @code{GIMPLE_OMP_SECTIONS}::
|
924 |
|
|
* @code{GIMPLE_OMP_SINGLE}::
|
925 |
|
|
* @code{GIMPLE_PHI}::
|
926 |
|
|
* @code{GIMPLE_RESX}::
|
927 |
|
|
* @code{GIMPLE_RETURN}::
|
928 |
|
|
* @code{GIMPLE_SWITCH}::
|
929 |
|
|
* @code{GIMPLE_TRY}::
|
930 |
|
|
* @code{GIMPLE_WITH_CLEANUP_EXPR}::
|
931 |
|
|
@end menu
|
932 |
|
|
|
933 |
|
|
|
934 |
|
|
@node @code{GIMPLE_ASM}
|
935 |
|
|
@subsection @code{GIMPLE_ASM}
|
936 |
|
|
@cindex @code{GIMPLE_ASM}
|
937 |
|
|
|
938 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_asm (const char *string, ninputs, noutputs, nclobbers, ...)
|
939 |
|
|
Build a @code{GIMPLE_ASM} statement. This statement is used for
|
940 |
|
|
building in-line assembly constructs. @code{STRING} is the assembly
|
941 |
|
|
code. @code{NINPUT} is the number of register inputs. @code{NOUTPUT} is the
|
942 |
|
|
number of register outputs. @code{NCLOBBERS} is the number of clobbered
|
943 |
|
|
registers. The rest of the arguments trees for each input,
|
944 |
|
|
output, and clobbered registers.
|
945 |
|
|
@end deftypefn
|
946 |
|
|
|
947 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_asm_vec (const char *, VEC(tree,gc) *, VEC(tree,gc) *, VEC(tree,gc) *)
|
948 |
|
|
Identical to gimple_build_asm, but the arguments are passed in
|
949 |
|
|
VECs.
|
950 |
|
|
@end deftypefn
|
951 |
|
|
|
952 |
|
|
@deftypefn {GIMPLE function} gimple_asm_ninputs (gimple g)
|
953 |
|
|
Return the number of input operands for @code{GIMPLE_ASM} @code{G}.
|
954 |
|
|
@end deftypefn
|
955 |
|
|
|
956 |
|
|
@deftypefn {GIMPLE function} gimple_asm_noutputs (gimple g)
|
957 |
|
|
Return the number of output operands for @code{GIMPLE_ASM} @code{G}.
|
958 |
|
|
@end deftypefn
|
959 |
|
|
|
960 |
|
|
@deftypefn {GIMPLE function} gimple_asm_nclobbers (gimple g)
|
961 |
|
|
Return the number of clobber operands for @code{GIMPLE_ASM} @code{G}.
|
962 |
|
|
@end deftypefn
|
963 |
|
|
|
964 |
|
|
@deftypefn {GIMPLE function} tree gimple_asm_input_op (gimple g, unsigned index)
|
965 |
|
|
Return input operand @code{INDEX} of @code{GIMPLE_ASM} @code{G}.
|
966 |
|
|
@end deftypefn
|
967 |
|
|
|
968 |
|
|
@deftypefn {GIMPLE function} void gimple_asm_set_input_op (gimple g, unsigned index, tree in_op)
|
969 |
|
|
Set @code{IN_OP} to be input operand @code{INDEX} in @code{GIMPLE_ASM} @code{G}.
|
970 |
|
|
@end deftypefn
|
971 |
|
|
|
972 |
|
|
@deftypefn {GIMPLE function} tree gimple_asm_output_op (gimple g, unsigned index)
|
973 |
|
|
Return output operand @code{INDEX} of @code{GIMPLE_ASM} @code{G}.
|
974 |
|
|
@end deftypefn
|
975 |
|
|
|
976 |
|
|
@deftypefn {GIMPLE function} void gimple_asm_set_output_op (gimple g, @
|
977 |
|
|
unsigned index, tree out_op)
|
978 |
|
|
Set @code{OUT_OP} to be output operand @code{INDEX} in @code{GIMPLE_ASM} @code{G}.
|
979 |
|
|
@end deftypefn
|
980 |
|
|
|
981 |
|
|
@deftypefn {GIMPLE function} tree gimple_asm_clobber_op (gimple g, unsigned index)
|
982 |
|
|
Return clobber operand @code{INDEX} of @code{GIMPLE_ASM} @code{G}.
|
983 |
|
|
@end deftypefn
|
984 |
|
|
|
985 |
|
|
@deftypefn {GIMPLE function} void gimple_asm_set_clobber_op (gimple g, unsigned index, tree clobber_op)
|
986 |
|
|
Set @code{CLOBBER_OP} to be clobber operand @code{INDEX} in @code{GIMPLE_ASM} @code{G}.
|
987 |
|
|
@end deftypefn
|
988 |
|
|
|
989 |
|
|
@deftypefn {GIMPLE function} const char *gimple_asm_string (gimple g)
|
990 |
|
|
Return the string representing the assembly instruction in
|
991 |
|
|
@code{GIMPLE_ASM} @code{G}.
|
992 |
|
|
@end deftypefn
|
993 |
|
|
|
994 |
|
|
@deftypefn {GIMPLE function} bool gimple_asm_volatile_p (gimple g)
|
995 |
|
|
Return true if @code{G} is an asm statement marked volatile.
|
996 |
|
|
@end deftypefn
|
997 |
|
|
|
998 |
|
|
@deftypefn {GIMPLE function} void gimple_asm_set_volatile (gimple g)
|
999 |
|
|
Mark asm statement @code{G} as volatile.
|
1000 |
|
|
@end deftypefn
|
1001 |
|
|
|
1002 |
|
|
@deftypefn {GIMPLE function} void gimple_asm_clear_volatile (gimple g)
|
1003 |
|
|
Remove volatile marker from asm statement @code{G}.
|
1004 |
|
|
@end deftypefn
|
1005 |
|
|
|
1006 |
|
|
@node @code{GIMPLE_ASSIGN}
|
1007 |
|
|
@subsection @code{GIMPLE_ASSIGN}
|
1008 |
|
|
@cindex @code{GIMPLE_ASSIGN}
|
1009 |
|
|
|
1010 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_assign (tree lhs, tree rhs)
|
1011 |
|
|
Build a @code{GIMPLE_ASSIGN} statement. The left-hand side is an lvalue
|
1012 |
|
|
passed in lhs. The right-hand side can be either a unary or
|
1013 |
|
|
binary tree expression. The expression tree rhs will be
|
1014 |
|
|
flattened and its operands assigned to the corresponding operand
|
1015 |
|
|
slots in the new statement. This function is useful when you
|
1016 |
|
|
already have a tree expression that you want to convert into a
|
1017 |
|
|
tuple. However, try to avoid building expression trees for the
|
1018 |
|
|
sole purpose of calling this function. If you already have the
|
1019 |
|
|
operands in separate trees, it is better to use
|
1020 |
|
|
@code{gimple_build_assign_with_ops}.
|
1021 |
|
|
@end deftypefn
|
1022 |
|
|
|
1023 |
|
|
|
1024 |
|
|
@deftypefn {GIMPLE function} gimple gimplify_assign (tree dst, tree src, gimple_seq *seq_p)
|
1025 |
|
|
Build a new @code{GIMPLE_ASSIGN} tuple and append it to the end of
|
1026 |
|
|
@code{*SEQ_P}.
|
1027 |
|
|
@end deftypefn
|
1028 |
|
|
|
1029 |
|
|
@code{DST}/@code{SRC} are the destination and source respectively. You can
|
1030 |
|
|
pass ungimplified trees in @code{DST} or @code{SRC}, in which
|
1031 |
|
|
case they will be converted to a gimple operand if necessary.
|
1032 |
|
|
|
1033 |
|
|
This function returns the newly created @code{GIMPLE_ASSIGN} tuple.
|
1034 |
|
|
|
1035 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_assign_with_ops @
|
1036 |
|
|
(enum tree_code subcode, tree lhs, tree op1, tree op2)
|
1037 |
|
|
This function is similar to @code{gimple_build_assign}, but is used to
|
1038 |
|
|
build a @code{GIMPLE_ASSIGN} statement when the operands of the
|
1039 |
|
|
right-hand side of the assignment are already split into
|
1040 |
|
|
different operands.
|
1041 |
|
|
|
1042 |
|
|
The left-hand side is an lvalue passed in lhs. Subcode is the
|
1043 |
|
|
@code{tree_code} for the right-hand side of the assignment. Op1 and op2
|
1044 |
|
|
are the operands. If op2 is null, subcode must be a @code{tree_code}
|
1045 |
|
|
for a unary expression.
|
1046 |
|
|
@end deftypefn
|
1047 |
|
|
|
1048 |
|
|
@deftypefn {GIMPLE function} enum tree_code gimple_assign_rhs_code (gimple g)
|
1049 |
|
|
Return the code of the expression computed on the @code{RHS} of
|
1050 |
|
|
assignment statement @code{G}.
|
1051 |
|
|
@end deftypefn
|
1052 |
|
|
|
1053 |
|
|
|
1054 |
|
|
@deftypefn {GIMPLE function} enum gimple_rhs_class gimple_assign_rhs_class (gimple g)
|
1055 |
|
|
Return the gimple rhs class of the code for the expression
|
1056 |
|
|
computed on the rhs of assignment statement @code{G}. This will never
|
1057 |
|
|
return @code{GIMPLE_INVALID_RHS}.
|
1058 |
|
|
@end deftypefn
|
1059 |
|
|
|
1060 |
|
|
@deftypefn {GIMPLE function} tree gimple_assign_lhs (gimple g)
|
1061 |
|
|
Return the @code{LHS} of assignment statement @code{G}.
|
1062 |
|
|
@end deftypefn
|
1063 |
|
|
|
1064 |
|
|
@deftypefn {GIMPLE function} tree *gimple_assign_lhs_ptr (gimple g)
|
1065 |
|
|
Return a pointer to the @code{LHS} of assignment statement @code{G}.
|
1066 |
|
|
@end deftypefn
|
1067 |
|
|
|
1068 |
|
|
@deftypefn {GIMPLE function} tree gimple_assign_rhs1 (gimple g)
|
1069 |
|
|
Return the first operand on the @code{RHS} of assignment statement @code{G}.
|
1070 |
|
|
@end deftypefn
|
1071 |
|
|
|
1072 |
|
|
@deftypefn {GIMPLE function} tree *gimple_assign_rhs1_ptr (gimple g)
|
1073 |
|
|
Return the address of the first operand on the @code{RHS} of assignment
|
1074 |
|
|
statement @code{G}.
|
1075 |
|
|
@end deftypefn
|
1076 |
|
|
|
1077 |
|
|
@deftypefn {GIMPLE function} tree gimple_assign_rhs2 (gimple g)
|
1078 |
|
|
Return the second operand on the @code{RHS} of assignment statement @code{G}.
|
1079 |
|
|
@end deftypefn
|
1080 |
|
|
|
1081 |
|
|
@deftypefn {GIMPLE function} tree *gimple_assign_rhs2_ptr (gimple g)
|
1082 |
|
|
Return the address of the second operand on the @code{RHS} of assignment
|
1083 |
|
|
statement @code{G}.
|
1084 |
|
|
@end deftypefn
|
1085 |
|
|
|
1086 |
|
|
@deftypefn {GIMPLE function} void gimple_assign_set_lhs (gimple g, tree lhs)
|
1087 |
|
|
Set @code{LHS} to be the @code{LHS} operand of assignment statement @code{G}.
|
1088 |
|
|
@end deftypefn
|
1089 |
|
|
|
1090 |
|
|
@deftypefn {GIMPLE function} void gimple_assign_set_rhs1 (gimple g, tree rhs)
|
1091 |
|
|
Set @code{RHS} to be the first operand on the @code{RHS} of assignment
|
1092 |
|
|
statement @code{G}.
|
1093 |
|
|
@end deftypefn
|
1094 |
|
|
|
1095 |
|
|
@deftypefn {GIMPLE function} tree gimple_assign_rhs2 (gimple g)
|
1096 |
|
|
Return the second operand on the @code{RHS} of assignment statement @code{G}.
|
1097 |
|
|
@end deftypefn
|
1098 |
|
|
|
1099 |
|
|
@deftypefn {GIMPLE function} tree *gimple_assign_rhs2_ptr (gimple g)
|
1100 |
|
|
Return a pointer to the second operand on the @code{RHS} of assignment
|
1101 |
|
|
statement @code{G}.
|
1102 |
|
|
@end deftypefn
|
1103 |
|
|
|
1104 |
|
|
@deftypefn {GIMPLE function} void gimple_assign_set_rhs2 (gimple g, tree rhs)
|
1105 |
|
|
Set @code{RHS} to be the second operand on the @code{RHS} of assignment
|
1106 |
|
|
statement @code{G}.
|
1107 |
|
|
@end deftypefn
|
1108 |
|
|
|
1109 |
|
|
@deftypefn {GIMPLE function} bool gimple_assign_cast_p (gimple s)
|
1110 |
|
|
Return true if @code{S} is a type-cast assignment.
|
1111 |
|
|
@end deftypefn
|
1112 |
|
|
|
1113 |
|
|
|
1114 |
|
|
@node @code{GIMPLE_BIND}
|
1115 |
|
|
@subsection @code{GIMPLE_BIND}
|
1116 |
|
|
@cindex @code{GIMPLE_BIND}
|
1117 |
|
|
|
1118 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_bind (tree vars, gimple_seq body)
|
1119 |
|
|
Build a @code{GIMPLE_BIND} statement with a list of variables in @code{VARS}
|
1120 |
|
|
and a body of statements in sequence @code{BODY}.
|
1121 |
|
|
@end deftypefn
|
1122 |
|
|
|
1123 |
|
|
@deftypefn {GIMPLE function} tree gimple_bind_vars (gimple g)
|
1124 |
|
|
Return the variables declared in the @code{GIMPLE_BIND} statement @code{G}.
|
1125 |
|
|
@end deftypefn
|
1126 |
|
|
|
1127 |
|
|
@deftypefn {GIMPLE function} void gimple_bind_set_vars (gimple g, tree vars)
|
1128 |
|
|
Set @code{VARS} to be the set of variables declared in the @code{GIMPLE_BIND}
|
1129 |
|
|
statement @code{G}.
|
1130 |
|
|
@end deftypefn
|
1131 |
|
|
|
1132 |
|
|
@deftypefn {GIMPLE function} void gimple_bind_append_vars (gimple g, tree vars)
|
1133 |
|
|
Append @code{VARS} to the set of variables declared in the @code{GIMPLE_BIND}
|
1134 |
|
|
statement @code{G}.
|
1135 |
|
|
@end deftypefn
|
1136 |
|
|
|
1137 |
|
|
@deftypefn {GIMPLE function} gimple_seq gimple_bind_body (gimple g)
|
1138 |
|
|
Return the GIMPLE sequence contained in the @code{GIMPLE_BIND} statement
|
1139 |
|
|
@code{G}.
|
1140 |
|
|
@end deftypefn
|
1141 |
|
|
|
1142 |
|
|
@deftypefn {GIMPLE function} void gimple_bind_set_body (gimple g, gimple_seq seq)
|
1143 |
|
|
Set @code{SEQ} to be sequence contained in the @code{GIMPLE_BIND} statement @code{G}.
|
1144 |
|
|
@end deftypefn
|
1145 |
|
|
|
1146 |
|
|
@deftypefn {GIMPLE function} void gimple_bind_add_stmt (gimple gs, gimple stmt)
|
1147 |
|
|
Append a statement to the end of a @code{GIMPLE_BIND}'s body.
|
1148 |
|
|
@end deftypefn
|
1149 |
|
|
|
1150 |
|
|
@deftypefn {GIMPLE function} void gimple_bind_add_seq (gimple gs, gimple_seq seq)
|
1151 |
|
|
Append a sequence of statements to the end of a @code{GIMPLE_BIND}'s
|
1152 |
|
|
body.
|
1153 |
|
|
@end deftypefn
|
1154 |
|
|
|
1155 |
|
|
@deftypefn {GIMPLE function} tree gimple_bind_block (gimple g)
|
1156 |
|
|
Return the @code{TREE_BLOCK} node associated with @code{GIMPLE_BIND} statement
|
1157 |
|
|
@code{G}. This is analogous to the @code{BIND_EXPR_BLOCK} field in trees.
|
1158 |
|
|
@end deftypefn
|
1159 |
|
|
|
1160 |
|
|
@deftypefn {GIMPLE function} void gimple_bind_set_block (gimple g, tree block)
|
1161 |
|
|
Set @code{BLOCK} to be the @code{TREE_BLOCK} node associated with @code{GIMPLE_BIND}
|
1162 |
|
|
statement @code{G}.
|
1163 |
|
|
@end deftypefn
|
1164 |
|
|
|
1165 |
|
|
|
1166 |
|
|
@node @code{GIMPLE_CALL}
|
1167 |
|
|
@subsection @code{GIMPLE_CALL}
|
1168 |
|
|
@cindex @code{GIMPLE_CALL}
|
1169 |
|
|
|
1170 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_call (tree fn, unsigned nargs, ...)
|
1171 |
|
|
Build a @code{GIMPLE_CALL} statement to function @code{FN}. The argument @code{FN}
|
1172 |
|
|
must be either a @code{FUNCTION_DECL} or a gimple call address as
|
1173 |
|
|
determined by @code{is_gimple_call_addr}. @code{NARGS} are the number of
|
1174 |
|
|
arguments. The rest of the arguments follow the argument @code{NARGS},
|
1175 |
|
|
and must be trees that are valid as rvalues in gimple (i.e., each
|
1176 |
|
|
operand is validated with @code{is_gimple_operand}).
|
1177 |
|
|
@end deftypefn
|
1178 |
|
|
|
1179 |
|
|
|
1180 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_call_from_tree (tree call_expr)
|
1181 |
|
|
Build a @code{GIMPLE_CALL} from a @code{CALL_EXPR} node. The arguments and the
|
1182 |
|
|
function are taken from the expression directly. This routine
|
1183 |
|
|
assumes that @code{call_expr} is already in GIMPLE form. That is, its
|
1184 |
|
|
operands are GIMPLE values and the function call needs no further
|
1185 |
|
|
simplification. All the call flags in @code{call_expr} are copied over
|
1186 |
|
|
to the new @code{GIMPLE_CALL}.
|
1187 |
|
|
@end deftypefn
|
1188 |
|
|
|
1189 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_call_vec (tree fn, @code{VEC}(tree, heap) *args)
|
1190 |
|
|
Identical to @code{gimple_build_call} but the arguments are stored in a
|
1191 |
|
|
@code{VEC}().
|
1192 |
|
|
@end deftypefn
|
1193 |
|
|
|
1194 |
|
|
@deftypefn {GIMPLE function} tree gimple_call_lhs (gimple g)
|
1195 |
|
|
Return the @code{LHS} of call statement @code{G}.
|
1196 |
|
|
@end deftypefn
|
1197 |
|
|
|
1198 |
|
|
@deftypefn {GIMPLE function} tree *gimple_call_lhs_ptr (gimple g)
|
1199 |
|
|
Return a pointer to the @code{LHS} of call statement @code{G}.
|
1200 |
|
|
@end deftypefn
|
1201 |
|
|
|
1202 |
|
|
@deftypefn {GIMPLE function} void gimple_call_set_lhs (gimple g, tree lhs)
|
1203 |
|
|
Set @code{LHS} to be the @code{LHS} operand of call statement @code{G}.
|
1204 |
|
|
@end deftypefn
|
1205 |
|
|
|
1206 |
|
|
@deftypefn {GIMPLE function} tree gimple_call_fn (gimple g)
|
1207 |
|
|
Return the tree node representing the function called by call
|
1208 |
|
|
statement @code{G}.
|
1209 |
|
|
@end deftypefn
|
1210 |
|
|
|
1211 |
|
|
@deftypefn {GIMPLE function} void gimple_call_set_fn (gimple g, tree fn)
|
1212 |
|
|
Set @code{FN} to be the function called by call statement @code{G}. This has
|
1213 |
|
|
to be a gimple value specifying the address of the called
|
1214 |
|
|
function.
|
1215 |
|
|
@end deftypefn
|
1216 |
|
|
|
1217 |
|
|
@deftypefn {GIMPLE function} tree gimple_call_fndecl (gimple g)
|
1218 |
|
|
If a given @code{GIMPLE_CALL}'s callee is a @code{FUNCTION_DECL}, return it.
|
1219 |
|
|
Otherwise return @code{NULL}. This function is analogous to
|
1220 |
|
|
@code{get_callee_fndecl} in @code{GENERIC}.
|
1221 |
|
|
@end deftypefn
|
1222 |
|
|
|
1223 |
|
|
@deftypefn {GIMPLE function} tree gimple_call_set_fndecl (gimple g, tree fndecl)
|
1224 |
|
|
Set the called function to @code{FNDECL}.
|
1225 |
|
|
@end deftypefn
|
1226 |
|
|
|
1227 |
|
|
@deftypefn {GIMPLE function} tree gimple_call_return_type (gimple g)
|
1228 |
|
|
Return the type returned by call statement @code{G}.
|
1229 |
|
|
@end deftypefn
|
1230 |
|
|
|
1231 |
|
|
@deftypefn {GIMPLE function} tree gimple_call_chain (gimple g)
|
1232 |
|
|
Return the static chain for call statement @code{G}.
|
1233 |
|
|
@end deftypefn
|
1234 |
|
|
|
1235 |
|
|
@deftypefn {GIMPLE function} void gimple_call_set_chain (gimple g, tree chain)
|
1236 |
|
|
Set @code{CHAIN} to be the static chain for call statement @code{G}.
|
1237 |
|
|
@end deftypefn
|
1238 |
|
|
|
1239 |
|
|
@deftypefn {GIMPLE function} gimple_call_num_args (gimple g)
|
1240 |
|
|
Return the number of arguments used by call statement @code{G}.
|
1241 |
|
|
@end deftypefn
|
1242 |
|
|
|
1243 |
|
|
@deftypefn {GIMPLE function} tree gimple_call_arg (gimple g, unsigned index)
|
1244 |
|
|
Return the argument at position @code{INDEX} for call statement @code{G}. The
|
1245 |
|
|
first argument is 0.
|
1246 |
|
|
@end deftypefn
|
1247 |
|
|
|
1248 |
|
|
@deftypefn {GIMPLE function} tree *gimple_call_arg_ptr (gimple g, unsigned index)
|
1249 |
|
|
Return a pointer to the argument at position @code{INDEX} for call
|
1250 |
|
|
statement @code{G}.
|
1251 |
|
|
@end deftypefn
|
1252 |
|
|
|
1253 |
|
|
@deftypefn {GIMPLE function} void gimple_call_set_arg (gimple g, unsigned index, tree arg)
|
1254 |
|
|
Set @code{ARG} to be the argument at position @code{INDEX} for call statement
|
1255 |
|
|
@code{G}.
|
1256 |
|
|
@end deftypefn
|
1257 |
|
|
|
1258 |
|
|
@deftypefn {GIMPLE function} void gimple_call_set_tail (gimple s)
|
1259 |
|
|
Mark call statement @code{S} as being a tail call (i.e., a call just
|
1260 |
|
|
before the exit of a function). These calls are candidate for
|
1261 |
|
|
tail call optimization.
|
1262 |
|
|
@end deftypefn
|
1263 |
|
|
|
1264 |
|
|
@deftypefn {GIMPLE function} bool gimple_call_tail_p (gimple s)
|
1265 |
|
|
Return true if @code{GIMPLE_CALL} @code{S} is marked as a tail call.
|
1266 |
|
|
@end deftypefn
|
1267 |
|
|
|
1268 |
|
|
@deftypefn {GIMPLE function} void gimple_call_mark_uninlinable (gimple s)
|
1269 |
|
|
Mark @code{GIMPLE_CALL} @code{S} as being uninlinable.
|
1270 |
|
|
@end deftypefn
|
1271 |
|
|
|
1272 |
|
|
@deftypefn {GIMPLE function} bool gimple_call_cannot_inline_p (gimple s)
|
1273 |
|
|
Return true if @code{GIMPLE_CALL} @code{S} cannot be inlined.
|
1274 |
|
|
@end deftypefn
|
1275 |
|
|
|
1276 |
|
|
@deftypefn {GIMPLE function} bool gimple_call_noreturn_p (gimple s)
|
1277 |
|
|
Return true if @code{S} is a noreturn call.
|
1278 |
|
|
@end deftypefn
|
1279 |
|
|
|
1280 |
|
|
@deftypefn {GIMPLE function} gimple gimple_call_copy_skip_args (gimple stmt, bitmap args_to_skip)
|
1281 |
|
|
Build a @code{GIMPLE_CALL} identical to @code{STMT} but skipping the arguments
|
1282 |
|
|
in the positions marked by the set @code{ARGS_TO_SKIP}.
|
1283 |
|
|
@end deftypefn
|
1284 |
|
|
|
1285 |
|
|
|
1286 |
|
|
@node @code{GIMPLE_CATCH}
|
1287 |
|
|
@subsection @code{GIMPLE_CATCH}
|
1288 |
|
|
@cindex @code{GIMPLE_CATCH}
|
1289 |
|
|
|
1290 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_catch (tree types, gimple_seq handler)
|
1291 |
|
|
Build a @code{GIMPLE_CATCH} statement. @code{TYPES} are the tree types this
|
1292 |
|
|
catch handles. @code{HANDLER} is a sequence of statements with the code
|
1293 |
|
|
for the handler.
|
1294 |
|
|
@end deftypefn
|
1295 |
|
|
|
1296 |
|
|
@deftypefn {GIMPLE function} tree gimple_catch_types (gimple g)
|
1297 |
|
|
Return the types handled by @code{GIMPLE_CATCH} statement @code{G}.
|
1298 |
|
|
@end deftypefn
|
1299 |
|
|
|
1300 |
|
|
@deftypefn {GIMPLE function} tree *gimple_catch_types_ptr (gimple g)
|
1301 |
|
|
Return a pointer to the types handled by @code{GIMPLE_CATCH} statement
|
1302 |
|
|
@code{G}.
|
1303 |
|
|
@end deftypefn
|
1304 |
|
|
|
1305 |
|
|
@deftypefn {GIMPLE function} gimple_seq gimple_catch_handler (gimple g)
|
1306 |
|
|
Return the GIMPLE sequence representing the body of the handler
|
1307 |
|
|
of @code{GIMPLE_CATCH} statement @code{G}.
|
1308 |
|
|
@end deftypefn
|
1309 |
|
|
|
1310 |
|
|
@deftypefn {GIMPLE function} void gimple_catch_set_types (gimple g, tree t)
|
1311 |
|
|
Set @code{T} to be the set of types handled by @code{GIMPLE_CATCH} @code{G}.
|
1312 |
|
|
@end deftypefn
|
1313 |
|
|
|
1314 |
|
|
@deftypefn {GIMPLE function} void gimple_catch_set_handler (gimple g, gimple_seq handler)
|
1315 |
|
|
Set @code{HANDLER} to be the body of @code{GIMPLE_CATCH} @code{G}.
|
1316 |
|
|
@end deftypefn
|
1317 |
|
|
|
1318 |
|
|
|
1319 |
|
|
@node @code{GIMPLE_COND}
|
1320 |
|
|
@subsection @code{GIMPLE_COND}
|
1321 |
|
|
@cindex @code{GIMPLE_COND}
|
1322 |
|
|
|
1323 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_cond (enum tree_code pred_code, tree lhs, tree rhs, tree t_label, tree f_label)
|
1324 |
|
|
Build a @code{GIMPLE_COND} statement. @code{A} @code{GIMPLE_COND} statement compares
|
1325 |
|
|
@code{LHS} and @code{RHS} and if the condition in @code{PRED_CODE} is true, jump to
|
1326 |
|
|
the label in @code{t_label}, otherwise jump to the label in @code{f_label}.
|
1327 |
|
|
@code{PRED_CODE} are relational operator tree codes like @code{EQ_EXPR},
|
1328 |
|
|
@code{LT_EXPR}, @code{LE_EXPR}, @code{NE_EXPR}, etc.
|
1329 |
|
|
@end deftypefn
|
1330 |
|
|
|
1331 |
|
|
|
1332 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_cond_from_tree (tree cond, tree t_label, tree f_label)
|
1333 |
|
|
Build a @code{GIMPLE_COND} statement from the conditional expression
|
1334 |
|
|
tree @code{COND}. @code{T_LABEL} and @code{F_LABEL} are as in @code{gimple_build_cond}.
|
1335 |
|
|
@end deftypefn
|
1336 |
|
|
|
1337 |
|
|
@deftypefn {GIMPLE function} enum tree_code gimple_cond_code (gimple g)
|
1338 |
|
|
Return the code of the predicate computed by conditional
|
1339 |
|
|
statement @code{G}.
|
1340 |
|
|
@end deftypefn
|
1341 |
|
|
|
1342 |
|
|
@deftypefn {GIMPLE function} void gimple_cond_set_code (gimple g, enum tree_code code)
|
1343 |
|
|
Set @code{CODE} to be the predicate code for the conditional statement
|
1344 |
|
|
@code{G}.
|
1345 |
|
|
@end deftypefn
|
1346 |
|
|
|
1347 |
|
|
@deftypefn {GIMPLE function} tree gimple_cond_lhs (gimple g)
|
1348 |
|
|
Return the @code{LHS} of the predicate computed by conditional statement
|
1349 |
|
|
@code{G}.
|
1350 |
|
|
@end deftypefn
|
1351 |
|
|
|
1352 |
|
|
@deftypefn {GIMPLE function} void gimple_cond_set_lhs (gimple g, tree lhs)
|
1353 |
|
|
Set @code{LHS} to be the @code{LHS} operand of the predicate computed by
|
1354 |
|
|
conditional statement @code{G}.
|
1355 |
|
|
@end deftypefn
|
1356 |
|
|
|
1357 |
|
|
@deftypefn {GIMPLE function} tree gimple_cond_rhs (gimple g)
|
1358 |
|
|
Return the @code{RHS} operand of the predicate computed by conditional
|
1359 |
|
|
@code{G}.
|
1360 |
|
|
@end deftypefn
|
1361 |
|
|
|
1362 |
|
|
@deftypefn {GIMPLE function} void gimple_cond_set_rhs (gimple g, tree rhs)
|
1363 |
|
|
Set @code{RHS} to be the @code{RHS} operand of the predicate computed by
|
1364 |
|
|
conditional statement @code{G}.
|
1365 |
|
|
@end deftypefn
|
1366 |
|
|
|
1367 |
|
|
@deftypefn {GIMPLE function} tree gimple_cond_true_label (gimple g)
|
1368 |
|
|
Return the label used by conditional statement @code{G} when its
|
1369 |
|
|
predicate evaluates to true.
|
1370 |
|
|
@end deftypefn
|
1371 |
|
|
|
1372 |
|
|
@deftypefn {GIMPLE function} void gimple_cond_set_true_label (gimple g, tree label)
|
1373 |
|
|
Set @code{LABEL} to be the label used by conditional statement @code{G} when
|
1374 |
|
|
its predicate evaluates to true.
|
1375 |
|
|
@end deftypefn
|
1376 |
|
|
|
1377 |
|
|
@deftypefn {GIMPLE function} void gimple_cond_set_false_label (gimple g, tree label)
|
1378 |
|
|
Set @code{LABEL} to be the label used by conditional statement @code{G} when
|
1379 |
|
|
its predicate evaluates to false.
|
1380 |
|
|
@end deftypefn
|
1381 |
|
|
|
1382 |
|
|
@deftypefn {GIMPLE function} tree gimple_cond_false_label (gimple g)
|
1383 |
|
|
Return the label used by conditional statement @code{G} when its
|
1384 |
|
|
predicate evaluates to false.
|
1385 |
|
|
@end deftypefn
|
1386 |
|
|
|
1387 |
|
|
@deftypefn {GIMPLE function} void gimple_cond_make_false (gimple g)
|
1388 |
|
|
Set the conditional @code{COND_STMT} to be of the form 'if (1 == 0)'.
|
1389 |
|
|
@end deftypefn
|
1390 |
|
|
|
1391 |
|
|
@deftypefn {GIMPLE function} void gimple_cond_make_true (gimple g)
|
1392 |
|
|
Set the conditional @code{COND_STMT} to be of the form 'if (1 == 1)'.
|
1393 |
|
|
@end deftypefn
|
1394 |
|
|
|
1395 |
|
|
@node @code{GIMPLE_DEBUG}
|
1396 |
|
|
@subsection @code{GIMPLE_DEBUG}
|
1397 |
|
|
@cindex @code{GIMPLE_DEBUG}
|
1398 |
|
|
@cindex @code{GIMPLE_DEBUG_BIND}
|
1399 |
|
|
|
1400 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_debug_bind (tree var, tree value, gimple stmt)
|
1401 |
|
|
Build a @code{GIMPLE_DEBUG} statement with @code{GIMPLE_DEBUG_BIND} of
|
1402 |
|
|
@code{subcode}. The effect of this statement is to tell debug
|
1403 |
|
|
information generation machinery that the value of user variable
|
1404 |
|
|
@code{var} is given by @code{value} at that point, and to remain with
|
1405 |
|
|
that value until @code{var} runs out of scope, a
|
1406 |
|
|
dynamically-subsequent debug bind statement overrides the binding, or
|
1407 |
|
|
conflicting values reach a control flow merge point. Even if
|
1408 |
|
|
components of the @code{value} expression change afterwards, the
|
1409 |
|
|
variable is supposed to retain the same value, though not necessarily
|
1410 |
|
|
the same location.
|
1411 |
|
|
|
1412 |
|
|
It is expected that @code{var} be most often a tree for automatic user
|
1413 |
|
|
variables (@code{VAR_DECL} or @code{PARM_DECL}) that satisfy the
|
1414 |
|
|
requirements for gimple registers, but it may also be a tree for a
|
1415 |
|
|
scalarized component of a user variable (@code{ARRAY_REF},
|
1416 |
|
|
@code{COMPONENT_REF}), or a debug temporary (@code{DEBUG_EXPR_DECL}).
|
1417 |
|
|
|
1418 |
|
|
As for @code{value}, it can be an arbitrary tree expression, but it is
|
1419 |
|
|
recommended that it be in a suitable form for a gimple assignment
|
1420 |
|
|
@code{RHS}. It is not expected that user variables that could appear
|
1421 |
|
|
as @code{var} ever appear in @code{value}, because in the latter we'd
|
1422 |
|
|
have their @code{SSA_NAME}s instead, but even if they were not in SSA
|
1423 |
|
|
form, user variables appearing in @code{value} are to be regarded as
|
1424 |
|
|
part of the executable code space, whereas those in @code{var} are to
|
1425 |
|
|
be regarded as part of the source code space. There is no way to
|
1426 |
|
|
refer to the value bound to a user variable within a @code{value}
|
1427 |
|
|
expression.
|
1428 |
|
|
|
1429 |
|
|
If @code{value} is @code{GIMPLE_DEBUG_BIND_NOVALUE}, debug information
|
1430 |
|
|
generation machinery is informed that the variable @code{var} is
|
1431 |
|
|
unbound, i.e., that its value is indeterminate, which sometimes means
|
1432 |
|
|
it is really unavailable, and other times that the compiler could not
|
1433 |
|
|
keep track of it.
|
1434 |
|
|
|
1435 |
|
|
Block and location information for the newly-created stmt are
|
1436 |
|
|
taken from @code{stmt}, if given.
|
1437 |
|
|
@end deftypefn
|
1438 |
|
|
|
1439 |
|
|
@deftypefn {GIMPLE function} tree gimple_debug_bind_get_var (gimple stmt)
|
1440 |
|
|
Return the user variable @var{var} that is bound at @code{stmt}.
|
1441 |
|
|
@end deftypefn
|
1442 |
|
|
|
1443 |
|
|
@deftypefn {GIMPLE function} tree gimple_debug_bind_get_value (gimple stmt)
|
1444 |
|
|
Return the value expression that is bound to a user variable at
|
1445 |
|
|
@code{stmt}.
|
1446 |
|
|
@end deftypefn
|
1447 |
|
|
|
1448 |
|
|
@deftypefn {GIMPLE function} tree *gimple_debug_bind_get_value_ptr (gimple stmt)
|
1449 |
|
|
Return a pointer to the value expression that is bound to a user
|
1450 |
|
|
variable at @code{stmt}.
|
1451 |
|
|
@end deftypefn
|
1452 |
|
|
|
1453 |
|
|
@deftypefn {GIMPLE function} void gimple_debug_bind_set_var (gimple stmt, tree var)
|
1454 |
|
|
Modify the user variable bound at @code{stmt} to @var{var}.
|
1455 |
|
|
@end deftypefn
|
1456 |
|
|
|
1457 |
|
|
@deftypefn {GIMPLE function} void gimple_debug_bind_set_value (gimple stmt, tree var)
|
1458 |
|
|
Modify the value bound to the user variable bound at @code{stmt} to
|
1459 |
|
|
@var{value}.
|
1460 |
|
|
@end deftypefn
|
1461 |
|
|
|
1462 |
|
|
@deftypefn {GIMPLE function} void gimple_debug_bind_reset_value (gimple stmt)
|
1463 |
|
|
Modify the value bound to the user variable bound at @code{stmt} so
|
1464 |
|
|
that the variable becomes unbound.
|
1465 |
|
|
@end deftypefn
|
1466 |
|
|
|
1467 |
|
|
@deftypefn {GIMPLE function} bool gimple_debug_bind_has_value_p (gimple stmt)
|
1468 |
|
|
Return @code{TRUE} if @code{stmt} binds a user variable to a value,
|
1469 |
|
|
and @code{FALSE} if it unbinds the variable.
|
1470 |
|
|
@end deftypefn
|
1471 |
|
|
|
1472 |
|
|
@node @code{GIMPLE_EH_FILTER}
|
1473 |
|
|
@subsection @code{GIMPLE_EH_FILTER}
|
1474 |
|
|
@cindex @code{GIMPLE_EH_FILTER}
|
1475 |
|
|
|
1476 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_eh_filter (tree types, gimple_seq failure)
|
1477 |
|
|
Build a @code{GIMPLE_EH_FILTER} statement. @code{TYPES} are the filter's
|
1478 |
|
|
types. @code{FAILURE} is a sequence with the filter's failure action.
|
1479 |
|
|
@end deftypefn
|
1480 |
|
|
|
1481 |
|
|
@deftypefn {GIMPLE function} tree gimple_eh_filter_types (gimple g)
|
1482 |
|
|
Return the types handled by @code{GIMPLE_EH_FILTER} statement @code{G}.
|
1483 |
|
|
@end deftypefn
|
1484 |
|
|
|
1485 |
|
|
@deftypefn {GIMPLE function} tree *gimple_eh_filter_types_ptr (gimple g)
|
1486 |
|
|
Return a pointer to the types handled by @code{GIMPLE_EH_FILTER}
|
1487 |
|
|
statement @code{G}.
|
1488 |
|
|
@end deftypefn
|
1489 |
|
|
|
1490 |
|
|
@deftypefn {GIMPLE function} gimple_seq gimple_eh_filter_failure (gimple g)
|
1491 |
|
|
Return the sequence of statement to execute when @code{GIMPLE_EH_FILTER}
|
1492 |
|
|
statement fails.
|
1493 |
|
|
@end deftypefn
|
1494 |
|
|
|
1495 |
|
|
@deftypefn {GIMPLE function} void gimple_eh_filter_set_types (gimple g, tree types)
|
1496 |
|
|
Set @code{TYPES} to be the set of types handled by @code{GIMPLE_EH_FILTER} @code{G}.
|
1497 |
|
|
@end deftypefn
|
1498 |
|
|
|
1499 |
|
|
@deftypefn {GIMPLE function} void gimple_eh_filter_set_failure (gimple g, gimple_seq failure)
|
1500 |
|
|
Set @code{FAILURE} to be the sequence of statements to execute on
|
1501 |
|
|
failure for @code{GIMPLE_EH_FILTER} @code{G}.
|
1502 |
|
|
@end deftypefn
|
1503 |
|
|
|
1504 |
|
|
@deftypefn {GIMPLE function} bool gimple_eh_filter_must_not_throw (gimple g)
|
1505 |
|
|
Return the @code{EH_FILTER_MUST_NOT_THROW} flag.
|
1506 |
|
|
@end deftypefn
|
1507 |
|
|
|
1508 |
|
|
@deftypefn {GIMPLE function} void gimple_eh_filter_set_must_not_throw (gimple g, bool mntp)
|
1509 |
|
|
Set the @code{EH_FILTER_MUST_NOT_THROW} flag.
|
1510 |
|
|
@end deftypefn
|
1511 |
|
|
|
1512 |
|
|
|
1513 |
|
|
@node @code{GIMPLE_LABEL}
|
1514 |
|
|
@subsection @code{GIMPLE_LABEL}
|
1515 |
|
|
@cindex @code{GIMPLE_LABEL}
|
1516 |
|
|
|
1517 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_label (tree label)
|
1518 |
|
|
Build a @code{GIMPLE_LABEL} statement with corresponding to the tree
|
1519 |
|
|
label, @code{LABEL}.
|
1520 |
|
|
@end deftypefn
|
1521 |
|
|
|
1522 |
|
|
@deftypefn {GIMPLE function} tree gimple_label_label (gimple g)
|
1523 |
|
|
Return the @code{LABEL_DECL} node used by @code{GIMPLE_LABEL} statement @code{G}.
|
1524 |
|
|
@end deftypefn
|
1525 |
|
|
|
1526 |
|
|
@deftypefn {GIMPLE function} void gimple_label_set_label (gimple g, tree label)
|
1527 |
|
|
Set @code{LABEL} to be the @code{LABEL_DECL} node used by @code{GIMPLE_LABEL}
|
1528 |
|
|
statement @code{G}.
|
1529 |
|
|
@end deftypefn
|
1530 |
|
|
|
1531 |
|
|
|
1532 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_goto (tree dest)
|
1533 |
|
|
Build a @code{GIMPLE_GOTO} statement to label @code{DEST}.
|
1534 |
|
|
@end deftypefn
|
1535 |
|
|
|
1536 |
|
|
@deftypefn {GIMPLE function} tree gimple_goto_dest (gimple g)
|
1537 |
|
|
Return the destination of the unconditional jump @code{G}.
|
1538 |
|
|
@end deftypefn
|
1539 |
|
|
|
1540 |
|
|
@deftypefn {GIMPLE function} void gimple_goto_set_dest (gimple g, tree dest)
|
1541 |
|
|
Set @code{DEST} to be the destination of the unconditional jump @code{G}.
|
1542 |
|
|
@end deftypefn
|
1543 |
|
|
|
1544 |
|
|
|
1545 |
|
|
@node @code{GIMPLE_NOP}
|
1546 |
|
|
@subsection @code{GIMPLE_NOP}
|
1547 |
|
|
@cindex @code{GIMPLE_NOP}
|
1548 |
|
|
|
1549 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_nop (void)
|
1550 |
|
|
Build a @code{GIMPLE_NOP} statement.
|
1551 |
|
|
@end deftypefn
|
1552 |
|
|
|
1553 |
|
|
@deftypefn {GIMPLE function} bool gimple_nop_p (gimple g)
|
1554 |
|
|
Returns @code{TRUE} if statement @code{G} is a @code{GIMPLE_NOP}.
|
1555 |
|
|
@end deftypefn
|
1556 |
|
|
|
1557 |
|
|
@node @code{GIMPLE_OMP_ATOMIC_LOAD}
|
1558 |
|
|
@subsection @code{GIMPLE_OMP_ATOMIC_LOAD}
|
1559 |
|
|
@cindex @code{GIMPLE_OMP_ATOMIC_LOAD}
|
1560 |
|
|
|
1561 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_omp_atomic_load (tree lhs, tree rhs)
|
1562 |
|
|
Build a @code{GIMPLE_OMP_ATOMIC_LOAD} statement. @code{LHS} is the left-hand
|
1563 |
|
|
side of the assignment. @code{RHS} is the right-hand side of the
|
1564 |
|
|
assignment.
|
1565 |
|
|
@end deftypefn
|
1566 |
|
|
|
1567 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_atomic_load_set_lhs (gimple g, tree lhs)
|
1568 |
|
|
Set the @code{LHS} of an atomic load.
|
1569 |
|
|
@end deftypefn
|
1570 |
|
|
|
1571 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_atomic_load_lhs (gimple g)
|
1572 |
|
|
Get the @code{LHS} of an atomic load.
|
1573 |
|
|
@end deftypefn
|
1574 |
|
|
|
1575 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_atomic_load_set_rhs (gimple g, tree rhs)
|
1576 |
|
|
Set the @code{RHS} of an atomic set.
|
1577 |
|
|
@end deftypefn
|
1578 |
|
|
|
1579 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_atomic_load_rhs (gimple g)
|
1580 |
|
|
Get the @code{RHS} of an atomic set.
|
1581 |
|
|
@end deftypefn
|
1582 |
|
|
|
1583 |
|
|
|
1584 |
|
|
@node @code{GIMPLE_OMP_ATOMIC_STORE}
|
1585 |
|
|
@subsection @code{GIMPLE_OMP_ATOMIC_STORE}
|
1586 |
|
|
@cindex @code{GIMPLE_OMP_ATOMIC_STORE}
|
1587 |
|
|
|
1588 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_omp_atomic_store (tree val)
|
1589 |
|
|
Build a @code{GIMPLE_OMP_ATOMIC_STORE} statement. @code{VAL} is the value to be
|
1590 |
|
|
stored.
|
1591 |
|
|
@end deftypefn
|
1592 |
|
|
|
1593 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_atomic_store_set_val (gimple g, tree val)
|
1594 |
|
|
Set the value being stored in an atomic store.
|
1595 |
|
|
@end deftypefn
|
1596 |
|
|
|
1597 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_atomic_store_val (gimple g)
|
1598 |
|
|
Return the value being stored in an atomic store.
|
1599 |
|
|
@end deftypefn
|
1600 |
|
|
|
1601 |
|
|
@node @code{GIMPLE_OMP_CONTINUE}
|
1602 |
|
|
@subsection @code{GIMPLE_OMP_CONTINUE}
|
1603 |
|
|
@cindex @code{GIMPLE_OMP_CONTINUE}
|
1604 |
|
|
|
1605 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_omp_continue (tree control_def, tree control_use)
|
1606 |
|
|
Build a @code{GIMPLE_OMP_CONTINUE} statement. @code{CONTROL_DEF} is the
|
1607 |
|
|
definition of the control variable. @code{CONTROL_USE} is the use of
|
1608 |
|
|
the control variable.
|
1609 |
|
|
@end deftypefn
|
1610 |
|
|
|
1611 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_continue_control_def (gimple s)
|
1612 |
|
|
Return the definition of the control variable on a
|
1613 |
|
|
@code{GIMPLE_OMP_CONTINUE} in @code{S}.
|
1614 |
|
|
@end deftypefn
|
1615 |
|
|
|
1616 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_continue_control_def_ptr (gimple s)
|
1617 |
|
|
Same as above, but return the pointer.
|
1618 |
|
|
@end deftypefn
|
1619 |
|
|
|
1620 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_continue_set_control_def (gimple s)
|
1621 |
|
|
Set the control variable definition for a @code{GIMPLE_OMP_CONTINUE}
|
1622 |
|
|
statement in @code{S}.
|
1623 |
|
|
@end deftypefn
|
1624 |
|
|
|
1625 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_continue_control_use (gimple s)
|
1626 |
|
|
Return the use of the control variable on a @code{GIMPLE_OMP_CONTINUE}
|
1627 |
|
|
in @code{S}.
|
1628 |
|
|
@end deftypefn
|
1629 |
|
|
|
1630 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_continue_control_use_ptr (gimple s)
|
1631 |
|
|
Same as above, but return the pointer.
|
1632 |
|
|
@end deftypefn
|
1633 |
|
|
|
1634 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_continue_set_control_use (gimple s)
|
1635 |
|
|
Set the control variable use for a @code{GIMPLE_OMP_CONTINUE} statement
|
1636 |
|
|
in @code{S}.
|
1637 |
|
|
@end deftypefn
|
1638 |
|
|
|
1639 |
|
|
|
1640 |
|
|
@node @code{GIMPLE_OMP_CRITICAL}
|
1641 |
|
|
@subsection @code{GIMPLE_OMP_CRITICAL}
|
1642 |
|
|
@cindex @code{GIMPLE_OMP_CRITICAL}
|
1643 |
|
|
|
1644 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_omp_critical (gimple_seq body, tree name)
|
1645 |
|
|
Build a @code{GIMPLE_OMP_CRITICAL} statement. @code{BODY} is the sequence of
|
1646 |
|
|
statements for which only one thread can execute. @code{NAME} is an
|
1647 |
|
|
optional identifier for this critical block.
|
1648 |
|
|
@end deftypefn
|
1649 |
|
|
|
1650 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_critical_name (gimple g)
|
1651 |
|
|
Return the name associated with @code{OMP_CRITICAL} statement @code{G}.
|
1652 |
|
|
@end deftypefn
|
1653 |
|
|
|
1654 |
|
|
@deftypefn {GIMPLE function} tree *gimple_omp_critical_name_ptr (gimple g)
|
1655 |
|
|
Return a pointer to the name associated with @code{OMP} critical
|
1656 |
|
|
statement @code{G}.
|
1657 |
|
|
@end deftypefn
|
1658 |
|
|
|
1659 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_critical_set_name (gimple g, tree name)
|
1660 |
|
|
Set @code{NAME} to be the name associated with @code{OMP} critical statement @code{G}.
|
1661 |
|
|
@end deftypefn
|
1662 |
|
|
|
1663 |
|
|
@node @code{GIMPLE_OMP_FOR}
|
1664 |
|
|
@subsection @code{GIMPLE_OMP_FOR}
|
1665 |
|
|
@cindex @code{GIMPLE_OMP_FOR}
|
1666 |
|
|
|
1667 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_omp_for (gimple_seq body, @
|
1668 |
|
|
tree clauses, tree index, tree initial, tree final, tree incr, @
|
1669 |
|
|
gimple_seq pre_body, enum tree_code omp_for_cond)
|
1670 |
|
|
Build a @code{GIMPLE_OMP_FOR} statement. @code{BODY} is sequence of statements
|
1671 |
|
|
inside the for loop. @code{CLAUSES}, are any of the @code{OMP} loop
|
1672 |
|
|
construct's clauses: private, firstprivate, lastprivate,
|
1673 |
|
|
reductions, ordered, schedule, and nowait. @code{PRE_BODY} is the
|
1674 |
|
|
sequence of statements that are loop invariant. @code{INDEX} is the
|
1675 |
|
|
index variable. @code{INITIAL} is the initial value of @code{INDEX}. @code{FINAL} is
|
1676 |
|
|
final value of @code{INDEX}. OMP_FOR_COND is the predicate used to
|
1677 |
|
|
compare @code{INDEX} and @code{FINAL}. @code{INCR} is the increment expression.
|
1678 |
|
|
@end deftypefn
|
1679 |
|
|
|
1680 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_for_clauses (gimple g)
|
1681 |
|
|
Return the clauses associated with @code{OMP_FOR} @code{G}.
|
1682 |
|
|
@end deftypefn
|
1683 |
|
|
|
1684 |
|
|
@deftypefn {GIMPLE function} tree *gimple_omp_for_clauses_ptr (gimple g)
|
1685 |
|
|
Return a pointer to the @code{OMP_FOR} @code{G}.
|
1686 |
|
|
@end deftypefn
|
1687 |
|
|
|
1688 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_for_set_clauses (gimple g, tree clauses)
|
1689 |
|
|
Set @code{CLAUSES} to be the list of clauses associated with @code{OMP_FOR} @code{G}.
|
1690 |
|
|
@end deftypefn
|
1691 |
|
|
|
1692 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_for_index (gimple g)
|
1693 |
|
|
Return the index variable for @code{OMP_FOR} @code{G}.
|
1694 |
|
|
@end deftypefn
|
1695 |
|
|
|
1696 |
|
|
@deftypefn {GIMPLE function} tree *gimple_omp_for_index_ptr (gimple g)
|
1697 |
|
|
Return a pointer to the index variable for @code{OMP_FOR} @code{G}.
|
1698 |
|
|
@end deftypefn
|
1699 |
|
|
|
1700 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_for_set_index (gimple g, tree index)
|
1701 |
|
|
Set @code{INDEX} to be the index variable for @code{OMP_FOR} @code{G}.
|
1702 |
|
|
@end deftypefn
|
1703 |
|
|
|
1704 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_for_initial (gimple g)
|
1705 |
|
|
Return the initial value for @code{OMP_FOR} @code{G}.
|
1706 |
|
|
@end deftypefn
|
1707 |
|
|
|
1708 |
|
|
@deftypefn {GIMPLE function} tree *gimple_omp_for_initial_ptr (gimple g)
|
1709 |
|
|
Return a pointer to the initial value for @code{OMP_FOR} @code{G}.
|
1710 |
|
|
@end deftypefn
|
1711 |
|
|
|
1712 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_for_set_initial (gimple g, tree initial)
|
1713 |
|
|
Set @code{INITIAL} to be the initial value for @code{OMP_FOR} @code{G}.
|
1714 |
|
|
@end deftypefn
|
1715 |
|
|
|
1716 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_for_final (gimple g)
|
1717 |
|
|
Return the final value for @code{OMP_FOR} @code{G}.
|
1718 |
|
|
@end deftypefn
|
1719 |
|
|
|
1720 |
|
|
@deftypefn {GIMPLE function} tree *gimple_omp_for_final_ptr (gimple g)
|
1721 |
|
|
turn a pointer to the final value for @code{OMP_FOR} @code{G}.
|
1722 |
|
|
@end deftypefn
|
1723 |
|
|
|
1724 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_for_set_final (gimple g, tree final)
|
1725 |
|
|
Set @code{FINAL} to be the final value for @code{OMP_FOR} @code{G}.
|
1726 |
|
|
@end deftypefn
|
1727 |
|
|
|
1728 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_for_incr (gimple g)
|
1729 |
|
|
Return the increment value for @code{OMP_FOR} @code{G}.
|
1730 |
|
|
@end deftypefn
|
1731 |
|
|
|
1732 |
|
|
@deftypefn {GIMPLE function} tree *gimple_omp_for_incr_ptr (gimple g)
|
1733 |
|
|
Return a pointer to the increment value for @code{OMP_FOR} @code{G}.
|
1734 |
|
|
@end deftypefn
|
1735 |
|
|
|
1736 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_for_set_incr (gimple g, tree incr)
|
1737 |
|
|
Set @code{INCR} to be the increment value for @code{OMP_FOR} @code{G}.
|
1738 |
|
|
@end deftypefn
|
1739 |
|
|
|
1740 |
|
|
@deftypefn {GIMPLE function} gimple_seq gimple_omp_for_pre_body (gimple g)
|
1741 |
|
|
Return the sequence of statements to execute before the @code{OMP_FOR}
|
1742 |
|
|
statement @code{G} starts.
|
1743 |
|
|
@end deftypefn
|
1744 |
|
|
|
1745 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_for_set_pre_body (gimple g, gimple_seq pre_body)
|
1746 |
|
|
Set @code{PRE_BODY} to be the sequence of statements to execute before
|
1747 |
|
|
the @code{OMP_FOR} statement @code{G} starts.
|
1748 |
|
|
@end deftypefn
|
1749 |
|
|
|
1750 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_for_set_cond (gimple g, enum tree_code cond)
|
1751 |
|
|
Set @code{COND} to be the condition code for @code{OMP_FOR} @code{G}.
|
1752 |
|
|
@end deftypefn
|
1753 |
|
|
|
1754 |
|
|
@deftypefn {GIMPLE function} enum tree_code gimple_omp_for_cond (gimple g)
|
1755 |
|
|
Return the condition code associated with @code{OMP_FOR} @code{G}.
|
1756 |
|
|
@end deftypefn
|
1757 |
|
|
|
1758 |
|
|
|
1759 |
|
|
@node @code{GIMPLE_OMP_MASTER}
|
1760 |
|
|
@subsection @code{GIMPLE_OMP_MASTER}
|
1761 |
|
|
@cindex @code{GIMPLE_OMP_MASTER}
|
1762 |
|
|
|
1763 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_omp_master (gimple_seq body)
|
1764 |
|
|
Build a @code{GIMPLE_OMP_MASTER} statement. @code{BODY} is the sequence of
|
1765 |
|
|
statements to be executed by just the master.
|
1766 |
|
|
@end deftypefn
|
1767 |
|
|
|
1768 |
|
|
|
1769 |
|
|
@node @code{GIMPLE_OMP_ORDERED}
|
1770 |
|
|
@subsection @code{GIMPLE_OMP_ORDERED}
|
1771 |
|
|
@cindex @code{GIMPLE_OMP_ORDERED}
|
1772 |
|
|
|
1773 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_omp_ordered (gimple_seq body)
|
1774 |
|
|
Build a @code{GIMPLE_OMP_ORDERED} statement.
|
1775 |
|
|
@end deftypefn
|
1776 |
|
|
|
1777 |
|
|
@code{BODY} is the sequence of statements inside a loop that will
|
1778 |
|
|
executed in sequence.
|
1779 |
|
|
|
1780 |
|
|
|
1781 |
|
|
@node @code{GIMPLE_OMP_PARALLEL}
|
1782 |
|
|
@subsection @code{GIMPLE_OMP_PARALLEL}
|
1783 |
|
|
@cindex @code{GIMPLE_OMP_PARALLEL}
|
1784 |
|
|
|
1785 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_omp_parallel (gimple_seq body, tree clauses, tree child_fn, tree data_arg)
|
1786 |
|
|
Build a @code{GIMPLE_OMP_PARALLEL} statement.
|
1787 |
|
|
@end deftypefn
|
1788 |
|
|
|
1789 |
|
|
@code{BODY} is sequence of statements which are executed in parallel.
|
1790 |
|
|
@code{CLAUSES}, are the @code{OMP} parallel construct's clauses. @code{CHILD_FN} is
|
1791 |
|
|
the function created for the parallel threads to execute.
|
1792 |
|
|
@code{DATA_ARG} are the shared data argument(s).
|
1793 |
|
|
|
1794 |
|
|
@deftypefn {GIMPLE function} bool gimple_omp_parallel_combined_p (gimple g)
|
1795 |
|
|
Return true if @code{OMP} parallel statement @code{G} has the
|
1796 |
|
|
@code{GF_OMP_PARALLEL_COMBINED} flag set.
|
1797 |
|
|
@end deftypefn
|
1798 |
|
|
|
1799 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_parallel_set_combined_p (gimple g)
|
1800 |
|
|
Set the @code{GF_OMP_PARALLEL_COMBINED} field in @code{OMP} parallel statement
|
1801 |
|
|
@code{G}.
|
1802 |
|
|
@end deftypefn
|
1803 |
|
|
|
1804 |
|
|
@deftypefn {GIMPLE function} gimple_seq gimple_omp_body (gimple g)
|
1805 |
|
|
Return the body for the @code{OMP} statement @code{G}.
|
1806 |
|
|
@end deftypefn
|
1807 |
|
|
|
1808 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_set_body (gimple g, gimple_seq body)
|
1809 |
|
|
Set @code{BODY} to be the body for the @code{OMP} statement @code{G}.
|
1810 |
|
|
@end deftypefn
|
1811 |
|
|
|
1812 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_parallel_clauses (gimple g)
|
1813 |
|
|
Return the clauses associated with @code{OMP_PARALLEL} @code{G}.
|
1814 |
|
|
@end deftypefn
|
1815 |
|
|
|
1816 |
|
|
@deftypefn {GIMPLE function} tree *gimple_omp_parallel_clauses_ptr (gimple g)
|
1817 |
|
|
Return a pointer to the clauses associated with @code{OMP_PARALLEL} @code{G}.
|
1818 |
|
|
@end deftypefn
|
1819 |
|
|
|
1820 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_parallel_set_clauses (gimple g, tree clauses)
|
1821 |
|
|
Set @code{CLAUSES} to be the list of clauses associated with
|
1822 |
|
|
@code{OMP_PARALLEL} @code{G}.
|
1823 |
|
|
@end deftypefn
|
1824 |
|
|
|
1825 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_parallel_child_fn (gimple g)
|
1826 |
|
|
Return the child function used to hold the body of @code{OMP_PARALLEL}
|
1827 |
|
|
@code{G}.
|
1828 |
|
|
@end deftypefn
|
1829 |
|
|
|
1830 |
|
|
@deftypefn {GIMPLE function} tree *gimple_omp_parallel_child_fn_ptr (gimple g)
|
1831 |
|
|
Return a pointer to the child function used to hold the body of
|
1832 |
|
|
@code{OMP_PARALLEL} @code{G}.
|
1833 |
|
|
@end deftypefn
|
1834 |
|
|
|
1835 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_parallel_set_child_fn (gimple g, tree child_fn)
|
1836 |
|
|
Set @code{CHILD_FN} to be the child function for @code{OMP_PARALLEL} @code{G}.
|
1837 |
|
|
@end deftypefn
|
1838 |
|
|
|
1839 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_parallel_data_arg (gimple g)
|
1840 |
|
|
Return the artificial argument used to send variables and values
|
1841 |
|
|
from the parent to the children threads in @code{OMP_PARALLEL} @code{G}.
|
1842 |
|
|
@end deftypefn
|
1843 |
|
|
|
1844 |
|
|
@deftypefn {GIMPLE function} tree *gimple_omp_parallel_data_arg_ptr (gimple g)
|
1845 |
|
|
Return a pointer to the data argument for @code{OMP_PARALLEL} @code{G}.
|
1846 |
|
|
@end deftypefn
|
1847 |
|
|
|
1848 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_parallel_set_data_arg (gimple g, tree data_arg)
|
1849 |
|
|
Set @code{DATA_ARG} to be the data argument for @code{OMP_PARALLEL} @code{G}.
|
1850 |
|
|
@end deftypefn
|
1851 |
|
|
|
1852 |
|
|
@deftypefn {GIMPLE function} bool is_gimple_omp (gimple stmt)
|
1853 |
|
|
Returns true when the gimple statement @code{STMT} is any of the OpenMP
|
1854 |
|
|
types.
|
1855 |
|
|
@end deftypefn
|
1856 |
|
|
|
1857 |
|
|
|
1858 |
|
|
@node @code{GIMPLE_OMP_RETURN}
|
1859 |
|
|
@subsection @code{GIMPLE_OMP_RETURN}
|
1860 |
|
|
@cindex @code{GIMPLE_OMP_RETURN}
|
1861 |
|
|
|
1862 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_omp_return (bool wait_p)
|
1863 |
|
|
Build a @code{GIMPLE_OMP_RETURN} statement. @code{WAIT_P} is true if this is a
|
1864 |
|
|
non-waiting return.
|
1865 |
|
|
@end deftypefn
|
1866 |
|
|
|
1867 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_return_set_nowait (gimple s)
|
1868 |
|
|
Set the nowait flag on @code{GIMPLE_OMP_RETURN} statement @code{S}.
|
1869 |
|
|
@end deftypefn
|
1870 |
|
|
|
1871 |
|
|
|
1872 |
|
|
@deftypefn {GIMPLE function} bool gimple_omp_return_nowait_p (gimple g)
|
1873 |
|
|
Return true if @code{OMP} return statement @code{G} has the
|
1874 |
|
|
@code{GF_OMP_RETURN_NOWAIT} flag set.
|
1875 |
|
|
@end deftypefn
|
1876 |
|
|
|
1877 |
|
|
@node @code{GIMPLE_OMP_SECTION}
|
1878 |
|
|
@subsection @code{GIMPLE_OMP_SECTION}
|
1879 |
|
|
@cindex @code{GIMPLE_OMP_SECTION}
|
1880 |
|
|
|
1881 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_omp_section (gimple_seq body)
|
1882 |
|
|
Build a @code{GIMPLE_OMP_SECTION} statement for a sections statement.
|
1883 |
|
|
@end deftypefn
|
1884 |
|
|
|
1885 |
|
|
@code{BODY} is the sequence of statements in the section.
|
1886 |
|
|
|
1887 |
|
|
@deftypefn {GIMPLE function} bool gimple_omp_section_last_p (gimple g)
|
1888 |
|
|
Return true if @code{OMP} section statement @code{G} has the
|
1889 |
|
|
@code{GF_OMP_SECTION_LAST} flag set.
|
1890 |
|
|
@end deftypefn
|
1891 |
|
|
|
1892 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_section_set_last (gimple g)
|
1893 |
|
|
Set the @code{GF_OMP_SECTION_LAST} flag on @code{G}.
|
1894 |
|
|
@end deftypefn
|
1895 |
|
|
|
1896 |
|
|
@node @code{GIMPLE_OMP_SECTIONS}
|
1897 |
|
|
@subsection @code{GIMPLE_OMP_SECTIONS}
|
1898 |
|
|
@cindex @code{GIMPLE_OMP_SECTIONS}
|
1899 |
|
|
|
1900 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_omp_sections (gimple_seq body, tree clauses)
|
1901 |
|
|
Build a @code{GIMPLE_OMP_SECTIONS} statement. @code{BODY} is a sequence of
|
1902 |
|
|
section statements. @code{CLAUSES} are any of the @code{OMP} sections
|
1903 |
|
|
construct's clauses: private, firstprivate, lastprivate,
|
1904 |
|
|
reduction, and nowait.
|
1905 |
|
|
@end deftypefn
|
1906 |
|
|
|
1907 |
|
|
|
1908 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_omp_sections_switch (void)
|
1909 |
|
|
Build a @code{GIMPLE_OMP_SECTIONS_SWITCH} statement.
|
1910 |
|
|
@end deftypefn
|
1911 |
|
|
|
1912 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_sections_control (gimple g)
|
1913 |
|
|
Return the control variable associated with the
|
1914 |
|
|
@code{GIMPLE_OMP_SECTIONS} in @code{G}.
|
1915 |
|
|
@end deftypefn
|
1916 |
|
|
|
1917 |
|
|
@deftypefn {GIMPLE function} tree *gimple_omp_sections_control_ptr (gimple g)
|
1918 |
|
|
Return a pointer to the clauses associated with the
|
1919 |
|
|
@code{GIMPLE_OMP_SECTIONS} in @code{G}.
|
1920 |
|
|
@end deftypefn
|
1921 |
|
|
|
1922 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_sections_set_control (gimple g, tree control)
|
1923 |
|
|
Set @code{CONTROL} to be the set of clauses associated with the
|
1924 |
|
|
@code{GIMPLE_OMP_SECTIONS} in @code{G}.
|
1925 |
|
|
@end deftypefn
|
1926 |
|
|
|
1927 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_sections_clauses (gimple g)
|
1928 |
|
|
Return the clauses associated with @code{OMP_SECTIONS} @code{G}.
|
1929 |
|
|
@end deftypefn
|
1930 |
|
|
|
1931 |
|
|
@deftypefn {GIMPLE function} tree *gimple_omp_sections_clauses_ptr (gimple g)
|
1932 |
|
|
Return a pointer to the clauses associated with @code{OMP_SECTIONS} @code{G}.
|
1933 |
|
|
@end deftypefn
|
1934 |
|
|
|
1935 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_sections_set_clauses (gimple g, tree clauses)
|
1936 |
|
|
Set @code{CLAUSES} to be the set of clauses associated with @code{OMP_SECTIONS}
|
1937 |
|
|
@code{G}.
|
1938 |
|
|
@end deftypefn
|
1939 |
|
|
|
1940 |
|
|
|
1941 |
|
|
@node @code{GIMPLE_OMP_SINGLE}
|
1942 |
|
|
@subsection @code{GIMPLE_OMP_SINGLE}
|
1943 |
|
|
@cindex @code{GIMPLE_OMP_SINGLE}
|
1944 |
|
|
|
1945 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_omp_single (gimple_seq body, tree clauses)
|
1946 |
|
|
Build a @code{GIMPLE_OMP_SINGLE} statement. @code{BODY} is the sequence of
|
1947 |
|
|
statements that will be executed once. @code{CLAUSES} are any of the
|
1948 |
|
|
@code{OMP} single construct's clauses: private, firstprivate,
|
1949 |
|
|
copyprivate, nowait.
|
1950 |
|
|
@end deftypefn
|
1951 |
|
|
|
1952 |
|
|
@deftypefn {GIMPLE function} tree gimple_omp_single_clauses (gimple g)
|
1953 |
|
|
Return the clauses associated with @code{OMP_SINGLE} @code{G}.
|
1954 |
|
|
@end deftypefn
|
1955 |
|
|
|
1956 |
|
|
@deftypefn {GIMPLE function} tree *gimple_omp_single_clauses_ptr (gimple g)
|
1957 |
|
|
Return a pointer to the clauses associated with @code{OMP_SINGLE} @code{G}.
|
1958 |
|
|
@end deftypefn
|
1959 |
|
|
|
1960 |
|
|
@deftypefn {GIMPLE function} void gimple_omp_single_set_clauses (gimple g, tree clauses)
|
1961 |
|
|
Set @code{CLAUSES} to be the clauses associated with @code{OMP_SINGLE} @code{G}.
|
1962 |
|
|
@end deftypefn
|
1963 |
|
|
|
1964 |
|
|
|
1965 |
|
|
@node @code{GIMPLE_PHI}
|
1966 |
|
|
@subsection @code{GIMPLE_PHI}
|
1967 |
|
|
@cindex @code{GIMPLE_PHI}
|
1968 |
|
|
|
1969 |
|
|
@deftypefn {GIMPLE function} gimple make_phi_node (tree var, int len)
|
1970 |
|
|
Build a @code{PHI} node with len argument slots for variable var.
|
1971 |
|
|
@end deftypefn
|
1972 |
|
|
|
1973 |
|
|
@deftypefn {GIMPLE function} unsigned gimple_phi_capacity (gimple g)
|
1974 |
|
|
Return the maximum number of arguments supported by @code{GIMPLE_PHI} @code{G}.
|
1975 |
|
|
@end deftypefn
|
1976 |
|
|
|
1977 |
|
|
@deftypefn {GIMPLE function} unsigned gimple_phi_num_args (gimple g)
|
1978 |
|
|
Return the number of arguments in @code{GIMPLE_PHI} @code{G}. This must always
|
1979 |
|
|
be exactly the number of incoming edges for the basic block
|
1980 |
|
|
holding @code{G}.
|
1981 |
|
|
@end deftypefn
|
1982 |
|
|
|
1983 |
|
|
@deftypefn {GIMPLE function} tree gimple_phi_result (gimple g)
|
1984 |
|
|
Return the @code{SSA} name created by @code{GIMPLE_PHI} @code{G}.
|
1985 |
|
|
@end deftypefn
|
1986 |
|
|
|
1987 |
|
|
@deftypefn {GIMPLE function} tree *gimple_phi_result_ptr (gimple g)
|
1988 |
|
|
Return a pointer to the @code{SSA} name created by @code{GIMPLE_PHI} @code{G}.
|
1989 |
|
|
@end deftypefn
|
1990 |
|
|
|
1991 |
|
|
@deftypefn {GIMPLE function} void gimple_phi_set_result (gimple g, tree result)
|
1992 |
|
|
Set @code{RESULT} to be the @code{SSA} name created by @code{GIMPLE_PHI} @code{G}.
|
1993 |
|
|
@end deftypefn
|
1994 |
|
|
|
1995 |
|
|
@deftypefn {GIMPLE function} struct phi_arg_d *gimple_phi_arg (gimple g, index)
|
1996 |
|
|
Return the @code{PHI} argument corresponding to incoming edge @code{INDEX} for
|
1997 |
|
|
@code{GIMPLE_PHI} @code{G}.
|
1998 |
|
|
@end deftypefn
|
1999 |
|
|
|
2000 |
|
|
@deftypefn {GIMPLE function} void gimple_phi_set_arg (gimple g, index, struct phi_arg_d * phiarg)
|
2001 |
|
|
Set @code{PHIARG} to be the argument corresponding to incoming edge
|
2002 |
|
|
@code{INDEX} for @code{GIMPLE_PHI} @code{G}.
|
2003 |
|
|
@end deftypefn
|
2004 |
|
|
|
2005 |
|
|
@node @code{GIMPLE_RESX}
|
2006 |
|
|
@subsection @code{GIMPLE_RESX}
|
2007 |
|
|
@cindex @code{GIMPLE_RESX}
|
2008 |
|
|
|
2009 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_resx (int region)
|
2010 |
|
|
Build a @code{GIMPLE_RESX} statement which is a statement. This
|
2011 |
|
|
statement is a placeholder for _Unwind_Resume before we know if a
|
2012 |
|
|
function call or a branch is needed. @code{REGION} is the exception
|
2013 |
|
|
region from which control is flowing.
|
2014 |
|
|
@end deftypefn
|
2015 |
|
|
|
2016 |
|
|
@deftypefn {GIMPLE function} int gimple_resx_region (gimple g)
|
2017 |
|
|
Return the region number for @code{GIMPLE_RESX} @code{G}.
|
2018 |
|
|
@end deftypefn
|
2019 |
|
|
|
2020 |
|
|
@deftypefn {GIMPLE function} void gimple_resx_set_region (gimple g, int region)
|
2021 |
|
|
Set @code{REGION} to be the region number for @code{GIMPLE_RESX} @code{G}.
|
2022 |
|
|
@end deftypefn
|
2023 |
|
|
|
2024 |
|
|
@node @code{GIMPLE_RETURN}
|
2025 |
|
|
@subsection @code{GIMPLE_RETURN}
|
2026 |
|
|
@cindex @code{GIMPLE_RETURN}
|
2027 |
|
|
|
2028 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_return (tree retval)
|
2029 |
|
|
Build a @code{GIMPLE_RETURN} statement whose return value is retval.
|
2030 |
|
|
@end deftypefn
|
2031 |
|
|
|
2032 |
|
|
@deftypefn {GIMPLE function} tree gimple_return_retval (gimple g)
|
2033 |
|
|
Return the return value for @code{GIMPLE_RETURN} @code{G}.
|
2034 |
|
|
@end deftypefn
|
2035 |
|
|
|
2036 |
|
|
@deftypefn {GIMPLE function} void gimple_return_set_retval (gimple g, tree retval)
|
2037 |
|
|
Set @code{RETVAL} to be the return value for @code{GIMPLE_RETURN} @code{G}.
|
2038 |
|
|
@end deftypefn
|
2039 |
|
|
|
2040 |
|
|
@node @code{GIMPLE_SWITCH}
|
2041 |
|
|
@subsection @code{GIMPLE_SWITCH}
|
2042 |
|
|
@cindex @code{GIMPLE_SWITCH}
|
2043 |
|
|
|
2044 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_switch ( nlabels, tree index, tree default_label, ...)
|
2045 |
|
|
Build a @code{GIMPLE_SWITCH} statement. @code{NLABELS} are the number of
|
2046 |
|
|
labels excluding the default label. The default label is passed
|
2047 |
|
|
in @code{DEFAULT_LABEL}. The rest of the arguments are trees
|
2048 |
|
|
representing the labels. Each label is a tree of code
|
2049 |
|
|
@code{CASE_LABEL_EXPR}.
|
2050 |
|
|
@end deftypefn
|
2051 |
|
|
|
2052 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_switch_vec (tree index, tree default_label, @code{VEC}(tree,heap) *args)
|
2053 |
|
|
This function is an alternate way of building @code{GIMPLE_SWITCH}
|
2054 |
|
|
statements. @code{INDEX} and @code{DEFAULT_LABEL} are as in
|
2055 |
|
|
gimple_build_switch. @code{ARGS} is a vector of @code{CASE_LABEL_EXPR} trees
|
2056 |
|
|
that contain the labels.
|
2057 |
|
|
@end deftypefn
|
2058 |
|
|
|
2059 |
|
|
@deftypefn {GIMPLE function} unsigned gimple_switch_num_labels (gimple g)
|
2060 |
|
|
Return the number of labels associated with the switch statement
|
2061 |
|
|
@code{G}.
|
2062 |
|
|
@end deftypefn
|
2063 |
|
|
|
2064 |
|
|
@deftypefn {GIMPLE function} void gimple_switch_set_num_labels (gimple g, unsigned nlabels)
|
2065 |
|
|
Set @code{NLABELS} to be the number of labels for the switch statement
|
2066 |
|
|
@code{G}.
|
2067 |
|
|
@end deftypefn
|
2068 |
|
|
|
2069 |
|
|
@deftypefn {GIMPLE function} tree gimple_switch_index (gimple g)
|
2070 |
|
|
Return the index variable used by the switch statement @code{G}.
|
2071 |
|
|
@end deftypefn
|
2072 |
|
|
|
2073 |
|
|
@deftypefn {GIMPLE function} void gimple_switch_set_index (gimple g, tree index)
|
2074 |
|
|
Set @code{INDEX} to be the index variable for switch statement @code{G}.
|
2075 |
|
|
@end deftypefn
|
2076 |
|
|
|
2077 |
|
|
@deftypefn {GIMPLE function} tree gimple_switch_label (gimple g, unsigned index)
|
2078 |
|
|
Return the label numbered @code{INDEX}. The default label is 0, followed
|
2079 |
|
|
by any labels in a switch statement.
|
2080 |
|
|
@end deftypefn
|
2081 |
|
|
|
2082 |
|
|
@deftypefn {GIMPLE function} void gimple_switch_set_label (gimple g, unsigned index, tree label)
|
2083 |
|
|
Set the label number @code{INDEX} to @code{LABEL}. 0 is always the default
|
2084 |
|
|
label.
|
2085 |
|
|
@end deftypefn
|
2086 |
|
|
|
2087 |
|
|
@deftypefn {GIMPLE function} tree gimple_switch_default_label (gimple g)
|
2088 |
|
|
Return the default label for a switch statement.
|
2089 |
|
|
@end deftypefn
|
2090 |
|
|
|
2091 |
|
|
@deftypefn {GIMPLE function} void gimple_switch_set_default_label (gimple g, tree label)
|
2092 |
|
|
Set the default label for a switch statement.
|
2093 |
|
|
@end deftypefn
|
2094 |
|
|
|
2095 |
|
|
|
2096 |
|
|
@node @code{GIMPLE_TRY}
|
2097 |
|
|
@subsection @code{GIMPLE_TRY}
|
2098 |
|
|
@cindex @code{GIMPLE_TRY}
|
2099 |
|
|
|
2100 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_try (gimple_seq eval, gimple_seq cleanup, unsigned int kind)
|
2101 |
|
|
Build a @code{GIMPLE_TRY} statement. @code{EVAL} is a sequence with the
|
2102 |
|
|
expression to evaluate. @code{CLEANUP} is a sequence of statements to
|
2103 |
|
|
run at clean-up time. @code{KIND} is the enumeration value
|
2104 |
|
|
@code{GIMPLE_TRY_CATCH} if this statement denotes a try/catch construct
|
2105 |
|
|
or @code{GIMPLE_TRY_FINALLY} if this statement denotes a try/finally
|
2106 |
|
|
construct.
|
2107 |
|
|
@end deftypefn
|
2108 |
|
|
|
2109 |
|
|
@deftypefn {GIMPLE function} enum gimple_try_flags gimple_try_kind (gimple g)
|
2110 |
|
|
Return the kind of try block represented by @code{GIMPLE_TRY} @code{G}. This is
|
2111 |
|
|
either @code{GIMPLE_TRY_CATCH} or @code{GIMPLE_TRY_FINALLY}.
|
2112 |
|
|
@end deftypefn
|
2113 |
|
|
|
2114 |
|
|
@deftypefn {GIMPLE function} bool gimple_try_catch_is_cleanup (gimple g)
|
2115 |
|
|
Return the @code{GIMPLE_TRY_CATCH_IS_CLEANUP} flag.
|
2116 |
|
|
@end deftypefn
|
2117 |
|
|
|
2118 |
|
|
@deftypefn {GIMPLE function} gimple_seq gimple_try_eval (gimple g)
|
2119 |
|
|
Return the sequence of statements used as the body for @code{GIMPLE_TRY}
|
2120 |
|
|
@code{G}.
|
2121 |
|
|
@end deftypefn
|
2122 |
|
|
|
2123 |
|
|
@deftypefn {GIMPLE function} gimple_seq gimple_try_cleanup (gimple g)
|
2124 |
|
|
Return the sequence of statements used as the cleanup body for
|
2125 |
|
|
@code{GIMPLE_TRY} @code{G}.
|
2126 |
|
|
@end deftypefn
|
2127 |
|
|
|
2128 |
|
|
@deftypefn {GIMPLE function} void gimple_try_set_catch_is_cleanup (gimple g, bool catch_is_cleanup)
|
2129 |
|
|
Set the @code{GIMPLE_TRY_CATCH_IS_CLEANUP} flag.
|
2130 |
|
|
@end deftypefn
|
2131 |
|
|
|
2132 |
|
|
@deftypefn {GIMPLE function} void gimple_try_set_eval (gimple g, gimple_seq eval)
|
2133 |
|
|
Set @code{EVAL} to be the sequence of statements to use as the body for
|
2134 |
|
|
@code{GIMPLE_TRY} @code{G}.
|
2135 |
|
|
@end deftypefn
|
2136 |
|
|
|
2137 |
|
|
@deftypefn {GIMPLE function} void gimple_try_set_cleanup (gimple g, gimple_seq cleanup)
|
2138 |
|
|
Set @code{CLEANUP} to be the sequence of statements to use as the
|
2139 |
|
|
cleanup body for @code{GIMPLE_TRY} @code{G}.
|
2140 |
|
|
@end deftypefn
|
2141 |
|
|
|
2142 |
|
|
@node @code{GIMPLE_WITH_CLEANUP_EXPR}
|
2143 |
|
|
@subsection @code{GIMPLE_WITH_CLEANUP_EXPR}
|
2144 |
|
|
@cindex @code{GIMPLE_WITH_CLEANUP_EXPR}
|
2145 |
|
|
|
2146 |
|
|
@deftypefn {GIMPLE function} gimple gimple_build_wce (gimple_seq cleanup)
|
2147 |
|
|
Build a @code{GIMPLE_WITH_CLEANUP_EXPR} statement. @code{CLEANUP} is the
|
2148 |
|
|
clean-up expression.
|
2149 |
|
|
@end deftypefn
|
2150 |
|
|
|
2151 |
|
|
@deftypefn {GIMPLE function} gimple_seq gimple_wce_cleanup (gimple g)
|
2152 |
|
|
Return the cleanup sequence for cleanup statement @code{G}.
|
2153 |
|
|
@end deftypefn
|
2154 |
|
|
|
2155 |
|
|
@deftypefn {GIMPLE function} void gimple_wce_set_cleanup (gimple g, gimple_seq cleanup)
|
2156 |
|
|
Set @code{CLEANUP} to be the cleanup sequence for @code{G}.
|
2157 |
|
|
@end deftypefn
|
2158 |
|
|
|
2159 |
|
|
@deftypefn {GIMPLE function} bool gimple_wce_cleanup_eh_only (gimple g)
|
2160 |
|
|
Return the @code{CLEANUP_EH_ONLY} flag for a @code{WCE} tuple.
|
2161 |
|
|
@end deftypefn
|
2162 |
|
|
|
2163 |
|
|
@deftypefn {GIMPLE function} void gimple_wce_set_cleanup_eh_only (gimple g, bool eh_only_p)
|
2164 |
|
|
Set the @code{CLEANUP_EH_ONLY} flag for a @code{WCE} tuple.
|
2165 |
|
|
@end deftypefn
|
2166 |
|
|
|
2167 |
|
|
|
2168 |
|
|
@node GIMPLE sequences
|
2169 |
|
|
@section GIMPLE sequences
|
2170 |
|
|
@cindex GIMPLE sequences
|
2171 |
|
|
|
2172 |
|
|
GIMPLE sequences are the tuple equivalent of @code{STATEMENT_LIST}'s
|
2173 |
|
|
used in @code{GENERIC}. They are used to chain statements together, and
|
2174 |
|
|
when used in conjunction with sequence iterators, provide a
|
2175 |
|
|
framework for iterating through statements.
|
2176 |
|
|
|
2177 |
|
|
GIMPLE sequences are of type struct @code{gimple_sequence}, but are more
|
2178 |
|
|
commonly passed by reference to functions dealing with sequences.
|
2179 |
|
|
The type for a sequence pointer is @code{gimple_seq} which is the same
|
2180 |
|
|
as struct @code{gimple_sequence} *. When declaring a local sequence,
|
2181 |
|
|
you can define a local variable of type struct @code{gimple_sequence}.
|
2182 |
|
|
When declaring a sequence allocated on the garbage collected
|
2183 |
|
|
heap, use the function @code{gimple_seq_alloc} documented below.
|
2184 |
|
|
|
2185 |
|
|
There are convenience functions for iterating through sequences
|
2186 |
|
|
in the section entitled Sequence Iterators.
|
2187 |
|
|
|
2188 |
|
|
Below is a list of functions to manipulate and query sequences.
|
2189 |
|
|
|
2190 |
|
|
@deftypefn {GIMPLE function} void gimple_seq_add_stmt (gimple_seq *seq, gimple g)
|
2191 |
|
|
Link a gimple statement to the end of the sequence *@code{SEQ} if @code{G} is
|
2192 |
|
|
not @code{NULL}. If *@code{SEQ} is @code{NULL}, allocate a sequence before linking.
|
2193 |
|
|
@end deftypefn
|
2194 |
|
|
|
2195 |
|
|
@deftypefn {GIMPLE function} void gimple_seq_add_seq (gimple_seq *dest, gimple_seq src)
|
2196 |
|
|
Append sequence @code{SRC} to the end of sequence *@code{DEST} if @code{SRC} is not
|
2197 |
|
|
@code{NULL}. If *@code{DEST} is @code{NULL}, allocate a new sequence before
|
2198 |
|
|
appending.
|
2199 |
|
|
@end deftypefn
|
2200 |
|
|
|
2201 |
|
|
@deftypefn {GIMPLE function} gimple_seq gimple_seq_deep_copy (gimple_seq src)
|
2202 |
|
|
Perform a deep copy of sequence @code{SRC} and return the result.
|
2203 |
|
|
@end deftypefn
|
2204 |
|
|
|
2205 |
|
|
@deftypefn {GIMPLE function} gimple_seq gimple_seq_reverse (gimple_seq seq)
|
2206 |
|
|
Reverse the order of the statements in the sequence @code{SEQ}. Return
|
2207 |
|
|
@code{SEQ}.
|
2208 |
|
|
@end deftypefn
|
2209 |
|
|
|
2210 |
|
|
@deftypefn {GIMPLE function} gimple gimple_seq_first (gimple_seq s)
|
2211 |
|
|
Return the first statement in sequence @code{S}.
|
2212 |
|
|
@end deftypefn
|
2213 |
|
|
|
2214 |
|
|
@deftypefn {GIMPLE function} gimple gimple_seq_last (gimple_seq s)
|
2215 |
|
|
Return the last statement in sequence @code{S}.
|
2216 |
|
|
@end deftypefn
|
2217 |
|
|
|
2218 |
|
|
@deftypefn {GIMPLE function} void gimple_seq_set_last (gimple_seq s, gimple last)
|
2219 |
|
|
Set the last statement in sequence @code{S} to the statement in @code{LAST}.
|
2220 |
|
|
@end deftypefn
|
2221 |
|
|
|
2222 |
|
|
@deftypefn {GIMPLE function} void gimple_seq_set_first (gimple_seq s, gimple first)
|
2223 |
|
|
Set the first statement in sequence @code{S} to the statement in @code{FIRST}.
|
2224 |
|
|
@end deftypefn
|
2225 |
|
|
|
2226 |
|
|
@deftypefn {GIMPLE function} void gimple_seq_init (gimple_seq s)
|
2227 |
|
|
Initialize sequence @code{S} to an empty sequence.
|
2228 |
|
|
@end deftypefn
|
2229 |
|
|
|
2230 |
|
|
@deftypefn {GIMPLE function} gimple_seq gimple_seq_alloc (void)
|
2231 |
|
|
Allocate a new sequence in the garbage collected store and return
|
2232 |
|
|
it.
|
2233 |
|
|
@end deftypefn
|
2234 |
|
|
|
2235 |
|
|
@deftypefn {GIMPLE function} void gimple_seq_copy (gimple_seq dest, gimple_seq src)
|
2236 |
|
|
Copy the sequence @code{SRC} into the sequence @code{DEST}.
|
2237 |
|
|
@end deftypefn
|
2238 |
|
|
|
2239 |
|
|
@deftypefn {GIMPLE function} bool gimple_seq_empty_p (gimple_seq s)
|
2240 |
|
|
Return true if the sequence @code{S} is empty.
|
2241 |
|
|
@end deftypefn
|
2242 |
|
|
|
2243 |
|
|
@deftypefn {GIMPLE function} gimple_seq bb_seq (basic_block bb)
|
2244 |
|
|
Returns the sequence of statements in @code{BB}.
|
2245 |
|
|
@end deftypefn
|
2246 |
|
|
|
2247 |
|
|
@deftypefn {GIMPLE function} void set_bb_seq (basic_block bb, gimple_seq seq)
|
2248 |
|
|
Sets the sequence of statements in @code{BB} to @code{SEQ}.
|
2249 |
|
|
@end deftypefn
|
2250 |
|
|
|
2251 |
|
|
@deftypefn {GIMPLE function} bool gimple_seq_singleton_p (gimple_seq seq)
|
2252 |
|
|
Determine whether @code{SEQ} contains exactly one statement.
|
2253 |
|
|
@end deftypefn
|
2254 |
|
|
|
2255 |
|
|
@node Sequence iterators
|
2256 |
|
|
@section Sequence iterators
|
2257 |
|
|
@cindex Sequence iterators
|
2258 |
|
|
|
2259 |
|
|
Sequence iterators are convenience constructs for iterating
|
2260 |
|
|
through statements in a sequence. Given a sequence @code{SEQ}, here is
|
2261 |
|
|
a typical use of gimple sequence iterators:
|
2262 |
|
|
|
2263 |
|
|
@smallexample
|
2264 |
|
|
gimple_stmt_iterator gsi;
|
2265 |
|
|
|
2266 |
|
|
for (gsi = gsi_start (seq); !gsi_end_p (gsi); gsi_next (&gsi))
|
2267 |
|
|
@{
|
2268 |
|
|
gimple g = gsi_stmt (gsi);
|
2269 |
|
|
/* Do something with gimple statement @code{G}. */
|
2270 |
|
|
@}
|
2271 |
|
|
@end smallexample
|
2272 |
|
|
|
2273 |
|
|
Backward iterations are possible:
|
2274 |
|
|
|
2275 |
|
|
@smallexample
|
2276 |
|
|
for (gsi = gsi_last (seq); !gsi_end_p (gsi); gsi_prev (&gsi))
|
2277 |
|
|
@end smallexample
|
2278 |
|
|
|
2279 |
|
|
Forward and backward iterations on basic blocks are possible with
|
2280 |
|
|
@code{gsi_start_bb} and @code{gsi_last_bb}.
|
2281 |
|
|
|
2282 |
|
|
In the documentation below we sometimes refer to enum
|
2283 |
|
|
@code{gsi_iterator_update}. The valid options for this enumeration are:
|
2284 |
|
|
|
2285 |
|
|
@itemize @bullet
|
2286 |
|
|
@item @code{GSI_NEW_STMT}
|
2287 |
|
|
Only valid when a single statement is added. Move the iterator to it.
|
2288 |
|
|
|
2289 |
|
|
@item @code{GSI_SAME_STMT}
|
2290 |
|
|
Leave the iterator at the same statement.
|
2291 |
|
|
|
2292 |
|
|
@item @code{GSI_CONTINUE_LINKING}
|
2293 |
|
|
Move iterator to whatever position is suitable for linking other
|
2294 |
|
|
statements in the same direction.
|
2295 |
|
|
@end itemize
|
2296 |
|
|
|
2297 |
|
|
Below is a list of the functions used to manipulate and use
|
2298 |
|
|
statement iterators.
|
2299 |
|
|
|
2300 |
|
|
@deftypefn {GIMPLE function} gimple_stmt_iterator gsi_start (gimple_seq seq)
|
2301 |
|
|
Return a new iterator pointing to the sequence @code{SEQ}'s first
|
2302 |
|
|
statement. If @code{SEQ} is empty, the iterator's basic block is @code{NULL}.
|
2303 |
|
|
Use @code{gsi_start_bb} instead when the iterator needs to always have
|
2304 |
|
|
the correct basic block set.
|
2305 |
|
|
@end deftypefn
|
2306 |
|
|
|
2307 |
|
|
@deftypefn {GIMPLE function} gimple_stmt_iterator gsi_start_bb (basic_block bb)
|
2308 |
|
|
Return a new iterator pointing to the first statement in basic
|
2309 |
|
|
block @code{BB}.
|
2310 |
|
|
@end deftypefn
|
2311 |
|
|
|
2312 |
|
|
@deftypefn {GIMPLE function} gimple_stmt_iterator gsi_last (gimple_seq seq)
|
2313 |
|
|
Return a new iterator initially pointing to the last statement of
|
2314 |
|
|
sequence @code{SEQ}. If @code{SEQ} is empty, the iterator's basic block is
|
2315 |
|
|
@code{NULL}. Use @code{gsi_last_bb} instead when the iterator needs to always
|
2316 |
|
|
have the correct basic block set.
|
2317 |
|
|
@end deftypefn
|
2318 |
|
|
|
2319 |
|
|
@deftypefn {GIMPLE function} gimple_stmt_iterator gsi_last_bb (basic_block bb)
|
2320 |
|
|
Return a new iterator pointing to the last statement in basic
|
2321 |
|
|
block @code{BB}.
|
2322 |
|
|
@end deftypefn
|
2323 |
|
|
|
2324 |
|
|
@deftypefn {GIMPLE function} bool gsi_end_p (gimple_stmt_iterator i)
|
2325 |
|
|
Return @code{TRUE} if at the end of @code{I}.
|
2326 |
|
|
@end deftypefn
|
2327 |
|
|
|
2328 |
|
|
@deftypefn {GIMPLE function} bool gsi_one_before_end_p (gimple_stmt_iterator i)
|
2329 |
|
|
Return @code{TRUE} if we're one statement before the end of @code{I}.
|
2330 |
|
|
@end deftypefn
|
2331 |
|
|
|
2332 |
|
|
@deftypefn {GIMPLE function} void gsi_next (gimple_stmt_iterator *i)
|
2333 |
|
|
Advance the iterator to the next gimple statement.
|
2334 |
|
|
@end deftypefn
|
2335 |
|
|
|
2336 |
|
|
@deftypefn {GIMPLE function} void gsi_prev (gimple_stmt_iterator *i)
|
2337 |
|
|
Advance the iterator to the previous gimple statement.
|
2338 |
|
|
@end deftypefn
|
2339 |
|
|
|
2340 |
|
|
@deftypefn {GIMPLE function} gimple gsi_stmt (gimple_stmt_iterator i)
|
2341 |
|
|
Return the current stmt.
|
2342 |
|
|
@end deftypefn
|
2343 |
|
|
|
2344 |
|
|
@deftypefn {GIMPLE function} gimple_stmt_iterator gsi_after_labels (basic_block bb)
|
2345 |
|
|
Return a block statement iterator that points to the first
|
2346 |
|
|
non-label statement in block @code{BB}.
|
2347 |
|
|
@end deftypefn
|
2348 |
|
|
|
2349 |
|
|
@deftypefn {GIMPLE function} gimple *gsi_stmt_ptr (gimple_stmt_iterator *i)
|
2350 |
|
|
Return a pointer to the current stmt.
|
2351 |
|
|
@end deftypefn
|
2352 |
|
|
|
2353 |
|
|
@deftypefn {GIMPLE function} basic_block gsi_bb (gimple_stmt_iterator i)
|
2354 |
|
|
Return the basic block associated with this iterator.
|
2355 |
|
|
@end deftypefn
|
2356 |
|
|
|
2357 |
|
|
@deftypefn {GIMPLE function} gimple_seq gsi_seq (gimple_stmt_iterator i)
|
2358 |
|
|
Return the sequence associated with this iterator.
|
2359 |
|
|
@end deftypefn
|
2360 |
|
|
|
2361 |
|
|
@deftypefn {GIMPLE function} void gsi_remove (gimple_stmt_iterator *i, bool remove_eh_info)
|
2362 |
|
|
Remove the current stmt from the sequence. The iterator is
|
2363 |
|
|
updated to point to the next statement. When @code{REMOVE_EH_INFO} is
|
2364 |
|
|
true we remove the statement pointed to by iterator @code{I} from the @code{EH}
|
2365 |
|
|
tables. Otherwise we do not modify the @code{EH} tables. Generally,
|
2366 |
|
|
@code{REMOVE_EH_INFO} should be true when the statement is going to be
|
2367 |
|
|
removed from the @code{IL} and not reinserted elsewhere.
|
2368 |
|
|
@end deftypefn
|
2369 |
|
|
|
2370 |
|
|
@deftypefn {GIMPLE function} void gsi_link_seq_before (gimple_stmt_iterator *i, gimple_seq seq, enum gsi_iterator_update mode)
|
2371 |
|
|
Links the sequence of statements @code{SEQ} before the statement pointed
|
2372 |
|
|
by iterator @code{I}. @code{MODE} indicates what to do with the iterator
|
2373 |
|
|
after insertion (see @code{enum gsi_iterator_update} above).
|
2374 |
|
|
@end deftypefn
|
2375 |
|
|
|
2376 |
|
|
@deftypefn {GIMPLE function} void gsi_link_before (gimple_stmt_iterator *i, gimple g, enum gsi_iterator_update mode)
|
2377 |
|
|
Links statement @code{G} before the statement pointed-to by iterator @code{I}.
|
2378 |
|
|
Updates iterator @code{I} according to @code{MODE}.
|
2379 |
|
|
@end deftypefn
|
2380 |
|
|
|
2381 |
|
|
@deftypefn {GIMPLE function} void gsi_link_seq_after (gimple_stmt_iterator *i, gimple_seq seq, enum gsi_iterator_update mode)
|
2382 |
|
|
Links sequence @code{SEQ} after the statement pointed-to by iterator @code{I}.
|
2383 |
|
|
@code{MODE} is as in @code{gsi_insert_after}.
|
2384 |
|
|
@end deftypefn
|
2385 |
|
|
|
2386 |
|
|
@deftypefn {GIMPLE function} void gsi_link_after (gimple_stmt_iterator *i, gimple g, enum gsi_iterator_update mode)
|
2387 |
|
|
Links statement @code{G} after the statement pointed-to by iterator @code{I}.
|
2388 |
|
|
@code{MODE} is as in @code{gsi_insert_after}.
|
2389 |
|
|
@end deftypefn
|
2390 |
|
|
|
2391 |
|
|
@deftypefn {GIMPLE function} gimple_seq gsi_split_seq_after (gimple_stmt_iterator i)
|
2392 |
|
|
Move all statements in the sequence after @code{I} to a new sequence.
|
2393 |
|
|
Return this new sequence.
|
2394 |
|
|
@end deftypefn
|
2395 |
|
|
|
2396 |
|
|
@deftypefn {GIMPLE function} gimple_seq gsi_split_seq_before (gimple_stmt_iterator *i)
|
2397 |
|
|
Move all statements in the sequence before @code{I} to a new sequence.
|
2398 |
|
|
Return this new sequence.
|
2399 |
|
|
@end deftypefn
|
2400 |
|
|
|
2401 |
|
|
@deftypefn {GIMPLE function} void gsi_replace (gimple_stmt_iterator *i, gimple stmt, bool update_eh_info)
|
2402 |
|
|
Replace the statement pointed-to by @code{I} to @code{STMT}. If @code{UPDATE_EH_INFO}
|
2403 |
|
|
is true, the exception handling information of the original
|
2404 |
|
|
statement is moved to the new statement.
|
2405 |
|
|
@end deftypefn
|
2406 |
|
|
|
2407 |
|
|
@deftypefn {GIMPLE function} void gsi_insert_before (gimple_stmt_iterator *i, gimple stmt, enum gsi_iterator_update mode)
|
2408 |
|
|
Insert statement @code{STMT} before the statement pointed-to by iterator
|
2409 |
|
|
@code{I}, update @code{STMT}'s basic block and scan it for new operands. @code{MODE}
|
2410 |
|
|
specifies how to update iterator @code{I} after insertion (see enum
|
2411 |
|
|
@code{gsi_iterator_update}).
|
2412 |
|
|
@end deftypefn
|
2413 |
|
|
|
2414 |
|
|
@deftypefn {GIMPLE function} void gsi_insert_seq_before (gimple_stmt_iterator *i, gimple_seq seq, enum gsi_iterator_update mode)
|
2415 |
|
|
Like @code{gsi_insert_before}, but for all the statements in @code{SEQ}.
|
2416 |
|
|
@end deftypefn
|
2417 |
|
|
|
2418 |
|
|
@deftypefn {GIMPLE function} void gsi_insert_after (gimple_stmt_iterator *i, gimple stmt, enum gsi_iterator_update mode)
|
2419 |
|
|
Insert statement @code{STMT} after the statement pointed-to by iterator
|
2420 |
|
|
@code{I}, update @code{STMT}'s basic block and scan it for new operands. @code{MODE}
|
2421 |
|
|
specifies how to update iterator @code{I} after insertion (see enum
|
2422 |
|
|
@code{gsi_iterator_update}).
|
2423 |
|
|
@end deftypefn
|
2424 |
|
|
|
2425 |
|
|
@deftypefn {GIMPLE function} void gsi_insert_seq_after (gimple_stmt_iterator *i, gimple_seq seq, enum gsi_iterator_update mode)
|
2426 |
|
|
Like @code{gsi_insert_after}, but for all the statements in @code{SEQ}.
|
2427 |
|
|
@end deftypefn
|
2428 |
|
|
|
2429 |
|
|
@deftypefn {GIMPLE function} gimple_stmt_iterator gsi_for_stmt (gimple stmt)
|
2430 |
|
|
Finds iterator for @code{STMT}.
|
2431 |
|
|
@end deftypefn
|
2432 |
|
|
|
2433 |
|
|
@deftypefn {GIMPLE function} void gsi_move_after (gimple_stmt_iterator *from, gimple_stmt_iterator *to)
|
2434 |
|
|
Move the statement at @code{FROM} so it comes right after the statement
|
2435 |
|
|
at @code{TO}.
|
2436 |
|
|
@end deftypefn
|
2437 |
|
|
|
2438 |
|
|
@deftypefn {GIMPLE function} void gsi_move_before (gimple_stmt_iterator *from, gimple_stmt_iterator *to)
|
2439 |
|
|
Move the statement at @code{FROM} so it comes right before the statement
|
2440 |
|
|
at @code{TO}.
|
2441 |
|
|
@end deftypefn
|
2442 |
|
|
|
2443 |
|
|
@deftypefn {GIMPLE function} void gsi_move_to_bb_end (gimple_stmt_iterator *from, basic_block bb)
|
2444 |
|
|
Move the statement at @code{FROM} to the end of basic block @code{BB}.
|
2445 |
|
|
@end deftypefn
|
2446 |
|
|
|
2447 |
|
|
@deftypefn {GIMPLE function} void gsi_insert_on_edge (edge e, gimple stmt)
|
2448 |
|
|
Add @code{STMT} to the pending list of edge @code{E}. No actual insertion is
|
2449 |
|
|
made until a call to @code{gsi_commit_edge_inserts}() is made.
|
2450 |
|
|
@end deftypefn
|
2451 |
|
|
|
2452 |
|
|
@deftypefn {GIMPLE function} void gsi_insert_seq_on_edge (edge e, gimple_seq seq)
|
2453 |
|
|
Add the sequence of statements in @code{SEQ} to the pending list of edge
|
2454 |
|
|
@code{E}. No actual insertion is made until a call to
|
2455 |
|
|
@code{gsi_commit_edge_inserts}() is made.
|
2456 |
|
|
@end deftypefn
|
2457 |
|
|
|
2458 |
|
|
@deftypefn {GIMPLE function} basic_block gsi_insert_on_edge_immediate (edge e, gimple stmt)
|
2459 |
|
|
Similar to @code{gsi_insert_on_edge}+@code{gsi_commit_edge_inserts}. If a new
|
2460 |
|
|
block has to be created, it is returned.
|
2461 |
|
|
@end deftypefn
|
2462 |
|
|
|
2463 |
|
|
@deftypefn {GIMPLE function} void gsi_commit_one_edge_insert (edge e, basic_block *new_bb)
|
2464 |
|
|
Commit insertions pending at edge @code{E}. If a new block is created,
|
2465 |
|
|
set @code{NEW_BB} to this block, otherwise set it to @code{NULL}.
|
2466 |
|
|
@end deftypefn
|
2467 |
|
|
|
2468 |
|
|
@deftypefn {GIMPLE function} void gsi_commit_edge_inserts (void)
|
2469 |
|
|
This routine will commit all pending edge insertions, creating
|
2470 |
|
|
any new basic blocks which are necessary.
|
2471 |
|
|
@end deftypefn
|
2472 |
|
|
|
2473 |
|
|
|
2474 |
|
|
@node Adding a new GIMPLE statement code
|
2475 |
|
|
@section Adding a new GIMPLE statement code
|
2476 |
|
|
@cindex Adding a new GIMPLE statement code
|
2477 |
|
|
|
2478 |
|
|
The first step in adding a new GIMPLE statement code, is
|
2479 |
|
|
modifying the file @code{gimple.def}, which contains all the GIMPLE
|
2480 |
|
|
codes. Then you must add a corresponding structure, and an entry
|
2481 |
|
|
in @code{union gimple_statement_d}, both of which are located in
|
2482 |
|
|
@code{gimple.h}. This in turn, will require you to add a corresponding
|
2483 |
|
|
@code{GTY} tag in @code{gsstruct.def}, and code to handle this tag in
|
2484 |
|
|
@code{gss_for_code} which is located in @code{gimple.c}.
|
2485 |
|
|
|
2486 |
|
|
In order for the garbage collector to know the size of the
|
2487 |
|
|
structure you created in @code{gimple.h}, you need to add a case to
|
2488 |
|
|
handle your new GIMPLE statement in @code{gimple_size} which is located
|
2489 |
|
|
in @code{gimple.c}.
|
2490 |
|
|
|
2491 |
|
|
You will probably want to create a function to build the new
|
2492 |
|
|
gimple statement in @code{gimple.c}. The function should be called
|
2493 |
|
|
@code{gimple_build_<@code{NEW_TUPLE_NAME}>}, and should return the new tuple
|
2494 |
|
|
of type gimple.
|
2495 |
|
|
|
2496 |
|
|
If your new statement requires accessors for any members or
|
2497 |
|
|
operands it may have, put simple inline accessors in
|
2498 |
|
|
@code{gimple.h} and any non-trivial accessors in @code{gimple.c} with a
|
2499 |
|
|
corresponding prototype in @code{gimple.h}.
|
2500 |
|
|
|
2501 |
|
|
|
2502 |
|
|
@node Statement and operand traversals
|
2503 |
|
|
@section Statement and operand traversals
|
2504 |
|
|
@cindex Statement and operand traversals
|
2505 |
|
|
|
2506 |
|
|
There are two functions available for walking statements and
|
2507 |
|
|
sequences: @code{walk_gimple_stmt} and @code{walk_gimple_seq},
|
2508 |
|
|
accordingly, and a third function for walking the operands in a
|
2509 |
|
|
statement: @code{walk_gimple_op}.
|
2510 |
|
|
|
2511 |
|
|
@deftypefn {GIMPLE function} tree walk_gimple_stmt (gimple_stmt_iterator *gsi, walk_stmt_fn callback_stmt, walk_tree_fn callback_op, struct walk_stmt_info *wi)
|
2512 |
|
|
This function is used to walk the current statement in @code{GSI},
|
2513 |
|
|
optionally using traversal state stored in @code{WI}. If @code{WI} is @code{NULL}, no
|
2514 |
|
|
state is kept during the traversal.
|
2515 |
|
|
|
2516 |
|
|
The callback @code{CALLBACK_STMT} is called. If @code{CALLBACK_STMT} returns
|
2517 |
|
|
true, it means that the callback function has handled all the
|
2518 |
|
|
operands of the statement and it is not necessary to walk its
|
2519 |
|
|
operands.
|
2520 |
|
|
|
2521 |
|
|
If @code{CALLBACK_STMT} is @code{NULL} or it returns false, @code{CALLBACK_OP} is
|
2522 |
|
|
called on each operand of the statement via @code{walk_gimple_op}. If
|
2523 |
|
|
@code{walk_gimple_op} returns non-@code{NULL} for any operand, the remaining
|
2524 |
|
|
operands are not scanned.
|
2525 |
|
|
|
2526 |
|
|
The return value is that returned by the last call to
|
2527 |
|
|
@code{walk_gimple_op}, or @code{NULL_TREE} if no @code{CALLBACK_OP} is specified.
|
2528 |
|
|
@end deftypefn
|
2529 |
|
|
|
2530 |
|
|
|
2531 |
|
|
@deftypefn {GIMPLE function} tree walk_gimple_op (gimple stmt, walk_tree_fn callback_op, struct walk_stmt_info *wi)
|
2532 |
|
|
Use this function to walk the operands of statement @code{STMT}. Every
|
2533 |
|
|
operand is walked via @code{walk_tree} with optional state information
|
2534 |
|
|
in @code{WI}.
|
2535 |
|
|
|
2536 |
|
|
@code{CALLBACK_OP} is called on each operand of @code{STMT} via @code{walk_tree}.
|
2537 |
|
|
Additional parameters to @code{walk_tree} must be stored in @code{WI}. For
|
2538 |
|
|
each operand @code{OP}, @code{walk_tree} is called as:
|
2539 |
|
|
|
2540 |
|
|
@smallexample
|
2541 |
|
|
walk_tree (&@code{OP}, @code{CALLBACK_OP}, @code{WI}, @code{WI}- @code{PSET})
|
2542 |
|
|
@end smallexample
|
2543 |
|
|
|
2544 |
|
|
If @code{CALLBACK_OP} returns non-@code{NULL} for an operand, the remaining
|
2545 |
|
|
operands are not scanned. The return value is that returned by
|
2546 |
|
|
the last call to @code{walk_tree}, or @code{NULL_TREE} if no @code{CALLBACK_OP} is
|
2547 |
|
|
specified.
|
2548 |
|
|
@end deftypefn
|
2549 |
|
|
|
2550 |
|
|
|
2551 |
|
|
@deftypefn {GIMPLE function} tree walk_gimple_seq (gimple_seq seq, walk_stmt_fn callback_stmt, walk_tree_fn callback_op, struct walk_stmt_info *wi)
|
2552 |
|
|
This function walks all the statements in the sequence @code{SEQ}
|
2553 |
|
|
calling @code{walk_gimple_stmt} on each one. @code{WI} is as in
|
2554 |
|
|
@code{walk_gimple_stmt}. If @code{walk_gimple_stmt} returns non-@code{NULL}, the walk
|
2555 |
|
|
is stopped and the value returned. Otherwise, all the statements
|
2556 |
|
|
are walked and @code{NULL_TREE} returned.
|
2557 |
|
|
@end deftypefn
|