summaryrefslogtreecommitdiffstats
path: root/openmp/runtime/src
diff options
context:
space:
mode:
authorJonathan Peyton <jonathan.l.peyton@intel.com>2017-11-29 22:29:38 +0000
committerJonathan Peyton <jonathan.l.peyton@intel.com>2017-11-29 22:29:38 +0000
commit62da55020b2ae14b41dcd59b0170f6f5bd1392a4 (patch)
treecbae1def6bddd01ad37f8d223dbac593cd0aede9 /openmp/runtime/src
parent64249504b5d6a4e28921cf646833a11a5138ec96 (diff)
downloadbcm5719-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.cpp43
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;
OpenPOWER on IntegriCloud