Rollup merge of #125003 - RalfJung:aligned_alloc, r=cuviper · rust-lang/rust@c5b17ec
@@ -87,21 +87,18 @@ cfg_if::cfg_if! {
8787// /memory/aligned_memory.cc
8888 libc::memalign(layout.align(), layout.size()) as *mut u8
8989}
90-} else if #[cfg(target_os = "wasi")] {
91- #[inline]
92-unsafe fn aligned_malloc(layout: &Layout) -> *mut u8 {
93-// C11 aligned_alloc requires that the size be a multiple of the alignment.
94-// Layout already checks that the size rounded up doesn't overflow isize::MAX.
95-let align = layout.align();
96-let size = layout.size().next_multiple_of(align);
97- libc::aligned_alloc(align, size) as *mut u8
98-}
9990} else {
10091 #[inline]
10192unsafe fn aligned_malloc(layout: &Layout) -> *mut u8 {
10293let mut out = ptr::null_mut();
103-// posix_memalign requires that the alignment be a multiple of `sizeof(void*)`.
104-// Since these are all powers of 2, we can just use max.
94+// We prefer posix_memalign over aligned_malloc since with aligned_malloc,
95+// implementations are making almost arbitrary choices for which alignments are
96+// "supported", making it hard to use. For instance, some implementations require the
97+// size to be a multiple of the alignment (wasi emmalloc), while others require the
98+// alignment to be at least the pointer size (Illumos, macOS) -- which may or may not be
99+// standards-compliant, but that does not help us.
100+// posix_memalign only has one, clear requirement: that the alignment be a multiple of
101+// `sizeof(void*)`. Since these are all powers of 2, we can just use max.
105102let align = layout.align().max(crate::mem::size_of::<usize>());
106103let ret = libc::posix_memalign(&mut out, align, layout.size());
107104if ret != 0 { ptr::null_mut() } else { out as *mut u8 }