[Openmp-commits] [openmp] r319375 - Fix aligned memory allocation in the stub library

Jonathan Peyton via Openmp-commits openmp-commits at lists.llvm.org
Wed Nov 29 14:29:38 PST 2017


Author: jlpeyton
Date: Wed Nov 29 14:29:38 2017
New Revision: 319375

URL: http://llvm.org/viewvc/llvm-project?rev=319375&view=rev
Log:
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

Modified:
    openmp/trunk/runtime/src/kmp_stub.cpp

Modified: openmp/trunk/runtime/src/kmp_stub.cpp
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/src/kmp_stub.cpp?rev=319375&r1=319374&r2=319375&view=diff
==============================================================================
--- openmp/trunk/runtime/src/kmp_stub.cpp (original)
+++ openmp/trunk/runtime/src/kmp_stub.cpp Wed Nov 29 14:29:38 2017
@@ -139,34 +139,59 @@ void kmp_set_disp_num_buffers(omp_int_t
 /* 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;




More information about the Openmp-commits mailing list