[llvm] [LangRef] Update initializes definition (PR #134370)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 7 04:53:28 PDT 2025
================
@@ -1690,10 +1690,24 @@ Currently, only the following parameter attributes are defined:
``initializes((Lo1, Hi1), ...)``
This attribute indicates that the function initializes the ranges of the
- pointer parameter's memory, ``[%p+LoN, %p+HiN)``. Initialization of memory
- means the first memory access is a non-volatile, non-atomic write. The
- write must happen before the function returns. If the function unwinds,
- the write may not happen.
+ pointer parameter's memory ``[%p+LoN, %p+HiN)``. Colloquially, this means
+ that all bytes in the specified range are written before the function
+ returns, and not read prior to the initializing write. If the function
+ unwinds, the write may not happen.
+
+ Formally, this is specified in terms of an "initialized" shadow state for
+ all bytes in the range, which is set to "not initialized" at function entry.
+ If a memory access is performed through a pointer based on the argument,
+ and an accessed byte has not been marked as "initialized" yet, then:
+
+ * If the byte is stored with a non-volatile, non-atomic write, mark it as
+ "initialized".
+ * If the byte is stored with a volatile or atomic write, the behavior is
+ undefined.
+ * If the byte is loaded, return an undef value.
----------------
nikic wrote:
Returning poison is a bit problematic due to load poison widening, but I would be okay with specifying poison here. (As we currently just ignore the whole load poison widening issue everywhere anyway.)
https://github.com/llvm/llvm-project/pull/134370
More information about the llvm-commits
mailing list