OLD | NEW |
1 ============================== | 1 ============================== |
2 PNaCl Bitcode Reference Manual | 2 PNaCl Bitcode Reference Manual |
3 ============================== | 3 ============================== |
4 | 4 |
5 .. contents:: | 5 .. contents:: |
6 :local: | 6 :local: |
7 :depth: 3 | 7 :depth: 3 |
8 | 8 |
9 Introduction | 9 Introduction |
10 ============ | 10 ============ |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 | 136 |
137 `LLVM LangRef: Module-Level Inline Assembly <LangRef.html#moduleasm>`_ | 137 `LLVM LangRef: Module-Level Inline Assembly <LangRef.html#moduleasm>`_ |
138 | 138 |
139 PNaCl bitcode does not support inline assembly. | 139 PNaCl bitcode does not support inline assembly. |
140 | 140 |
141 Volatile Memory Accesses | 141 Volatile Memory Accesses |
142 ------------------------ | 142 ------------------------ |
143 | 143 |
144 `LLVM LangRef: Volatile Memory Accesses <LangRef.html#volatile>`_ | 144 `LLVM LangRef: Volatile Memory Accesses <LangRef.html#volatile>`_ |
145 | 145 |
146 PNaCl bitcode does not support volatile memory accesses. The ``volatile`` | 146 PNaCl bitcode does not support volatile memory accesses. The |
147 attribute on loads and stores is not supported. See the | 147 ``volatile`` attribute on loads and stores is not supported. See the |
148 `PNaCl Developer's Guide <PNaClDeveloperGuide.html>`_ for more details. | 148 `PNaCl Developer's Guide <PNaClDeveloperGuide.html>`_ for more details. |
149 | 149 |
150 Memory Model for Concurrent Operations | 150 Memory Model for Concurrent Operations |
151 -------------------------------------- | 151 -------------------------------------- |
152 | 152 |
153 `LLVM LangRef: Memory Model for Concurrent Operations <LangRef.html#memmodel>`_ | 153 `LLVM LangRef: Memory Model for Concurrent Operations |
| 154 <LangRef.html#memmodel>`_ |
154 | 155 |
155 See the `PNaCl Developer's Guide <PNaClDeveloperGuide.html>`_ for more details. | 156 See the `PNaCl Developer's Guide <PNaClDeveloperGuide.html>`_ for more |
| 157 details. |
156 | 158 |
157 Atomic Memory Ordering Constraints | 159 Atomic Memory Ordering Constraints |
158 ---------------------------------- | 160 ---------------------------------- |
159 | 161 |
160 `LLVM LangRef: Atomic Memory Ordering Constraints <LangRef.html#ordering>`_ | 162 `LLVM LangRef: Atomic Memory Ordering Constraints <LangRef.html#ordering>`_ |
161 | 163 |
162 PNaCl bitcode currently supports sequential consistency only, through its | 164 PNaCl bitcode currently supports sequential consistency only, through |
163 `atomic intrinsics`_. See the | 165 its `atomic intrinsics`_. See the `PNaCl Developer's Guide |
164 `PNaCl Developer's Guide <PNaClDeveloperGuide.html>`_ for more details. | 166 <PNaClDeveloperGuide.html>`_ for more details. |
| 167 |
| 168 The integer values for memory ordering constraints are in |
| 169 ``"llvm/IR/NaClAtomicIntrinsics.h"``. |
165 | 170 |
166 Fast-Math Flags | 171 Fast-Math Flags |
167 --------------- | 172 --------------- |
168 | 173 |
169 `LLVM LangRef: Fast-Math Flags <LangRef.html#fastmath>`_ | 174 `LLVM LangRef: Fast-Math Flags <LangRef.html#fastmath>`_ |
170 | 175 |
171 Fast-math mode is not currently supported by the PNaCl bitcode. | 176 Fast-math mode is not currently supported by the PNaCl bitcode. |
172 | 177 |
173 Type System | 178 Type System |
174 =========== | 179 =========== |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 | 408 |
404 See :ref:`Setjmp and Longjmp <setjmplongjmp>`. | 409 See :ref:`Setjmp and Longjmp <setjmplongjmp>`. |
405 | 410 |
406 .. _atomic intrinsics: | 411 .. _atomic intrinsics: |
407 | 412 |
408 * ``llvm.nacl.atomic.store`` | 413 * ``llvm.nacl.atomic.store`` |
409 * ``llvm.nacl.atomic.load`` | 414 * ``llvm.nacl.atomic.load`` |
410 * ``llvm.nacl.atomic.rmw`` | 415 * ``llvm.nacl.atomic.rmw`` |
411 * ``llvm.nacl.atomic.cmpxchg`` | 416 * ``llvm.nacl.atomic.cmpxchg`` |
412 * ``llvm.nacl.atomic.fence`` | 417 * ``llvm.nacl.atomic.fence`` |
| 418 * ``llvm.nacl.atomic.fence.all`` |
| 419 * ``llvm.nacl.atomic.is.lock.free`` |
413 | 420 |
414 See :ref:`atomic intrinsics <atomicintrinsics>`. | 421 See :ref:`atomic intrinsics <atomicintrinsics>`. |
415 | 422 |
416 .. _threadpointerintrinsics: | 423 .. _threadpointerintrinsics: |
417 | 424 |
418 Thread pointer related intrinsics | 425 Thread pointer related intrinsics |
419 --------------------------------- | 426 --------------------------------- |
420 | 427 |
421 .. code-block:: llvm | 428 .. code-block:: llvm |
422 | 429 |
423 declare i8* @llvm.nacl.read.tp() | 430 declare i8* @llvm.nacl.read.tp() |
424 | 431 |
425 Returns the thread pointer, which can be set by the embedding sandbox's runtime. | 432 Returns the thread pointer, which can be set by the embedding sandbox's runtime. |
426 | 433 |
427 .. _setjmplongjmp: | 434 .. _setjmplongjmp: |
428 | 435 |
429 Setjmp and Longjmp | 436 Setjmp and Longjmp |
430 ------------------ | 437 ------------------ |
431 | 438 |
432 .. code-block:: llvm | 439 .. code-block:: llvm |
433 | 440 |
434 declare void @llvm.nacl.longjmp(i8* %jmpbuf, i32) | 441 declare void @llvm.nacl.longjmp(i8* %jmpbuf, i32) |
435 declare i32 @llvm.nacl.setjmp(i8* %jmpbuf) | 442 declare i32 @llvm.nacl.setjmp(i8* %jmpbuf) |
436 | 443 |
437 These intrinsics implement the semantics of C11 ``setjmp`` and ``longjmp``. The | 444 These intrinsics implement the semantics of C11 ``setjmp`` and |
438 ``jmpbuf`` pointer must be 64-bit aligned and point to at least 1024 bytes of | 445 ``longjmp``. The ``jmpbuf`` pointer must be 64-bit aligned and point to |
439 allocated memory. | 446 at least 1024 bytes of allocated memory. |
440 | 447 |
441 .. _atomicintrinsics: | 448 .. _atomicintrinsics: |
442 | 449 |
443 Atomic intrinsics | 450 Atomic intrinsics |
444 ----------------- | 451 ----------------- |
445 | 452 |
446 .. code-block:: llvm | 453 .. code-block:: llvm |
447 | 454 |
448 declare iN @llvm.nacl.atomic.load.<size>( | 455 declare iN @llvm.nacl.atomic.load.<size>( |
449 iN* <source>, i32 <memory_order>) | 456 iN* <source>, i32 <memory_order>) |
450 declare void @llvm.nacl.atomic.store.<size>( | 457 declare void @llvm.nacl.atomic.store.<size>( |
451 iN <operand>, iN* <destination>, i32 <memory_order>) | 458 iN <operand>, iN* <destination>, i32 <memory_order>) |
452 declare iN @llvm.nacl.atomic.rmw.<size>( | 459 declare iN @llvm.nacl.atomic.rmw.<size>( |
453 i32 <computation>, iN* <object>, iN <operand>, i32 <memory_order>) | 460 i32 <computation>, iN* <object>, iN <operand>, i32 <memory_order>) |
454 declare iN @llvm.nacl.atomic.cmpxchg.<size>( | 461 declare iN @llvm.nacl.atomic.cmpxchg.<size>( |
455 iN* <object>, iN <expected>, iN <desired>, | 462 iN* <object>, iN <expected>, iN <desired>, |
456 i32 <memory_order_success>, i32 <memory_order_failure>) | 463 i32 <memory_order_success>, i32 <memory_order_failure>) |
457 declare void @llvm.nacl.atomic.fence(i32 <memory_order>) | 464 declare void @llvm.nacl.atomic.fence(i32 <memory_order>) |
| 465 declare void @llvm.nacl.atomic.fence.all() |
458 | 466 |
459 Each of these intrinsics is overloaded on the ``iN`` argument, which | 467 Each of these intrinsics is overloaded on the ``iN`` argument, which is |
460 is reflected through ``<size>`` in the overload's name. Integral types | 468 reflected through ``<size>`` in the overload's name. Integral types of |
461 of 8, 16, 32 and 64-bit width are supported for these arguments. | 469 8, 16, 32 and 64-bit width are supported for these arguments. |
462 | 470 |
463 The ``@llvm.nacl.atomic.rmw`` intrinsic implements the following | 471 The ``@llvm.nacl.atomic.rmw`` intrinsic implements the following |
464 read-modify-write operations, from the general and arithmetic sections | 472 read-modify-write operations, from the general and arithmetic sections |
465 of the C11/C++11 standards: | 473 of the C11/C++11 standards: |
466 | 474 |
467 - ``add`` | 475 - ``add`` |
468 - ``sub`` | 476 - ``sub`` |
469 - ``or`` | 477 - ``or`` |
470 - ``and`` | 478 - ``and`` |
471 - ``xor`` | 479 - ``xor`` |
472 - ``exchange`` | 480 - ``exchange`` |
473 | 481 |
474 For all of these read-modify-write operations, the returned value is | 482 For all of these read-modify-write operations, the returned value is |
475 that at ``object`` before the computation. The ``computation`` | 483 that at ``object`` before the computation. The ``computation`` argument |
476 argument must be a compile-time constant. | 484 must be a compile-time constant. |
477 | 485 |
478 All atomic intrinsics also support C11/C++11 memory orderings, which | 486 All atomic intrinsics also support C11/C++11 memory orderings, which |
479 must be compile-time constants. Those are detailed in `Atomic Memory | 487 must be compile-time constants. Those are detailed in `Atomic Memory |
480 Ordering Constraints`_. | 488 Ordering Constraints`_. |
481 | 489 |
482 Integer values for these computations and memory orderings are defined | 490 Integer values for these computations and memory orderings are defined |
483 in ``"llvm/IR/NaClAtomicIntrinsics.h"``. | 491 in ``"llvm/IR/NaClAtomicIntrinsics.h"``. |
484 | 492 |
| 493 The ``@llvm.nacl.atomic.fence.all`` intrinsic is equivalent to the |
| 494 ``@llvm.nacl.atomic.fence`` intrinsic with sequentially consistent |
| 495 ordering and compiler barriers preventing most non-atomic memory |
| 496 accesses from reordering around it. |
| 497 |
485 .. note:: | 498 .. note:: |
486 | 499 |
487 These intrinsics allow PNaCl to support C11/C++11 style atomic | 500 These intrinsics allow PNaCl to support C11/C++11 style atomic |
488 operations as well as some legacy GCC-style ``__sync_*`` builtins | 501 operations as well as some legacy GCC-style ``__sync_*`` builtins |
489 while remaining stable as the LLVM codebase changes. The user | 502 while remaining stable as the LLVM codebase changes. The user isn't |
490 isn't expected to use these intrinsics directly. | 503 expected to use these intrinsics directly. |
491 | 504 |
492 .. code-block:: llvm | 505 .. code-block:: llvm |
493 | 506 |
494 declare i1 @llvm.nacl.atomic.is.lock.free(i32 <byte_size>, i8* <address>) | 507 declare i1 @llvm.nacl.atomic.is.lock.free(i32 <byte_size>, i8* <address>) |
495 | 508 |
496 The ``llvm.nacl.atomic.is.lock.free`` intrinsic is designed to | 509 The ``llvm.nacl.atomic.is.lock.free`` intrinsic is designed to |
497 determine at translation time whether atomic operations of a certain | 510 determine at translation time whether atomic operations of a certain |
498 ``byte_size`` (a compile-time constant), at a particular ``address``, | 511 ``byte_size`` (a compile-time constant), at a particular ``address``, |
499 are lock-free or not. This reflects the C11 ``atomic_is_lock_free`` | 512 are lock-free or not. This reflects the C11 ``atomic_is_lock_free`` |
500 function from header ``<stdatomic.h>`` and the C++11 ``is_lock_free`` | 513 function from header ``<stdatomic.h>`` and the C++11 ``is_lock_free`` |
501 member function in header ``<atomic>``. It can be used through the | 514 member function in header ``<atomic>``. It can be used through the |
502 ``__nacl_atomic_is_lock_free`` builtin. | 515 ``__nacl_atomic_is_lock_free`` builtin. |
OLD | NEW |