annotate gcc/jit/docs/topics/functions.rst @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1 .. Copyright (C) 2014-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
2 Originally contributed by David Malcolm <dmalcolm@redhat.com>
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This is free software: you can redistribute it and/or modify it
kono
parents:
diff changeset
5 under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
6 the Free Software Foundation, either version 3 of the License, or
kono
parents:
diff changeset
7 (at your option) any later version.
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 This program is distributed in the hope that it will be useful, but
kono
parents:
diff changeset
10 WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
kono
parents:
diff changeset
12 General Public License for more details.
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
15 along with this program. If not, see
kono
parents:
diff changeset
16 <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 .. default-domain:: c
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 Creating and using functions
kono
parents:
diff changeset
21 ============================
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 Params
kono
parents:
diff changeset
24 ------
kono
parents:
diff changeset
25 .. type:: gcc_jit_param
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 A `gcc_jit_param` represents a parameter to a function.
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 .. function:: gcc_jit_param *\
kono
parents:
diff changeset
30 gcc_jit_context_new_param (gcc_jit_context *ctxt,\
kono
parents:
diff changeset
31 gcc_jit_location *loc,\
kono
parents:
diff changeset
32 gcc_jit_type *type,\
kono
parents:
diff changeset
33 const char *name)
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 In preparation for creating a function, create a new parameter of the
kono
parents:
diff changeset
36 given type and name.
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 The parameter ``name`` must be non-NULL. The call takes a copy of the
kono
parents:
diff changeset
39 underlying string, so it is valid to pass in a pointer to an on-stack
kono
parents:
diff changeset
40 buffer.
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 Parameters are lvalues, and thus are also rvalues (and objects), so the
kono
parents:
diff changeset
43 following upcasts are available:
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 .. function:: gcc_jit_lvalue *\
kono
parents:
diff changeset
46 gcc_jit_param_as_lvalue (gcc_jit_param *param)
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 Upcasting from param to lvalue.
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 .. function:: gcc_jit_rvalue *\
kono
parents:
diff changeset
51 gcc_jit_param_as_rvalue (gcc_jit_param *param)
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 Upcasting from param to rvalue.
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 .. function:: gcc_jit_object *\
kono
parents:
diff changeset
56 gcc_jit_param_as_object (gcc_jit_param *param)
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 Upcasting from param to object.
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 Functions
kono
parents:
diff changeset
62 ---------
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 .. type:: gcc_jit_function
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 A `gcc_jit_function` represents a function - either one that we're
kono
parents:
diff changeset
67 creating ourselves, or one that we're referencing.
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 .. function:: gcc_jit_function *\
kono
parents:
diff changeset
70 gcc_jit_context_new_function (gcc_jit_context *ctxt,\
kono
parents:
diff changeset
71 gcc_jit_location *loc,\
kono
parents:
diff changeset
72 enum gcc_jit_function_kind kind,\
kono
parents:
diff changeset
73 gcc_jit_type *return_type,\
kono
parents:
diff changeset
74 const char *name,\
kono
parents:
diff changeset
75 int num_params,\
kono
parents:
diff changeset
76 gcc_jit_param **params,\
kono
parents:
diff changeset
77 int is_variadic)
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 Create a gcc_jit_function with the given name and parameters.
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 .. type:: enum gcc_jit_function_kind
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 This enum controls the kind of function created, and has the following
kono
parents:
diff changeset
84 values:
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 .. macro:: GCC_JIT_FUNCTION_EXPORTED
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 Function is defined by the client code and visible
kono
parents:
diff changeset
89 by name outside of the JIT.
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 This value is required if you want to extract machine code
kono
parents:
diff changeset
92 for this function from a :type:`gcc_jit_result` via
kono
parents:
diff changeset
93 :func:`gcc_jit_result_get_code`.
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 .. macro:: GCC_JIT_FUNCTION_INTERNAL
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 Function is defined by the client code, but is invisible
kono
parents:
diff changeset
98 outside of the JIT. Analogous to a "static" function.
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 .. macro:: GCC_JIT_FUNCTION_IMPORTED
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 Function is not defined by the client code; we're merely
kono
parents:
diff changeset
103 referring to it. Analogous to using an "extern" function from a
kono
parents:
diff changeset
104 header file.
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 .. macro:: GCC_JIT_FUNCTION_ALWAYS_INLINE
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 Function is only ever inlined into other functions, and is
kono
parents:
diff changeset
109 invisible outside of the JIT.
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 Analogous to prefixing with ``inline`` and adding
kono
parents:
diff changeset
112 ``__attribute__((always_inline))``
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 Inlining will only occur when the optimization level is
kono
parents:
diff changeset
115 above 0; when optimization is off, this is essentially the
kono
parents:
diff changeset
116 same as GCC_JIT_FUNCTION_INTERNAL.
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 The parameter ``name`` must be non-NULL. The call takes a copy of the
kono
parents:
diff changeset
119 underlying string, so it is valid to pass in a pointer to an on-stack
kono
parents:
diff changeset
120 buffer.
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 .. function:: gcc_jit_function *\
kono
parents:
diff changeset
123 gcc_jit_context_get_builtin_function (gcc_jit_context *ctxt,\
kono
parents:
diff changeset
124 const char *name)
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 .. function:: gcc_jit_object *\
kono
parents:
diff changeset
127 gcc_jit_function_as_object (gcc_jit_function *func)
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 Upcasting from function to object.
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 .. function:: gcc_jit_param *\
kono
parents:
diff changeset
132 gcc_jit_function_get_param (gcc_jit_function *func, int index)
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 Get the param of the given index (0-based).
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 .. function:: void \
kono
parents:
diff changeset
137 gcc_jit_function_dump_to_dot (gcc_jit_function *func,\
kono
parents:
diff changeset
138 const char *path)
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 Emit the function in graphviz format to the given path.
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 .. function:: gcc_jit_lvalue *\
kono
parents:
diff changeset
143 gcc_jit_function_new_local (gcc_jit_function *func,\
kono
parents:
diff changeset
144 gcc_jit_location *loc,\
kono
parents:
diff changeset
145 gcc_jit_type *type,\
kono
parents:
diff changeset
146 const char *name)
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 Create a new local variable within the function, of the given type and
kono
parents:
diff changeset
149 name.
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 The parameter ``name`` must be non-NULL. The call takes a copy of the
kono
parents:
diff changeset
152 underlying string, so it is valid to pass in a pointer to an on-stack
kono
parents:
diff changeset
153 buffer.
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 Blocks
kono
parents:
diff changeset
156 ------
kono
parents:
diff changeset
157 .. type:: gcc_jit_block
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 A `gcc_jit_block` represents a basic block within a function i.e. a
kono
parents:
diff changeset
160 sequence of statements with a single entry point and a single exit
kono
parents:
diff changeset
161 point.
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 The first basic block that you create within a function will
kono
parents:
diff changeset
164 be the entrypoint.
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 Each basic block that you create within a function must be
kono
parents:
diff changeset
167 terminated, either with a conditional, a jump, a return, or a
kono
parents:
diff changeset
168 switch.
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 It's legal to have multiple basic blocks that return within
kono
parents:
diff changeset
171 one function.
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 .. function:: gcc_jit_block *\
kono
parents:
diff changeset
174 gcc_jit_function_new_block (gcc_jit_function *func,\
kono
parents:
diff changeset
175 const char *name)
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 Create a basic block of the given name. The name may be NULL, but
kono
parents:
diff changeset
178 providing meaningful names is often helpful when debugging: it may
kono
parents:
diff changeset
179 show up in dumps of the internal representation, and in error
kono
parents:
diff changeset
180 messages. It is copied, so the input buffer does not need to outlive
kono
parents:
diff changeset
181 the call; you can pass in a pointer to an on-stack buffer, e.g.:
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 .. code-block:: c
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 for (pc = 0; pc < fn->fn_num_ops; pc++)
kono
parents:
diff changeset
186 {
kono
parents:
diff changeset
187 char buf[16];
kono
parents:
diff changeset
188 sprintf (buf, "instr%i", pc);
kono
parents:
diff changeset
189 state.op_blocks[pc] = gcc_jit_function_new_block (state.fn, buf);
kono
parents:
diff changeset
190 }
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 .. function:: gcc_jit_object *\
kono
parents:
diff changeset
193 gcc_jit_block_as_object (gcc_jit_block *block)
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 Upcast from block to object.
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 .. function:: gcc_jit_function *\
kono
parents:
diff changeset
198 gcc_jit_block_get_function (gcc_jit_block *block)
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 Which function is this block within?
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 Statements
kono
parents:
diff changeset
204 ----------
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 .. function:: void\
kono
parents:
diff changeset
207 gcc_jit_block_add_eval (gcc_jit_block *block,\
kono
parents:
diff changeset
208 gcc_jit_location *loc,\
kono
parents:
diff changeset
209 gcc_jit_rvalue *rvalue)
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 Add evaluation of an rvalue, discarding the result
kono
parents:
diff changeset
212 (e.g. a function call that "returns" void).
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 This is equivalent to this C code:
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 .. code-block:: c
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 (void)expression;
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 .. function:: void\
kono
parents:
diff changeset
221 gcc_jit_block_add_assignment (gcc_jit_block *block,\
kono
parents:
diff changeset
222 gcc_jit_location *loc,\
kono
parents:
diff changeset
223 gcc_jit_lvalue *lvalue,\
kono
parents:
diff changeset
224 gcc_jit_rvalue *rvalue)
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 Add evaluation of an rvalue, assigning the result to the given
kono
parents:
diff changeset
227 lvalue.
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 This is roughly equivalent to this C code:
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 .. code-block:: c
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 lvalue = rvalue;
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 .. function:: void\
kono
parents:
diff changeset
236 gcc_jit_block_add_assignment_op (gcc_jit_block *block,\
kono
parents:
diff changeset
237 gcc_jit_location *loc,\
kono
parents:
diff changeset
238 gcc_jit_lvalue *lvalue,\
kono
parents:
diff changeset
239 enum gcc_jit_binary_op op,\
kono
parents:
diff changeset
240 gcc_jit_rvalue *rvalue)
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 Add evaluation of an rvalue, using the result to modify an
kono
parents:
diff changeset
243 lvalue.
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 This is analogous to "+=" and friends:
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 .. code-block:: c
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 lvalue += rvalue;
kono
parents:
diff changeset
250 lvalue *= rvalue;
kono
parents:
diff changeset
251 lvalue /= rvalue;
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 etc. For example:
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 .. code-block:: c
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 /* "i++" */
kono
parents:
diff changeset
258 gcc_jit_block_add_assignment_op (
kono
parents:
diff changeset
259 loop_body, NULL,
kono
parents:
diff changeset
260 i,
kono
parents:
diff changeset
261 GCC_JIT_BINARY_OP_PLUS,
kono
parents:
diff changeset
262 gcc_jit_context_one (ctxt, int_type));
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 .. function:: void\
kono
parents:
diff changeset
265 gcc_jit_block_add_comment (gcc_jit_block *block,\
kono
parents:
diff changeset
266 gcc_jit_location *loc,\
kono
parents:
diff changeset
267 const char *text)
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 Add a no-op textual comment to the internal representation of the
kono
parents:
diff changeset
270 code. It will be optimized away, but will be visible in the dumps
kono
parents:
diff changeset
271 seen via :macro:`GCC_JIT_BOOL_OPTION_DUMP_INITIAL_TREE`
kono
parents:
diff changeset
272 and :macro:`GCC_JIT_BOOL_OPTION_DUMP_INITIAL_GIMPLE`,
kono
parents:
diff changeset
273 and thus may be of use when debugging how your project's internal
kono
parents:
diff changeset
274 representation gets converted to the libgccjit IR.
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 The parameter ``text`` must be non-NULL. It is copied, so the input
kono
parents:
diff changeset
277 buffer does not need to outlive the call. For example:
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 .. code-block:: c
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 char buf[100];
kono
parents:
diff changeset
282 snprintf (buf, sizeof (buf),
kono
parents:
diff changeset
283 "op%i: %s",
kono
parents:
diff changeset
284 pc, opcode_names[op->op_opcode]);
kono
parents:
diff changeset
285 gcc_jit_block_add_comment (block, loc, buf);
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 .. function:: void\
kono
parents:
diff changeset
288 gcc_jit_block_end_with_conditional (gcc_jit_block *block,\
kono
parents:
diff changeset
289 gcc_jit_location *loc,\
kono
parents:
diff changeset
290 gcc_jit_rvalue *boolval,\
kono
parents:
diff changeset
291 gcc_jit_block *on_true,\
kono
parents:
diff changeset
292 gcc_jit_block *on_false)
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294 Terminate a block by adding evaluation of an rvalue, branching on the
kono
parents:
diff changeset
295 result to the appropriate successor block.
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 This is roughly equivalent to this C code:
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 .. code-block:: c
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 if (boolval)
kono
parents:
diff changeset
302 goto on_true;
kono
parents:
diff changeset
303 else
kono
parents:
diff changeset
304 goto on_false;
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 block, boolval, on_true, and on_false must be non-NULL.
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 .. function:: void\
kono
parents:
diff changeset
309 gcc_jit_block_end_with_jump (gcc_jit_block *block,\
kono
parents:
diff changeset
310 gcc_jit_location *loc,\
kono
parents:
diff changeset
311 gcc_jit_block *target)
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 Terminate a block by adding a jump to the given target block.
kono
parents:
diff changeset
315
kono
parents:
diff changeset
316 This is roughly equivalent to this C code:
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 .. code-block:: c
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 goto target;
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 .. function:: void\
kono
parents:
diff changeset
323 gcc_jit_block_end_with_return (gcc_jit_block *block,\
kono
parents:
diff changeset
324 gcc_jit_location *loc,\
kono
parents:
diff changeset
325 gcc_jit_rvalue *rvalue)
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 Terminate a block by adding evaluation of an rvalue, returning the value.
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 This is roughly equivalent to this C code:
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 .. code-block:: c
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 return expression;
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 .. function:: void\
kono
parents:
diff changeset
337 gcc_jit_block_end_with_void_return (gcc_jit_block *block,\
kono
parents:
diff changeset
338 gcc_jit_location *loc)
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 Terminate a block by adding a valueless return, for use within a function
kono
parents:
diff changeset
342 with "void" return type.
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 This is equivalent to this C code:
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 .. code-block:: c
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 return;
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 .. function:: void\
kono
parents:
diff changeset
351 gcc_jit_block_end_with_switch (gcc_jit_block *block,\
kono
parents:
diff changeset
352 gcc_jit_location *loc,\
kono
parents:
diff changeset
353 gcc_jit_rvalue *expr,\
kono
parents:
diff changeset
354 gcc_jit_block *default_block,\
kono
parents:
diff changeset
355 int num_cases,\
kono
parents:
diff changeset
356 gcc_jit_case **cases)
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 Terminate a block by adding evalation of an rvalue, then performing
kono
parents:
diff changeset
359 a multiway branch.
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 This is roughly equivalent to this C code:
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 .. code-block:: c
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 switch (expr)
kono
parents:
diff changeset
366 {
kono
parents:
diff changeset
367 default:
kono
parents:
diff changeset
368 goto default_block;
kono
parents:
diff changeset
369
kono
parents:
diff changeset
370 case C0.min_value ... C0.max_value:
kono
parents:
diff changeset
371 goto C0.dest_block;
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 case C1.min_value ... C1.max_value:
kono
parents:
diff changeset
374 goto C1.dest_block;
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 ...etc...
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 case C[N - 1].min_value ... C[N - 1].max_value:
kono
parents:
diff changeset
379 goto C[N - 1].dest_block;
kono
parents:
diff changeset
380 }
kono
parents:
diff changeset
381
kono
parents:
diff changeset
382 ``block``, ``expr``, ``default_block`` and ``cases`` must all be
kono
parents:
diff changeset
383 non-NULL.
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 ``expr`` must be of the same integer type as all of the ``min_value``
kono
parents:
diff changeset
386 and ``max_value`` within the cases.
kono
parents:
diff changeset
387
kono
parents:
diff changeset
388 ``num_cases`` must be >= 0.
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 The ranges of the cases must not overlap (or have duplicate
kono
parents:
diff changeset
391 values).
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 The API entrypoints relating to switch statements and cases:
kono
parents:
diff changeset
394
kono
parents:
diff changeset
395 * :c:func:`gcc_jit_block_end_with_switch`
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397 * :c:func:`gcc_jit_case_as_object`
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 * :c:func:`gcc_jit_context_new_case`
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 were added in :ref:`LIBGCCJIT_ABI_3`; you can test for their presence
kono
parents:
diff changeset
402 using
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 .. code-block:: c
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 #ifdef LIBGCCJIT_HAVE_SWITCH_STATEMENTS
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 .. type:: gcc_jit_case
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 A `gcc_jit_case` represents a case within a switch statement, and
kono
parents:
diff changeset
411 is created within a particular :c:type:`gcc_jit_context` using
kono
parents:
diff changeset
412 :c:func:`gcc_jit_context_new_case`.
kono
parents:
diff changeset
413
kono
parents:
diff changeset
414 Each case expresses a multivalued range of integer values. You
kono
parents:
diff changeset
415 can express single-valued cases by passing in the same value for
kono
parents:
diff changeset
416 both `min_value` and `max_value`.
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 .. function:: gcc_jit_case *\
kono
parents:
diff changeset
419 gcc_jit_context_new_case (gcc_jit_context *ctxt,\
kono
parents:
diff changeset
420 gcc_jit_rvalue *min_value,\
kono
parents:
diff changeset
421 gcc_jit_rvalue *max_value,\
kono
parents:
diff changeset
422 gcc_jit_block *dest_block)
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 Create a new gcc_jit_case instance for use in a switch statement.
kono
parents:
diff changeset
425 `min_value` and `max_value` must be constants of an integer type,
kono
parents:
diff changeset
426 which must match that of the expression of the switch statement.
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 `dest_block` must be within the same function as the switch
kono
parents:
diff changeset
429 statement.
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 .. function:: gcc_jit_object *\
kono
parents:
diff changeset
432 gcc_jit_case_as_object (gcc_jit_case *case_)
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 Upcast from a case to an object.
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 Here's an example of creating a switch statement:
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 .. literalinclude:: ../../../testsuite/jit.dg/test-switch.c
kono
parents:
diff changeset
439 :start-after: /* Quote from here in docs/topics/functions.rst. */
kono
parents:
diff changeset
440 :end-before: /* Quote up to here in docs/topics/functions.rst. */
kono
parents:
diff changeset
441 :language: c