expressions.rst revision 1.4
1.. Copyright (C) 2014-2018 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 20Expressions 21=========== 22 23Rvalues 24------- 25.. type:: gcc_jit_rvalue 26 27A :c:type:`gcc_jit_rvalue *` is an expression that can be computed. 28 29It 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 35or 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 42Every rvalue has an associated type, and the API will check to ensure 43that 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 54Simple 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 129Vector 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 153Unary 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 167The available unary operations are: 168 169========================================== ============ 170Unary 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 219Binary 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 232The available binary operations are: 233 234======================================== ============ 235Binary 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 377Comparisons 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======================================= ============ 391Comparison 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 402Function 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 477Function pointers 478***************** 479 480Function 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 490Type-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 507Lvalues 508------- 509 510.. type:: gcc_jit_lvalue 511 512An lvalue is something that can of the *left*-hand side of an assignment: 513a storage area (such as a variable). It is also usable as an rvalue, 514where 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 538Global 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 579Working 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 595Field 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``). 655