They are natively available since msvcr80.dll, they are not available in
msvcrt.dll. Provide compatibility emulation into all import libraries where
they are not available.

Adjust check for _aligned_msize() which is also available since
msvcr80.dll.
---
 mingw-w64-crt/Makefile.am                     |  6 ++++++
 mingw-w64-crt/misc/_aligned_offset_recalloc.c | 16 ++++++++++++++++
 mingw-w64-crt/misc/_aligned_recalloc.c        | 16 ++++++++++++++++
 mingw-w64-crt/misc/_recalloc.c                | 16 ++++++++++++++++
 mingw-w64-headers/crt/crtdbg.h                |  2 +-
 mingw-w64-headers/crt/malloc.h                |  2 +-
 mingw-w64-headers/crt/stdlib.h                |  2 +-
 7 files changed, 57 insertions(+), 3 deletions(-)
 create mode 100644 mingw-w64-crt/misc/_aligned_offset_recalloc.c
 create mode 100644 mingw-w64-crt/misc/_aligned_recalloc.c
 create mode 100644 mingw-w64-crt/misc/_recalloc.c

diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index 71368648cca3..b90920e468fe 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -333,7 +333,10 @@ src_msvcrt=\
   misc/__iswcsymf.c \
   misc/__sys_errlist.c \
   misc/__sys_nerr.c \
+  misc/_aligned_offset_recalloc.c \
+  misc/_aligned_recalloc.c \
   misc/_configthreadlocale.c \
+  misc/_recalloc.c \
   misc/_set_purecall_handler.c \
   misc/imaxdiv.c \
   misc/invalid_parameter_handler.c \
@@ -820,9 +823,12 @@ src_pre_msvcr80=\
   misc/__iswcsymf.c \
   misc/__sys_errlist.c \
   misc/__sys_nerr.c \
+  misc/_aligned_offset_recalloc.c \
+  misc/_aligned_recalloc.c \
   misc/_configthreadlocale.c \
   misc/_get_errno.c \
   misc/_initterm_e.c \
+  misc/_recalloc.c \
   misc/_set_errno.c \
   misc/btowc.c \
   misc/imaxabs.c \
diff --git a/mingw-w64-crt/misc/_aligned_offset_recalloc.c 
b/mingw-w64-crt/misc/_aligned_offset_recalloc.c
new file mode 100644
index 000000000000..caccc29f2360
--- /dev/null
+++ b/mingw-w64-crt/misc/_aligned_offset_recalloc.c
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <malloc.h>
+
+void * __cdecl _aligned_offset_recalloc(void *memory, size_t count, size_t 
size, size_t alignment, size_t offset)
+{
+  size_t total_size;
+  if (__builtin_mul_overflow(count, size, &total_size))
+    return NULL;
+  return _aligned_offset_realloc(memory, total_size, alignment, offset);
+}
+void * (__cdecl *__MINGW_IMP_SYMBOL(_aligned_offset_recalloc))(void *, size_t, 
size_t, size_t, size_t) = _aligned_offset_recalloc;
diff --git a/mingw-w64-crt/misc/_aligned_recalloc.c 
b/mingw-w64-crt/misc/_aligned_recalloc.c
new file mode 100644
index 000000000000..b5ba8ed807ef
--- /dev/null
+++ b/mingw-w64-crt/misc/_aligned_recalloc.c
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <malloc.h>
+
+void * __cdecl _aligned_recalloc(void *memory, size_t count, size_t size, 
size_t alignment)
+{
+  size_t total_size;
+  if (__builtin_mul_overflow(count, size, &total_size))
+    return NULL;
+  return _aligned_realloc(memory, total_size, alignment);
+}
+void * (__cdecl *__MINGW_IMP_SYMBOL(_aligned_recalloc))(void *, size_t, 
size_t, size_t) = _aligned_recalloc;
diff --git a/mingw-w64-crt/misc/_recalloc.c b/mingw-w64-crt/misc/_recalloc.c
new file mode 100644
index 000000000000..5eaecccf1306
--- /dev/null
+++ b/mingw-w64-crt/misc/_recalloc.c
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <malloc.h>
+
+void * __cdecl _recalloc(void *memory, size_t count, size_t size)
+{
+  size_t total_size;
+  if (__builtin_mul_overflow(count, size, &total_size))
+    return NULL;
+  return realloc(memory, total_size);
+}
+void * (__cdecl *__MINGW_IMP_SYMBOL(_recalloc))(void *, size_t, size_t) = 
_recalloc;
diff --git a/mingw-w64-headers/crt/crtdbg.h b/mingw-w64-headers/crt/crtdbg.h
index c498bcfa63f0..2da0cdbe72a5 100644
--- a/mingw-w64-headers/crt/crtdbg.h
+++ b/mingw-w64-headers/crt/crtdbg.h
@@ -161,10 +161,10 @@ extern "C" {
 #define _aligned_offset_malloc_dbg(s,a,o,f,l) _aligned_offset_malloc(s,a,o)
 #define _aligned_offset_realloc_dbg(p,s,a,o,f,l) 
_aligned_offset_realloc(p,s,a,o)
 
-#if __MSVCRT_VERSION__ >= 0x900
 #define _recalloc_dbg(p,c,s,t,f,l) _recalloc(p,c,s)
 #define _aligned_recalloc_dbg(p,c,s,a,f,l) _aligned_realloc(p,c,s,a)
 #define _aligned_offset_recalloc_dbg(p,c,s,a,o,f,l) 
_aligned_offset_recalloc(p,c,s,a,o)
+#if __MSVCRT_VERSION__ >= 0x800
 #define _aligned_msize_dbg(p,a,o) _aligned_msize(p,a,o)
 #endif
 
diff --git a/mingw-w64-headers/crt/malloc.h b/mingw-w64-headers/crt/malloc.h
index cc72d4cac909..78d67dd2eeb4 100644
--- a/mingw-w64-headers/crt/malloc.h
+++ b/mingw-w64-headers/crt/malloc.h
@@ -102,10 +102,10 @@ extern "C" {
   _CRTIMP void *__cdecl _aligned_offset_malloc(size_t _Size,size_t 
_Alignment,size_t _Offset);
   _CRTIMP void *__cdecl _aligned_realloc(void *_Memory,size_t _Size,size_t 
_Alignment);
   _CRTIMP void *__cdecl _aligned_offset_realloc(void *_Memory,size_t 
_Size,size_t _Alignment,size_t _Offset);
-# if __MSVCRT_VERSION__ >= 0x900
   _CRTIMP void *__cdecl _recalloc(void *_Memory,size_t _Count,size_t _Size);
   _CRTIMP void *__cdecl _aligned_recalloc(void *_Memory,size_t _Count,size_t 
_Size,size_t _Alignment);
   _CRTIMP void *__cdecl _aligned_offset_recalloc(void *_Memory,size_t 
_Count,size_t _Size,size_t _Alignment,size_t _Offset);
+# if __MSVCRT_VERSION__ >= 0x800
   _CRTIMP size_t __cdecl _aligned_msize(void *_Memory,size_t _Alignment,size_t 
_Offset);
 # endif
 
diff --git a/mingw-w64-headers/crt/stdlib.h b/mingw-w64-headers/crt/stdlib.h
index d43fa33b7f2c..998eb4362cac 100644
--- a/mingw-w64-headers/crt/stdlib.h
+++ b/mingw-w64-headers/crt/stdlib.h
@@ -458,10 +458,10 @@ float __cdecl __MINGW_NOTHROW strtof(const char * 
__restrict__ _Str,char ** __re
   _CRTIMP void *__cdecl _aligned_offset_malloc(size_t _Size,size_t 
_Alignment,size_t _Offset);
   _CRTIMP void *__cdecl _aligned_realloc(void *_Memory,size_t _Size,size_t 
_Alignment);
   _CRTIMP void *__cdecl _aligned_offset_realloc(void *_Memory,size_t 
_Size,size_t _Alignment,size_t _Offset);
-# if __MSVCRT_VERSION__ >= 0x900
   _CRTIMP void *__cdecl _recalloc(void *_Memory,size_t _Count,size_t _Size);
   _CRTIMP void *__cdecl _aligned_recalloc(void *_Memory,size_t _Count,size_t 
_Size,size_t _Alignment);
   _CRTIMP void *__cdecl _aligned_offset_recalloc(void *_Memory,size_t 
_Count,size_t _Size,size_t _Alignment,size_t _Offset);
+# if __MSVCRT_VERSION__ >= 0x800
   _CRTIMP size_t __cdecl _aligned_msize(void *_Memory,size_t _Alignment,size_t 
_Offset);
 # endif
 
-- 
2.20.1



_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to