annotate gcc/jit/docs/cp/topics/functions.rst @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1 .. Copyright (C) 2014-2018 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:: cpp
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 .. class:: gccjit::param
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 A `gccjit::param` represents a parameter to a function.
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 .. function:: gccjit::param \
kono
parents:
diff changeset
30 gccjit::context::new_param (gccjit::type type,\
kono
parents:
diff changeset
31 const char *name, \
kono
parents:
diff changeset
32 gccjit::location loc)
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 In preparation for creating a function, create a new parameter of the
kono
parents:
diff changeset
35 given type and name.
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 :class:`gccjit::param` is a subclass of :class:`gccjit::lvalue` (and thus
kono
parents:
diff changeset
38 of :class:`gccjit::rvalue` and :class:`gccjit::object`). It is a thin
kono
parents:
diff changeset
39 wrapper around the C API's :c:type:`gcc_jit_param *`.
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 Functions
kono
parents:
diff changeset
42 ---------
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 .. class:: gccjit::function
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 A `gccjit::function` represents a function - either one that we're
kono
parents:
diff changeset
47 creating ourselves, or one that we're referencing.
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 .. function:: gccjit::function \
kono
parents:
diff changeset
50 gccjit::context::new_function (enum gcc_jit_function_kind,\
kono
parents:
diff changeset
51 gccjit::type return_type, \
kono
parents:
diff changeset
52 const char *name, \
kono
parents:
diff changeset
53 std::vector<param> &params, \
kono
parents:
diff changeset
54 int is_variadic, \
kono
parents:
diff changeset
55 gccjit::location loc)
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 Create a gcc_jit_function with the given name and parameters.
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 Parameters "is_variadic" and "loc" are optional.
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 This is a wrapper around the C API's :c:func:`gcc_jit_context_new_function`.
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 .. function:: gccjit::function \
kono
parents:
diff changeset
64 gccjit::context::get_builtin_function (const char *name)
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 This is a wrapper around the C API's
kono
parents:
diff changeset
67 :c:func:`gcc_jit_context_get_builtin_function`.
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 .. function:: gccjit::param \
kono
parents:
diff changeset
70 gccjit::function::get_param (int index) const
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 Get the param of the given index (0-based).
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 .. function:: void \
kono
parents:
diff changeset
75 gccjit::function::dump_to_dot (const char *path)
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 Emit the function in graphviz format to the given path.
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 .. function:: gccjit::lvalue \
kono
parents:
diff changeset
80 gccjit::function::new_local (gccjit::type type,\
kono
parents:
diff changeset
81 const char *name, \
kono
parents:
diff changeset
82 gccjit::location loc)
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 Create a new local variable within the function, of the given type and
kono
parents:
diff changeset
85 name.
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 Blocks
kono
parents:
diff changeset
88 ------
kono
parents:
diff changeset
89 .. class:: gccjit::block
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 A `gccjit::block` represents a basic block within a function i.e. a
kono
parents:
diff changeset
92 sequence of statements with a single entry point and a single exit
kono
parents:
diff changeset
93 point.
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 :class:`gccjit::block` is a subclass of :class:`gccjit::object`.
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 The first basic block that you create within a function will
kono
parents:
diff changeset
98 be the entrypoint.
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 Each basic block that you create within a function must be
kono
parents:
diff changeset
101 terminated, either with a conditional, a jump, a return, or
kono
parents:
diff changeset
102 a switch.
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 It's legal to have multiple basic blocks that return within
kono
parents:
diff changeset
105 one function.
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 .. function:: gccjit::block \
kono
parents:
diff changeset
108 gccjit::function::new_block (const char *name)
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 Create a basic block of the given name. The name may be NULL, but
kono
parents:
diff changeset
111 providing meaningful names is often helpful when debugging: it may
kono
parents:
diff changeset
112 show up in dumps of the internal representation, and in error
kono
parents:
diff changeset
113 messages.
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 Statements
kono
parents:
diff changeset
116 ----------
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 .. function:: void\
kono
parents:
diff changeset
119 gccjit::block::add_eval (gccjit::rvalue rvalue, \
kono
parents:
diff changeset
120 gccjit::location loc)
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 Add evaluation of an rvalue, discarding the result
kono
parents:
diff changeset
123 (e.g. a function call that "returns" void).
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 This is equivalent to this C code:
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 .. code-block:: c
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 (void)expression;
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 .. function:: void\
kono
parents:
diff changeset
132 gccjit::block::add_assignment (gccjit::lvalue lvalue, \
kono
parents:
diff changeset
133 gccjit::rvalue rvalue, \
kono
parents:
diff changeset
134 gccjit::location loc)
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 Add evaluation of an rvalue, assigning the result to the given
kono
parents:
diff changeset
137 lvalue.
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 This is roughly equivalent to this C code:
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 .. code-block:: c
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 lvalue = rvalue;
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 .. function:: void\
kono
parents:
diff changeset
146 gccjit::block::add_assignment_op (gccjit::lvalue lvalue, \
kono
parents:
diff changeset
147 enum gcc_jit_binary_op, \
kono
parents:
diff changeset
148 gccjit::rvalue rvalue, \
kono
parents:
diff changeset
149 gccjit::location loc)
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 Add evaluation of an rvalue, using the result to modify an
kono
parents:
diff changeset
152 lvalue.
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 This is analogous to "+=" and friends:
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 .. code-block:: c
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 lvalue += rvalue;
kono
parents:
diff changeset
159 lvalue *= rvalue;
kono
parents:
diff changeset
160 lvalue /= rvalue;
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 etc. For example:
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 .. code-block:: c
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 /* "i++" */
kono
parents:
diff changeset
167 loop_body.add_assignment_op (
kono
parents:
diff changeset
168 i,
kono
parents:
diff changeset
169 GCC_JIT_BINARY_OP_PLUS,
kono
parents:
diff changeset
170 ctxt.one (int_type));
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 .. function:: void\
kono
parents:
diff changeset
173 gccjit::block::add_comment (const char *text, \
kono
parents:
diff changeset
174 gccjit::location loc)
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 Add a no-op textual comment to the internal representation of the
kono
parents:
diff changeset
177 code. It will be optimized away, but will be visible in the dumps
kono
parents:
diff changeset
178 seen via :c:macro:`GCC_JIT_BOOL_OPTION_DUMP_INITIAL_TREE`
kono
parents:
diff changeset
179 and :c:macro:`GCC_JIT_BOOL_OPTION_DUMP_INITIAL_GIMPLE`,
kono
parents:
diff changeset
180 and thus may be of use when debugging how your project's internal
kono
parents:
diff changeset
181 representation gets converted to the libgccjit IR.
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 Parameter "loc" is optional.
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 .. function:: void\
kono
parents:
diff changeset
186 gccjit::block::end_with_conditional (gccjit::rvalue boolval,\
kono
parents:
diff changeset
187 gccjit::block on_true,\
kono
parents:
diff changeset
188 gccjit::block on_false, \
kono
parents:
diff changeset
189 gccjit::location loc)
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 Terminate a block by adding evaluation of an rvalue, branching on the
kono
parents:
diff changeset
192 result to the appropriate successor block.
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 This is roughly equivalent to this C code:
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 .. code-block:: c
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 if (boolval)
kono
parents:
diff changeset
199 goto on_true;
kono
parents:
diff changeset
200 else
kono
parents:
diff changeset
201 goto on_false;
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 block, boolval, on_true, and on_false must be non-NULL.
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 .. function:: void\
kono
parents:
diff changeset
206 gccjit::block::end_with_jump (gccjit::block target, \
kono
parents:
diff changeset
207 gccjit::location loc)
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 Terminate a block by adding a jump to the given target block.
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 This is roughly equivalent to this C code:
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 .. code-block:: c
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 goto target;
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 .. function:: void\
kono
parents:
diff changeset
218 gccjit::block::end_with_return (gccjit::rvalue rvalue, \
kono
parents:
diff changeset
219 gccjit::location loc)
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 Terminate a block.
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 Both params are optional.
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 An rvalue must be provided for a function returning non-void, and
kono
parents:
diff changeset
226 must not be provided by a function "returning" `void`.
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 If an rvalue is provided, the block is terminated by evaluating the
kono
parents:
diff changeset
229 rvalue and returning the value.
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 This is roughly equivalent to this C code:
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 .. code-block:: c
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 return expression;
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 If an rvalue is not provided, the block is terminated by adding a
kono
parents:
diff changeset
238 valueless return, for use within a function with "void" return type.
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 This is equivalent to this C code:
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 .. code-block:: c
kono
parents:
diff changeset
243
kono
parents:
diff changeset
244 return;
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 .. function:: void\
kono
parents:
diff changeset
247 gccjit::block::end_with_switch (gccjit::rvalue expr,\
kono
parents:
diff changeset
248 gccjit::block default_block,\
kono
parents:
diff changeset
249 std::vector <gccjit::case_> cases,\
kono
parents:
diff changeset
250 gccjit::location loc)
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 Terminate a block by adding evalation of an rvalue, then performing
kono
parents:
diff changeset
253 a multiway branch.
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 This is roughly equivalent to this C code:
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 .. code-block:: c
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 switch (expr)
kono
parents:
diff changeset
260 {
kono
parents:
diff changeset
261 default:
kono
parents:
diff changeset
262 goto default_block;
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 case C0.min_value ... C0.max_value:
kono
parents:
diff changeset
265 goto C0.dest_block;
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 case C1.min_value ... C1.max_value:
kono
parents:
diff changeset
268 goto C1.dest_block;
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 ...etc...
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 case C[N - 1].min_value ... C[N - 1].max_value:
kono
parents:
diff changeset
273 goto C[N - 1].dest_block;
kono
parents:
diff changeset
274 }
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 ``expr`` must be of the same integer type as all of the ``min_value``
kono
parents:
diff changeset
277 and ``max_value`` within the cases.
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 The ranges of the cases must not overlap (or have duplicate
kono
parents:
diff changeset
280 values).
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 The API entrypoints relating to switch statements and cases:
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 * :func:`gccjit::block::end_with_switch`
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 * :func:`gccjit::context::new_case`
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 were added in :ref:`LIBGCCJIT_ABI_3`; you can test for their presence
kono
parents:
diff changeset
289 using
kono
parents:
diff changeset
290
kono
parents:
diff changeset
291 .. code-block:: c
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 #ifdef LIBGCCJIT_HAVE_SWITCH_STATEMENTS
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 .. class:: gccjit::case_
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 A `gccjit::case_` represents a case within a switch statement, and
kono
parents:
diff changeset
298 is created within a particular :class:`gccjit::context` using
kono
parents:
diff changeset
299 :func:`gccjit::context::new_case`. It is a subclass of
kono
parents:
diff changeset
300 :class:`gccjit::object`.
kono
parents:
diff changeset
301
kono
parents:
diff changeset
302 Each case expresses a multivalued range of integer values. You
kono
parents:
diff changeset
303 can express single-valued cases by passing in the same value for
kono
parents:
diff changeset
304 both `min_value` and `max_value`.
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 .. function:: gccjit::case_ *\
kono
parents:
diff changeset
307 gccjit::context::new_case (gccjit::rvalue min_value,\
kono
parents:
diff changeset
308 gccjit::rvalue max_value,\
kono
parents:
diff changeset
309 gccjit::block dest_block)
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 Create a new gccjit::case for use in a switch statement.
kono
parents:
diff changeset
312 `min_value` and `max_value` must be constants of an integer type,
kono
parents:
diff changeset
313 which must match that of the expression of the switch statement.
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 `dest_block` must be within the same function as the switch
kono
parents:
diff changeset
316 statement.
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 Here's an example of creating a switch statement:
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 .. literalinclude:: ../../../../testsuite/jit.dg/test-switch.cc
kono
parents:
diff changeset
321 :start-after: /* Quote from here in docs/cp/topics/functions.rst. */
kono
parents:
diff changeset
322 :end-before: /* Quote up to here in docs/cp/topics/functions.rst. */
kono
parents:
diff changeset
323 :language: c++