1 /*===---- mm_malloc.h - Allocating and Freeing Aligned Memory Blocks -------===
3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 * See https://llvm.org/LICENSE.txt for license information.
5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 *===-----------------------------------------------------------------------===
19 extern int posix_memalign(void **__memptr
, size_t __alignment
, size_t __size
);
21 // Some systems (e.g. those with GNU libc) declare posix_memalign with an
22 // exception specifier. Via an "egregious workaround" in
23 // Sema::CheckEquivalentExceptionSpec, Clang accepts the following as a valid
24 // redeclaration of glibc's declaration.
25 extern "C" int posix_memalign(void **__memptr
, size_t __alignment
, size_t __size
);
29 #if !(defined(_WIN32) && defined(_mm_malloc))
30 static __inline__
void *__attribute__((__always_inline__
, __nodebug__
,
31 __malloc__
, __alloc_size__(1),
33 _mm_malloc(size_t __size
, size_t __align
) {
35 return malloc(__size
);
38 if (!(__align
& (__align
- 1)) && __align
< sizeof(void *))
39 __align
= sizeof(void *);
41 void *__mallocedMemory
;
42 #if defined(__MINGW32__)
43 __mallocedMemory
= __mingw_aligned_malloc(__size
, __align
);
45 __mallocedMemory
= _aligned_malloc(__size
, __align
);
47 if (posix_memalign(&__mallocedMemory
, __align
, __size
))
51 return __mallocedMemory
;
54 static __inline__
void __attribute__((__always_inline__
, __nodebug__
))
57 #if defined(__MINGW32__)
58 __mingw_aligned_free(__p
);
67 #endif /* __MM_MALLOC_H */