[llvm] LangRef: allocated objects can grow (PR #141338)
Eli Friedman via llvm-commits
llvm-commits at lists.llvm.org
Wed May 28 09:58:52 PDT 2025
================
@@ -3327,6 +3327,19 @@ behavior is undefined:
- the size of all allocated objects must be non-negative and not exceed the
largest signed integer that fits into the index type.
+Allocated objects that are created with operations recognized by LLVM (such as
+:ref:`alloca <i_alloca>`, heap allocation functions marked as such, and global
+variables) may *not* change their size. (``realloc``-style operations do not
+change the size of an existing allocated object; instead, they create a new
+allocated object. Even if the object is at the same location as the old one, old
+pointers cannot be used to access this new object.) However, allocated objects
+can also be created by means not recognized by LLVM, e.g. by directly calling
+``mmap``. Those allocated objects are allowed to grow to the right (i.e.,
+keeping the same base address, but increasing their size) while maintaining the
+validity of existing pointers, as long as they always satisfy the properties
+described above. Currently, allocated objects are not permitted to grow to the
+left or to shrink, nor can they have holes.
----------------
efriedma-quic wrote:
> In particular if we combine this with changing the "beginning" of an allocated object by shrinking it
But you currently forbid shrinking?
> I mean e.g. munmaping a page from the middle of an otherwise contiguous range of allocated pages
I agree munmapping is problematic; overlapping objects would be hard to reason about. There are potentially useful "holes", though: mprotecting a page from a continuous range for a JIT would be a hole in the sense that reads aren't legal.
https://github.com/llvm/llvm-project/pull/141338
More information about the llvm-commits
mailing list