comparison gcc/jit/docs/topics/expressions.rst @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
comparison
equal deleted inserted replaced
68:561a7518be6b 111:04ced10e8804
1 .. Copyright (C) 2014-2017 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
20 Expressions
21 ===========
22
23 Rvalues
24 -------
25 .. type:: gcc_jit_rvalue
26
27 A :c:type:`gcc_jit_rvalue *` is an expression that can be computed.
28
29 It can be simple, e.g.:
30
31 * an integer value e.g. `0` or `42`
32 * a string literal e.g. `"Hello world"`
33 * a variable e.g. `i`. These are also lvalues (see below).
34
35 or compound e.g.:
36
37 * a unary expression e.g. `!cond`
38 * a binary expression e.g. `(a + b)`
39 * a function call e.g. `get_distance (&player_ship, &target)`
40 * etc.
41
42 Every rvalue has an associated type, and the API will check to ensure
43 that types match up correctly (otherwise the context will emit an error).
44
45 .. function:: gcc_jit_type *gcc_jit_rvalue_get_type (gcc_jit_rvalue *rvalue)
46
47 Get the type of this rvalue.
48
49 .. function:: gcc_jit_object *gcc_jit_rvalue_as_object (gcc_jit_rvalue *rvalue)
50
51 Upcast the given rvalue to be an object.
52
53
54 Simple expressions
55 ******************
56
57 .. function:: gcc_jit_rvalue *\
58 gcc_jit_context_new_rvalue_from_int (gcc_jit_context *ctxt, \
59 gcc_jit_type *numeric_type, \
60 int value)
61
62 Given a numeric type (integer or floating point), build an rvalue for
63 the given constant :c:type:`int` value.
64
65 .. function:: gcc_jit_rvalue *\
66 gcc_jit_context_new_rvalue_from_long (gcc_jit_context *ctxt, \
67 gcc_jit_type *numeric_type, \
68 long value)
69
70 Given a numeric type (integer or floating point), build an rvalue for
71 the given constant :c:type:`long` value.
72
73 .. function:: gcc_jit_rvalue *gcc_jit_context_zero (gcc_jit_context *ctxt, \
74 gcc_jit_type *numeric_type)
75
76 Given a numeric type (integer or floating point), get the rvalue for
77 zero. Essentially this is just a shortcut for:
78
79 .. code-block:: c
80
81 gcc_jit_context_new_rvalue_from_int (ctxt, numeric_type, 0)
82
83 .. function:: gcc_jit_rvalue *gcc_jit_context_one (gcc_jit_context *ctxt, \
84 gcc_jit_type *numeric_type)
85
86 Given a numeric type (integer or floating point), get the rvalue for
87 one. Essentially this is just a shortcut for:
88
89 .. code-block:: c
90
91 gcc_jit_context_new_rvalue_from_int (ctxt, numeric_type, 1)
92
93 .. function:: gcc_jit_rvalue *\
94 gcc_jit_context_new_rvalue_from_double (gcc_jit_context *ctxt, \
95 gcc_jit_type *numeric_type, \
96 double value)
97
98 Given a numeric type (integer or floating point), build an rvalue for
99 the given constant :c:type:`double` value.
100
101 .. function:: gcc_jit_rvalue *\
102 gcc_jit_context_new_rvalue_from_ptr (gcc_jit_context *ctxt, \
103 gcc_jit_type *pointer_type, \
104 void *value)
105
106 Given a pointer type, build an rvalue for the given address.
107
108 .. function:: gcc_jit_rvalue *gcc_jit_context_null (gcc_jit_context *ctxt, \
109 gcc_jit_type *pointer_type)
110
111 Given a pointer type, build an rvalue for ``NULL``. Essentially this
112 is just a shortcut for:
113
114 .. code-block:: c
115
116 gcc_jit_context_new_rvalue_from_ptr (ctxt, pointer_type, NULL)
117
118 .. function:: gcc_jit_rvalue *\
119 gcc_jit_context_new_string_literal (gcc_jit_context *ctxt, \
120 const char *value)
121
122 Generate an rvalue for the given NIL-terminated string, of type
123 :c:data:`GCC_JIT_TYPE_CONST_CHAR_PTR`.
124
125 The parameter ``value`` must be non-NULL. The call takes a copy of the
126 underlying string, so it is valid to pass in a pointer to an on-stack
127 buffer.
128
129 Vector expressions
130 ******************
131
132 .. function:: gcc_jit_rvalue * \
133 gcc_jit_context_new_rvalue_from_vector (gcc_jit_context *ctxt, \
134 gcc_jit_location *loc, \
135 gcc_jit_type *vec_type, \
136 size_t num_elements, \
137 gcc_jit_rvalue **elements)
138
139 Build a vector rvalue from an array of elements.
140
141 "vec_type" should be a vector type, created using
142 :func:`gcc_jit_type_get_vector`.
143
144 "num_elements" should match that of the vector type.
145
146 This entrypoint was added in :ref:`LIBGCCJIT_ABI_10`; you can test for
147 its presence using
148
149 .. code-block:: c
150
151 #ifdef LIBGCCJIT_HAVE_gcc_jit_context_new_rvalue_from_vector
152
153 Unary Operations
154 ****************
155
156 .. function:: gcc_jit_rvalue * \
157 gcc_jit_context_new_unary_op (gcc_jit_context *ctxt, \
158 gcc_jit_location *loc, \
159 enum gcc_jit_unary_op op, \
160 gcc_jit_type *result_type, \
161 gcc_jit_rvalue *rvalue)
162
163 Build a unary operation out of an input rvalue.
164
165 .. type:: enum gcc_jit_unary_op
166
167 The available unary operations are:
168
169 ========================================== ============
170 Unary Operation C equivalent
171 ========================================== ============
172 :c:macro:`GCC_JIT_UNARY_OP_MINUS` `-(EXPR)`
173 :c:macro:`GCC_JIT_UNARY_OP_BITWISE_NEGATE` `~(EXPR)`
174 :c:macro:`GCC_JIT_UNARY_OP_LOGICAL_NEGATE` `!(EXPR)`
175 :c:macro:`GCC_JIT_UNARY_OP_ABS` `abs (EXPR)`
176 ========================================== ============
177
178 .. c:macro:: GCC_JIT_UNARY_OP_MINUS
179
180 Negate an arithmetic value; analogous to:
181
182 .. code-block:: c
183
184 -(EXPR)
185
186 in C.
187
188 .. c:macro:: GCC_JIT_UNARY_OP_BITWISE_NEGATE
189
190 Bitwise negation of an integer value (one's complement); analogous
191 to:
192
193 .. code-block:: c
194
195 ~(EXPR)
196
197 in C.
198
199 .. c:macro:: GCC_JIT_UNARY_OP_LOGICAL_NEGATE
200
201 Logical negation of an arithmetic or pointer value; analogous to:
202
203 .. code-block:: c
204
205 !(EXPR)
206
207 in C.
208
209 .. c:macro:: GCC_JIT_UNARY_OP_ABS
210
211 Absolute value of an arithmetic expression; analogous to:
212
213 .. code-block:: c
214
215 abs (EXPR)
216
217 in C.
218
219 Binary Operations
220 *****************
221
222 .. function:: gcc_jit_rvalue *gcc_jit_context_new_binary_op (gcc_jit_context *ctxt, \
223 gcc_jit_location *loc, \
224 enum gcc_jit_binary_op op, \
225 gcc_jit_type *result_type, \
226 gcc_jit_rvalue *a, gcc_jit_rvalue *b)
227
228 Build a binary operation out of two constituent rvalues.
229
230 .. type:: enum gcc_jit_binary_op
231
232 The available binary operations are:
233
234 ======================================== ============
235 Binary Operation C equivalent
236 ======================================== ============
237 :c:macro:`GCC_JIT_BINARY_OP_PLUS` `x + y`
238 :c:macro:`GCC_JIT_BINARY_OP_MINUS` `x - y`
239 :c:macro:`GCC_JIT_BINARY_OP_MULT` `x * y`
240 :c:macro:`GCC_JIT_BINARY_OP_DIVIDE` `x / y`
241 :c:macro:`GCC_JIT_BINARY_OP_MODULO` `x % y`
242 :c:macro:`GCC_JIT_BINARY_OP_BITWISE_AND` `x & y`
243 :c:macro:`GCC_JIT_BINARY_OP_BITWISE_XOR` `x ^ y`
244 :c:macro:`GCC_JIT_BINARY_OP_BITWISE_OR` `x | y`
245 :c:macro:`GCC_JIT_BINARY_OP_LOGICAL_AND` `x && y`
246 :c:macro:`GCC_JIT_BINARY_OP_LOGICAL_OR` `x || y`
247 :c:macro:`GCC_JIT_BINARY_OP_LSHIFT` `x << y`
248 :c:macro:`GCC_JIT_BINARY_OP_RSHIFT` `x >> y`
249 ======================================== ============
250
251 .. c:macro:: GCC_JIT_BINARY_OP_PLUS
252
253 Addition of arithmetic values; analogous to:
254
255 .. code-block:: c
256
257 (EXPR_A) + (EXPR_B)
258
259 in C.
260
261 For pointer addition, use :c:func:`gcc_jit_context_new_array_access`.
262
263 .. c:macro:: GCC_JIT_BINARY_OP_MINUS
264
265 Subtraction of arithmetic values; analogous to:
266
267 .. code-block:: c
268
269 (EXPR_A) - (EXPR_B)
270
271 in C.
272
273 .. c:macro:: GCC_JIT_BINARY_OP_MULT
274
275 Multiplication of a pair of arithmetic values; analogous to:
276
277 .. code-block:: c
278
279 (EXPR_A) * (EXPR_B)
280
281 in C.
282
283 .. c:macro:: GCC_JIT_BINARY_OP_DIVIDE
284
285 Quotient of division of arithmetic values; analogous to:
286
287 .. code-block:: c
288
289 (EXPR_A) / (EXPR_B)
290
291 in C.
292
293 The result type affects the kind of division: if the result type is
294 integer-based, then the result is truncated towards zero, whereas
295 a floating-point result type indicates floating-point division.
296
297 .. c:macro:: GCC_JIT_BINARY_OP_MODULO
298
299 Remainder of division of arithmetic values; analogous to:
300
301 .. code-block:: c
302
303 (EXPR_A) % (EXPR_B)
304
305 in C.
306
307 .. c:macro:: GCC_JIT_BINARY_OP_BITWISE_AND
308
309 Bitwise AND; analogous to:
310
311 .. code-block:: c
312
313 (EXPR_A) & (EXPR_B)
314
315 in C.
316
317 .. c:macro:: GCC_JIT_BINARY_OP_BITWISE_XOR
318
319 Bitwise exclusive OR; analogous to:
320
321 .. code-block:: c
322
323 (EXPR_A) ^ (EXPR_B)
324
325 in C.
326
327 .. c:macro:: GCC_JIT_BINARY_OP_BITWISE_OR
328
329 Bitwise inclusive OR; analogous to:
330
331 .. code-block:: c
332
333 (EXPR_A) | (EXPR_B)
334
335 in C.
336
337 .. c:macro:: GCC_JIT_BINARY_OP_LOGICAL_AND
338
339 Logical AND; analogous to:
340
341 .. code-block:: c
342
343 (EXPR_A) && (EXPR_B)
344
345 in C.
346
347 .. c:macro:: GCC_JIT_BINARY_OP_LOGICAL_OR
348
349 Logical OR; analogous to:
350
351 .. code-block:: c
352
353 (EXPR_A) || (EXPR_B)
354
355 in C.
356
357 .. c:macro:: GCC_JIT_BINARY_OP_LSHIFT
358
359 Left shift; analogous to:
360
361 .. code-block:: c
362
363 (EXPR_A) << (EXPR_B)
364
365 in C.
366
367 .. c:macro:: GCC_JIT_BINARY_OP_RSHIFT
368
369 Right shift; analogous to:
370
371 .. code-block:: c
372
373 (EXPR_A) >> (EXPR_B)
374
375 in C.
376
377 Comparisons
378 ***********
379
380 .. function:: gcc_jit_rvalue *\
381 gcc_jit_context_new_comparison (gcc_jit_context *ctxt,\
382 gcc_jit_location *loc,\
383 enum gcc_jit_comparison op,\
384 gcc_jit_rvalue *a, gcc_jit_rvalue *b)
385
386 Build a boolean rvalue out of the comparison of two other rvalues.
387
388 .. type:: enum gcc_jit_comparison
389
390 ======================================= ============
391 Comparison C equivalent
392 ======================================= ============
393 :c:macro:`GCC_JIT_COMPARISON_EQ` `x == y`
394 :c:macro:`GCC_JIT_COMPARISON_NE` `x != y`
395 :c:macro:`GCC_JIT_COMPARISON_LT` `x < y`
396 :c:macro:`GCC_JIT_COMPARISON_LE` `x <= y`
397 :c:macro:`GCC_JIT_COMPARISON_GT` `x > y`
398 :c:macro:`GCC_JIT_COMPARISON_GE` `x >= y`
399 ======================================= ============
400
401
402 Function calls
403 **************
404 .. function:: gcc_jit_rvalue *\
405 gcc_jit_context_new_call (gcc_jit_context *ctxt,\
406 gcc_jit_location *loc,\
407 gcc_jit_function *func,\
408 int numargs , gcc_jit_rvalue **args)
409
410 Given a function and the given table of argument rvalues, construct a
411 call to the function, with the result as an rvalue.
412
413 .. note::
414
415 :c:func:`gcc_jit_context_new_call` merely builds a
416 :c:type:`gcc_jit_rvalue` i.e. an expression that can be evaluated,
417 perhaps as part of a more complicated expression.
418 The call *won't* happen unless you add a statement to a function
419 that evaluates the expression.
420
421 For example, if you want to call a function and discard the result
422 (or to call a function with ``void`` return type), use
423 :c:func:`gcc_jit_block_add_eval`:
424
425 .. code-block:: c
426
427 /* Add "(void)printf (arg0, arg1);". */
428 gcc_jit_block_add_eval (
429 block, NULL,
430 gcc_jit_context_new_call (
431 ctxt,
432 NULL,
433 printf_func,
434 2, args));
435
436 .. function:: gcc_jit_rvalue *\
437 gcc_jit_context_new_call_through_ptr (gcc_jit_context *ctxt,\
438 gcc_jit_location *loc,\
439 gcc_jit_rvalue *fn_ptr,\
440 int numargs, \
441 gcc_jit_rvalue **args)
442
443 Given an rvalue of function pointer type (e.g. from
444 :c:func:`gcc_jit_context_new_function_ptr_type`), and the given table of
445 argument rvalues, construct a call to the function pointer, with the
446 result as an rvalue.
447
448 .. note::
449
450 The same caveat as for :c:func:`gcc_jit_context_new_call` applies.
451
452 .. function:: void\
453 gcc_jit_rvalue_set_bool_require_tail_call (gcc_jit_rvalue *call,\
454 int require_tail_call)
455
456 Given an :c:type:`gcc_jit_rvalue *` for a call created through
457 :c:func:`gcc_jit_context_new_call` or
458 :c:func:`gcc_jit_context_new_call_through_ptr`, mark/clear the
459 call as needing tail-call optimization. The optimizer will
460 attempt to optimize the call into a jump instruction; if it is
461 unable to do do, an error will be emitted.
462
463 This may be useful when implementing functions that use the
464 continuation-passing style (e.g. for functional programming
465 languages), in which every function "returns" by calling a
466 "continuation" function pointer. This call must be
467 guaranteed to be implemented as a jump, otherwise the program
468 could consume an arbitrary amount of stack space as it executed.
469
470 This entrypoint was added in :ref:`LIBGCCJIT_ABI_6`; you can test for
471 its presence using
472
473 .. code-block:: c
474
475 #ifdef LIBGCCJIT_HAVE_gcc_jit_rvalue_set_bool_require_tail_call
476
477 Function pointers
478 *****************
479
480 Function pointers can be obtained:
481
482 * from a :c:type:`gcc_jit_function` using
483 :c:func:`gcc_jit_function_get_address`, or
484
485 * from an existing function using
486 :c:func:`gcc_jit_context_new_rvalue_from_ptr`,
487 using a function pointer type obtained using
488 :c:func:`gcc_jit_context_new_function_ptr_type`.
489
490 Type-coercion
491 *************
492
493 .. function:: gcc_jit_rvalue *\
494 gcc_jit_context_new_cast (gcc_jit_context *ctxt,\
495 gcc_jit_location *loc,\
496 gcc_jit_rvalue *rvalue,\
497 gcc_jit_type *type)
498
499 Given an rvalue of T, construct another rvalue of another type.
500
501 Currently only a limited set of conversions are possible:
502
503 * int <-> float
504 * int <-> bool
505 * P* <-> Q*, for pointer types P and Q
506
507 Lvalues
508 -------
509
510 .. type:: gcc_jit_lvalue
511
512 An lvalue is something that can of the *left*-hand side of an assignment:
513 a storage area (such as a variable). It is also usable as an rvalue,
514 where the rvalue is computed by reading from the storage area.
515
516 .. function:: gcc_jit_object *\
517 gcc_jit_lvalue_as_object (gcc_jit_lvalue *lvalue)
518
519 Upcast an lvalue to be an object.
520
521 .. function:: gcc_jit_rvalue *\
522 gcc_jit_lvalue_as_rvalue (gcc_jit_lvalue *lvalue)
523
524 Upcast an lvalue to be an rvalue.
525
526 .. function:: gcc_jit_rvalue *\
527 gcc_jit_lvalue_get_address (gcc_jit_lvalue *lvalue,\
528 gcc_jit_location *loc)
529
530 Take the address of an lvalue; analogous to:
531
532 .. code-block:: c
533
534 &(EXPR)
535
536 in C.
537
538 Global variables
539 ****************
540
541 .. function:: gcc_jit_lvalue *\
542 gcc_jit_context_new_global (gcc_jit_context *ctxt,\
543 gcc_jit_location *loc,\
544 enum gcc_jit_global_kind kind,\
545 gcc_jit_type *type,\
546 const char *name)
547
548 Add a new global variable of the given type and name to the context.
549
550 The parameter ``name`` must be non-NULL. The call takes a copy of the
551 underlying string, so it is valid to pass in a pointer to an on-stack
552 buffer.
553
554 The "kind" parameter determines the visibility of the "global" outside
555 of the :c:type:`gcc_jit_result`:
556
557 .. type:: enum gcc_jit_global_kind
558
559 .. c:macro:: GCC_JIT_GLOBAL_EXPORTED
560
561 Global is defined by the client code and is visible
562 by name outside of this JIT context via
563 :c:func:`gcc_jit_result_get_global` (and this value is required for
564 the global to be accessible via that entrypoint).
565
566 .. c:macro:: GCC_JIT_GLOBAL_INTERNAL
567
568 Global is defined by the client code, but is invisible
569 outside of it. Analogous to a "static" global within a .c file.
570 Specifically, the variable will only be visible within this
571 context and within child contexts.
572
573 .. c:macro:: GCC_JIT_GLOBAL_IMPORTED
574
575 Global is not defined by the client code; we're merely
576 referring to it. Analogous to using an "extern" global from a
577 header file.
578
579 Working with pointers, structs and unions
580 -----------------------------------------
581
582 .. function:: gcc_jit_lvalue *\
583 gcc_jit_rvalue_dereference (gcc_jit_rvalue *rvalue,\
584 gcc_jit_location *loc)
585
586 Given an rvalue of pointer type ``T *``, dereferencing the pointer,
587 getting an lvalue of type ``T``. Analogous to:
588
589 .. code-block:: c
590
591 *(EXPR)
592
593 in C.
594
595 Field access is provided separately for both lvalues and rvalues.
596
597 .. function:: gcc_jit_lvalue *\
598 gcc_jit_lvalue_access_field (gcc_jit_lvalue *struct_,\
599 gcc_jit_location *loc,\
600 gcc_jit_field *field)
601
602 Given an lvalue of struct or union type, access the given field,
603 getting an lvalue of the field's type. Analogous to:
604
605 .. code-block:: c
606
607 (EXPR).field = ...;
608
609 in C.
610
611 .. function:: gcc_jit_rvalue *\
612 gcc_jit_rvalue_access_field (gcc_jit_rvalue *struct_,\
613 gcc_jit_location *loc,\
614 gcc_jit_field *field)
615
616 Given an rvalue of struct or union type, access the given field
617 as an rvalue. Analogous to:
618
619 .. code-block:: c
620
621 (EXPR).field
622
623 in C.
624
625 .. function:: gcc_jit_lvalue *\
626 gcc_jit_rvalue_dereference_field (gcc_jit_rvalue *ptr,\
627 gcc_jit_location *loc,\
628 gcc_jit_field *field)
629
630 Given an rvalue of pointer type ``T *`` where T is of struct or union
631 type, access the given field as an lvalue. Analogous to:
632
633 .. code-block:: c
634
635 (EXPR)->field
636
637 in C, itself equivalent to ``(*EXPR).FIELD``.
638
639 .. function:: gcc_jit_lvalue *\
640 gcc_jit_context_new_array_access (gcc_jit_context *ctxt,\
641 gcc_jit_location *loc,\
642 gcc_jit_rvalue *ptr,\
643 gcc_jit_rvalue *index)
644
645 Given an rvalue of pointer type ``T *``, get at the element `T` at
646 the given index, using standard C array indexing rules i.e. each
647 increment of ``index`` corresponds to ``sizeof(T)`` bytes.
648 Analogous to:
649
650 .. code-block:: c
651
652 PTR[INDEX]
653
654 in C (or, indeed, to ``PTR + INDEX``).