68 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
| /*===---- mm_malloc.h - Allocating and Freeing Aligned Memory Blocks -------===
 | |
|  *
 | |
|  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | |
|  * See https://llvm.org/LICENSE.txt for license information.
 | |
|  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | |
|  *
 | |
|  *===-----------------------------------------------------------------------===
 | |
|  */
 | |
| 
 | |
| #ifndef __MM_MALLOC_H
 | |
| #define __MM_MALLOC_H
 | |
| 
 | |
| #include <stdlib.h>
 | |
| 
 | |
| #ifdef _WIN32
 | |
| #include <malloc.h>
 | |
| #else
 | |
| #ifndef __cplusplus
 | |
| extern int posix_memalign(void **__memptr, size_t __alignment, size_t __size);
 | |
| #else
 | |
| // Some systems (e.g. those with GNU libc) declare posix_memalign with an
 | |
| // exception specifier. Via an "egregious workaround" in
 | |
| // Sema::CheckEquivalentExceptionSpec, Clang accepts the following as a valid
 | |
| // redeclaration of glibc's declaration.
 | |
| extern "C" int posix_memalign(void **__memptr, size_t __alignment, size_t __size);
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #if !(defined(_WIN32) && defined(_mm_malloc))
 | |
| static __inline__ void *__attribute__((__always_inline__, __nodebug__,
 | |
|                                        __malloc__))
 | |
| _mm_malloc(size_t __size, size_t __align)
 | |
| {
 | |
|   if (__align == 1) {
 | |
|     return malloc(__size);
 | |
|   }
 | |
| 
 | |
|   if (!(__align & (__align - 1)) && __align < sizeof(void *))
 | |
|     __align = sizeof(void *);
 | |
| 
 | |
|   void *__mallocedMemory;
 | |
| #if defined(__MINGW32__)
 | |
|   __mallocedMemory = __mingw_aligned_malloc(__size, __align);
 | |
| #elif defined(_WIN32)
 | |
|   __mallocedMemory = _aligned_malloc(__size, __align);
 | |
| #else
 | |
|   if (posix_memalign(&__mallocedMemory, __align, __size))
 | |
|     return 0;
 | |
| #endif
 | |
| 
 | |
|   return __mallocedMemory;
 | |
| }
 | |
| 
 | |
| static __inline__ void __attribute__((__always_inline__, __nodebug__))
 | |
| _mm_free(void *__p)
 | |
| {
 | |
| #if defined(__MINGW32__)
 | |
|   __mingw_aligned_free(__p);
 | |
| #elif defined(_WIN32)
 | |
|   _aligned_free(__p);
 | |
| #else
 | |
|   free(__p);
 | |
| #endif
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* __MM_MALLOC_H */
 |