[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