diff options
| author | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2017-11-29 22:29:38 +0000 |
|---|---|---|
| committer | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2017-11-29 22:29:38 +0000 |
| commit | 62da55020b2ae14b41dcd59b0170f6f5bd1392a4 (patch) | |
| tree | cbae1def6bddd01ad37f8d223dbac593cd0aede9 /openmp/runtime/src | |
| parent | 64249504b5d6a4e28921cf646833a11a5138ec96 (diff) | |
| download | bcm5719-llvm-62da55020b2ae14b41dcd59b0170f6f5bd1392a4.tar.gz bcm5719-llvm-62da55020b2ae14b41dcd59b0170f6f5bd1392a4.zip | |
Fix aligned memory allocation in the stub library
kmp_aligned_malloc() always returned NULL on Windows (stub library only)
that may cause Fortran application crash. With this change all memory
allocation functions were fixed to use aligned{m,re,rec}alloc() to
allocate/reallocate memory. To deallocate that memory _aligned_free() is
used in kmp_free().
Patch by Olga Malysheva
Differential Revision: https://reviews.llvm.org/D40296
llvm-svn: 319375
Diffstat (limited to 'openmp/runtime/src')
| -rw-r--r-- | openmp/runtime/src/kmp_stub.cpp | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/openmp/runtime/src/kmp_stub.cpp b/openmp/runtime/src/kmp_stub.cpp index c704e61dd01..d487a3d2377 100644 --- a/openmp/runtime/src/kmp_stub.cpp +++ b/openmp/runtime/src/kmp_stub.cpp @@ -139,34 +139,59 @@ void kmp_set_disp_num_buffers(omp_int_t arg) { i; } /* KMP memory management functions. */ void *kmp_malloc(size_t size) { i; - return malloc(size); + void *res; +#if KMP_OS_WINDOWS + // If succesfull returns a pointer to the memory block, otherwise returns + // NULL. + // Sets errno to ENOMEM or EINVAL if memory allocation failed or parameter + // validation failed. + res = _aligned_malloc(size, 1); +#else + res = malloc(size); +#endif + return res; } void *kmp_aligned_malloc(size_t sz, size_t a) { i; + int err; + void *res; #if KMP_OS_WINDOWS - errno = ENOSYS; // not supported - return NULL; // no standard aligned allocator on Windows (pre - C11) + res = _aligned_malloc(sz, a); #else - void *res; - int err; if (err = posix_memalign(&res, a, sz)) { errno = err; // can be EINVAL or ENOMEM - return NULL; + res = NULL; } - return res; #endif + return res; } void *kmp_calloc(size_t nelem, size_t elsize) { i; - return calloc(nelem, elsize); + void *res; +#if KMP_OS_WINDOWS + res = _aligned_recalloc(NULL, nelem, elsize, 1); +#else + res = calloc(nelem, elsize); +#endif + return res; } void *kmp_realloc(void *ptr, size_t size) { i; - return realloc(ptr, size); + void *res; +#if KMP_OS_WINDOWS + res = _aligned_realloc(ptr, size, 1); +#else + res = realloc(ptr, size); +#endif + return res; } void kmp_free(void *ptr) { i; +#if KMP_OS_WINDOWS + _aligned_free(ptr); +#else free(ptr); +#endif } static int __kmps_blocktime = INT_MAX; |

