[libc-commits] [libc] [libc] Add aligned_alloc (PR #96586)
Paul Kirth via libc-commits
libc-commits at lists.llvm.org
Wed Jun 26 09:15:47 PDT 2024
================
@@ -261,6 +262,58 @@ class Block {
constexpr Block(size_t prev_outer_size, size_t outer_size);
+ bool is_usable_space_aligned(size_t alignment) const {
+ return reinterpret_cast<uintptr_t>(usable_space()) % alignment == 0;
+ }
+
+ size_t padding_for_alignment(size_t alignment) const {
+ if (is_usable_space_aligned(alignment))
+ return 0;
+
+ // We need to ensure we can always split this block into a "padding" block
+ // and the aligned block. To do this, we need enough extra space for at
+ // least one block.
+ //
+ // |block |usable_space |
+ // |........|......................................|
+ // ^
+ // Alignment requirement
+ //
+ //
+ // |block |space |block |usable_space |
+ // |........|........|........|....................|
+ // ^
+ // Alignment requirement
+ //
+ uintptr_t start = reinterpret_cast<uintptr_t>(usable_space());
+ alignment = cpp::max(alignment, ALIGNMENT);
+ return align_up(start + BLOCK_OVERHEAD, alignment) - start;
+ }
+
+ bool can_allocate(size_t alignment, size_t size) const;
+
+ // This is the return type for `allocate` which can split one block into up to
+ // three blocks.
+ struct BlockInfo {
----------------
ilovepi wrote:
hmm, I know I suggested `BlockInfo`, but this looks like some kind of ListNode, or header ... I'm not going to bikeshed on the naming here if you're happy w/ it, but I figured I should point that out, since I'm partially responsible.
https://github.com/llvm/llvm-project/pull/96586
More information about the libc-commits
mailing list