Page MenuHomePhabricator

D63525.id206883.diff
No OneTemporary

File Metadata

Created
Fri, Oct 18, 3:50 AM

D63525.id206883.diff

Index: docs/LangRef.rst
===================================================================
--- docs/LangRef.rst
+++ docs/LangRef.rst
@@ -2225,6 +2225,10 @@
may not modify any other memory accessible by the module being compiled.
A volatile operation may not call any code in the current module.
+In general, the address space of a volatile operation may not be
+changed. Different address spaces may have different trapping behavior
+when dereferencing an invalid pointer.
+
The compiler may assume execution will continue after a volatile operation,
so operations which modify memory or may have undefined behavior can be
hoisted past a volatile operation.
@@ -2708,10 +2712,18 @@
The pointer type is used to specify memory locations. Pointers are
commonly used to reference objects in memory.
-Pointer types may have an optional address space attribute defining the
-numbered address space where the pointed-to object resides. The default
-address space is number zero. The semantics of non-zero address spaces
-are target-specific.
+Pointer types may have an optional address space attribute defining
+the numbered address space where the pointed-to object resides. The
+default address space is number zero. The semantics of non-zero
+address spaces are target-specific. Memory access through an invalid,
+non-dereferenceable "null" pointer is undefined behavior in any address
+space. Pointers with the bit-value 0 are only assumed to be
+non-dereferenceable in address space 0.
+
+If an object can be proven accessible through a pointer with a
+different address space, the access may be modified to use that
+address space. Possible exceptions may apply if the operation is
+``volatile``.
Note that LLVM does not permit pointers to void (``void*``) nor does it
permit pointers to labels (``label*``). Use ``i8*`` instead.
@@ -9699,9 +9711,19 @@
``ptrval`` to type ``pty2``. It can be a *no-op cast* or a complex
value modification, depending on the target and the address space
pair. Pointer conversions within the same address space must be
-performed with the ``bitcast`` instruction. Note that if the address space
-conversion is legal then both result and operand refer to the same memory
-location.
+performed with the ``bitcast`` instruction. Note that if the address
+space conversion produces a dereferenceable result then both result and
+operand refer to the same memory location. The conversion must have no
+side effects, or capture the value of the pointer.
+
+If the source is :ref:`poison <poisonvalues>`, the result is
+:ref:`poison <poisonvalues>`.
+
+If the source is not :ref:`poison <poisonvalues>`, and both source and
+destination address spaces are :ref:`integral pointers
+<nointptrtype>`, and the result pointer is dereferenceable, the cast is
+assumed to be reversible (i.e. casting the result back to the original
+address space should yield the original bit pattern).
Example:
""""""""

Event Timeline