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