clang  14.0.0git
mm_malloc.h
Go to the documentation of this file.
1 /*===---- mm_malloc.h - Allocating and Freeing Aligned Memory Blocks -------===
2  *
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
6  *
7  *===-----------------------------------------------------------------------===
8  */
9 
10 #ifndef __MM_MALLOC_H
11 #define __MM_MALLOC_H
12 
13 #include <stdlib.h>
14 
15 #ifdef _WIN32
16 #include <malloc.h>
17 #else
18 #ifndef __cplusplus
19 extern int posix_memalign(void **__memptr, size_t __alignment, size_t __size);
20 #else
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);
26 #endif
27 #endif
28 
29 #if !(defined(_WIN32) && defined(_mm_malloc))
30 static __inline__ void *__attribute__((__always_inline__, __nodebug__,
31  __malloc__))
32 _mm_malloc(size_t __size, size_t __align)
33 {
34  if (__align == 1) {
35  return malloc(__size);
36  }
37 
38  if (!(__align & (__align - 1)) && __align < sizeof(void *))
39  __align = sizeof(void *);
40 
42 #if defined(__MINGW32__)
43  __mallocedMemory = __mingw_aligned_malloc(__size, __align);
44 #elif defined(_WIN32)
45  __mallocedMemory = _aligned_malloc(__size, __align);
46 #else
48  return 0;
49 #endif
50 
51  return __mallocedMemory;
52 }
53 
54 static __inline__ void __attribute__((__always_inline__, __nodebug__))
55 _mm_free(void *__p)
56 {
57 #if defined(__MINGW32__)
58  __mingw_aligned_free(__p);
59 #elif defined(_WIN32)
60  _aligned_free(__p);
61 #else
62  free(__p);
63 #endif
64 }
65 #endif
66 
67 #endif /* __MM_MALLOC_H */
__attribute__
static __inline__ void * __attribute__((__always_inline__, __nodebug__, __malloc__)) _mm_malloc(size_t __size
__align
static __inline__ void size_t __align
Definition: mm_malloc.h:33
posix_memalign
int posix_memalign(void **__memptr, size_t __alignment, size_t __size)
__p
static __inline unsigned char unsigned int unsigned int unsigned int * __p
Definition: adxintrin.h:24
__mallocedMemory
void * __mallocedMemory
Definition: mm_malloc.h:41