crt: Provide __p__osver(), __p__winmajor(), __p__winminor() and __p__winver() for msvcr90+ and UCRT

_osver, _winmajor, _winminor and _winver are exported from CRT DLL library
up to the msvcr80.dll version. Add support for __p_ functions also for
msvcr90+ and UCRT import libraries.

Signed-off-by: Martin Storsjö <martin@martin.st>
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index a6488f8..b1b34b9 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -361,6 +361,7 @@
   misc/__badioinfo.c \
   misc/__p___initenv.c \
   misc/__p___winitenv.c \
+  misc/__p__osver_emul.c \
   misc/__initenv.c \
   misc/__winitenv.c \
   misc/ucrt-access.c \
@@ -932,6 +933,7 @@
   misc/wctype.c
 
 src_msvcr90=\
+  misc/__p__osver_emul.c \
   misc/imaxdiv.c \
   misc/isblank.c \
   misc/iswblank.c \
@@ -939,17 +941,22 @@
   misc/wctype.c
 
 src_msvcr100=\
+  misc/__p__osver_emul.c \
   misc/isblank.c \
   misc/iswblank.c \
   misc/wctrans.c \
   misc/wctype.c
 
 src_msvcr110=\
+  misc/__p__osver_emul.c \
   misc/isblank.c \
   misc/iswblank.c \
   misc/wctrans.c \
   misc/wctype.c
 
+src_msvcr120=\
+  misc/__p__osver_emul.c
+
 src_msvcr120_app=\
   misc/__p___initenv.c \
   misc/__p___winitenv.c \
@@ -1479,15 +1486,15 @@
 	cd $(dir $@) && $(AR) -M < $(abspath $<)
 
 lib32_DATA += lib32/libmsvcr120.a
-lib32/libmsvcr120.a: lib-common/msvcr120.mri lib32/libmsvcr120_def.a lib32/libmsvcrt_common.a
+lib32/libmsvcr120.a: lib-common/msvcr120.mri lib32/libmsvcr120_def.a lib32/libmsvcrt_common.a lib32/libmsvcr120_extra.a
 	cd $(dir $@) && $(AR) -M < $(abspath $<)
 
 lib32_DATA += lib32/libmsvcr120d.a
-lib32/libmsvcr120d.a: lib-common/msvcr120d.mri lib32/libmsvcr120d_def.a lib32/libmsvcrt_common.a
+lib32/libmsvcr120d.a: lib-common/msvcr120d.mri lib32/libmsvcr120d_def.a lib32/libmsvcrt_common.a lib32/libmsvcr120_extra.a
 	cd $(dir $@) && $(AR) -M < $(abspath $<)
 
 lib32_DATA += lib32/libmsvcr120_app.a
-lib32/libmsvcr120_app.a: lib-common/msvcr120_app.mri lib32/libmsvcr120_app_def.a lib32/libmsvcrt_common.a lib32/libmsvcr120_app_extra.a
+lib32/libmsvcr120_app.a: lib-common/msvcr120_app.mri lib32/libmsvcr120_app_def.a lib32/libmsvcrt_common.a lib32/libmsvcr120_extra.a lib32/libmsvcr120_app_extra.a
 	cd $(dir $@) && $(AR) -M < $(abspath $<)
 
 lib32_DATA += lib32/libucrtbase.a
@@ -1499,7 +1506,7 @@
 	cd $(dir $@) && $(AR) -M < $(abspath $<)
 
 lib32_DATA += lib32/libucrt.a lib32/libucrtapp.a
-noinst_LIBRARIES += lib32/libcrtdll_extra.a lib32/libmsvcrt10_extra.a lib32/libmsvcrt20_extra.a lib32/libmsvcrt40_extra.a lib32/libmsvcrt_common.a lib32/libmsvcrt_extra.a lib32/libmsvcr70_extra.a lib32/libmsvcr71_extra.a lib32/libmsvcr80_extra.a lib32/libmsvcr90_extra.a lib32/libmsvcr100_extra.a lib32/libmsvcr110_extra.a lib32/libmsvcr120_app_extra.a lib32/libucrt_extra.a lib32/libucrtapp_extra.a
+noinst_LIBRARIES += lib32/libcrtdll_extra.a lib32/libmsvcrt10_extra.a lib32/libmsvcrt20_extra.a lib32/libmsvcrt40_extra.a lib32/libmsvcrt_common.a lib32/libmsvcrt_extra.a lib32/libmsvcr70_extra.a lib32/libmsvcr71_extra.a lib32/libmsvcr80_extra.a lib32/libmsvcr90_extra.a lib32/libmsvcr100_extra.a lib32/libmsvcr110_extra.a lib32/libmsvcr120_extra.a lib32/libmsvcr120_app_extra.a lib32/libucrt_extra.a lib32/libucrtapp_extra.a
 lib32_libcrtdll_extra_a_SOURCES = $(src_crtdll)
 lib32_libcrtdll_extra_a_CPPFLAGS = $(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
 lib32_libmsvcrt10_extra_a_SOURCES = $(src_msvcrt10)
@@ -1524,6 +1531,8 @@
 lib32_libmsvcr100_extra_a_CPPFLAGS = $(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
 lib32_libmsvcr110_extra_a_SOURCES = $(src_msvcr110)
 lib32_libmsvcr110_extra_a_CPPFLAGS = $(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+lib32_libmsvcr120_extra_a_SOURCES = $(src_msvcr120)
+lib32_libmsvcr120_extra_a_CPPFLAGS = $(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
 lib32_libmsvcr120_app_extra_a_SOURCES = $(src_msvcr120_app)
 lib32_libmsvcr120_app_extra_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
 lib32_libucrt_extra_a_SOURCES = $(src_ucrtbase32)
@@ -1854,15 +1863,15 @@
 	cd $(dir $@) && $(AR) -M < $(abspath $<)
 
 lib64_DATA += lib64/libmsvcr120.a
-lib64/libmsvcr120.a: lib-common/msvcr120.mri lib64/libmsvcr120_def.a lib64/libmsvcrt_common.a
+lib64/libmsvcr120.a: lib-common/msvcr120.mri lib64/libmsvcr120_def.a lib64/libmsvcrt_common.a lib64/libmsvcr120_extra.a
 	cd $(dir $@) && $(AR) -M < $(abspath $<)
 
 lib64_DATA += lib64/libmsvcr120d.a
-lib64/libmsvcr120d.a: lib-common/msvcr120d.mri lib64/libmsvcr120d_def.a lib64/libmsvcrt_common.a
+lib64/libmsvcr120d.a: lib-common/msvcr120d.mri lib64/libmsvcr120d_def.a lib64/libmsvcrt_common.a lib64/libmsvcr120_extra.a
 	cd $(dir $@) && $(AR) -M < $(abspath $<)
 
 lib64_DATA += lib64/libmsvcr120_app.a
-lib64/libmsvcr120_app.a: lib-common/msvcr120_app.mri lib64/libmsvcr120_app_def.a lib64/libmsvcrt_common.a lib64/libmsvcr120_app_extra.a
+lib64/libmsvcr120_app.a: lib-common/msvcr120_app.mri lib64/libmsvcr120_app_def.a lib64/libmsvcrt_common.a lib64/libmsvcr120_extra.a lib64/libmsvcr120_app_extra.a
 	cd $(dir $@) && $(AR) -M < $(abspath $<)
 
 lib64_DATA += lib64/libucrtbase.a
@@ -1874,7 +1883,7 @@
 	cd $(dir $@) && $(AR) -M < $(abspath $<)
 
 lib64_DATA += lib64/libucrt.a lib64/libucrtapp.a
-noinst_LIBRARIES += lib64/libmsvcrt_common.a lib64/libmsvcrt_extra.a lib64/libmsvcr80_extra.a lib64/libmsvcr90_extra.a lib64/libmsvcr100_extra.a lib64/libmsvcr110_extra.a lib64/libmsvcr120_app_extra.a lib64/libucrt_extra.a lib64/libucrtapp_extra.a
+noinst_LIBRARIES += lib64/libmsvcrt_common.a lib64/libmsvcrt_extra.a lib64/libmsvcr80_extra.a lib64/libmsvcr90_extra.a lib64/libmsvcr100_extra.a lib64/libmsvcr110_extra.a lib64/libmsvcr120_extra.a lib64/libmsvcr120_app_extra.a lib64/libucrt_extra.a lib64/libucrtapp_extra.a
 lib64_libmsvcrt_common_a_SOURCES = $(src_msvcrt_common64)
 lib64_libmsvcrt_common_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
 lib64_libmsvcrt_extra_a_SOURCES = $(src_msvcrt64)
@@ -1887,6 +1896,8 @@
 lib64_libmsvcr100_extra_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
 lib64_libmsvcr110_extra_a_SOURCES = $(src_msvcr110)
 lib64_libmsvcr110_extra_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+lib64_libmsvcr120_extra_a_SOURCES = $(src_msvcr120)
+lib64_libmsvcr120_extra_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
 lib64_libmsvcr120_app_extra_a_SOURCES = $(src_msvcr120_app)
 lib64_libmsvcr120_app_extra_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
 lib64_libucrt_extra_a_SOURCES = $(src_ucrtbase64)
diff --git a/mingw-w64-crt/lib-common/msvcr120.mri b/mingw-w64-crt/lib-common/msvcr120.mri
index 89273be..a03f7d3 100644
--- a/mingw-w64-crt/lib-common/msvcr120.mri
+++ b/mingw-w64-crt/lib-common/msvcr120.mri
@@ -1,5 +1,6 @@
 CREATE libmsvcr120.a
 ADDLIB libmsvcr120_def.a
 ADDLIB libmsvcrt_common.a
+ADDLIB libmsvcr120_extra.a
 SAVE
 END
diff --git a/mingw-w64-crt/lib-common/msvcr120_app.mri b/mingw-w64-crt/lib-common/msvcr120_app.mri
index c4a898c..47e6ab6 100644
--- a/mingw-w64-crt/lib-common/msvcr120_app.mri
+++ b/mingw-w64-crt/lib-common/msvcr120_app.mri
@@ -1,6 +1,7 @@
 CREATE libmsvcr120_app.a
 ADDLIB libmsvcr120_app_def.a
 ADDLIB libmsvcrt_common.a
+ADDLIB libmsvcr120_extra.a
 ADDLIB libmsvcr120_app_extra.a
 SAVE
 END
diff --git a/mingw-w64-crt/lib-common/msvcr120d.mri b/mingw-w64-crt/lib-common/msvcr120d.mri
index 7e0e520..cd3753c 100644
--- a/mingw-w64-crt/lib-common/msvcr120d.mri
+++ b/mingw-w64-crt/lib-common/msvcr120d.mri
@@ -1,5 +1,6 @@
 CREATE libmsvcr120d.a
 ADDLIB libmsvcr120d_def.a
 ADDLIB libmsvcrt_common.a
+ADDLIB libmsvcr120_extra.a
 SAVE
 END
diff --git a/mingw-w64-crt/misc/__p__osver_emul.c b/mingw-w64-crt/misc/__p__osver_emul.c
new file mode 100644
index 0000000..61a38c8
--- /dev/null
+++ b/mingw-w64-crt/misc/__p__osver_emul.c
@@ -0,0 +1,62 @@
+/**
+ * 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 <stdlib.h>
+#include <windows.h>
+
+#undef _osver
+static unsigned int _osver;
+
+#undef _winmajor
+static unsigned int _winmajor;
+
+#undef _winminor
+static unsigned int _winminor;
+
+#undef _winver
+static unsigned int _winver;
+
+static void init_versions(void)
+{
+    static int init = 0;
+    if (!init)
+    {
+        unsigned int version = GetVersion();
+        _winmajor = version & 0xFF;
+        _winminor = (version >> 8) & 0xFF;
+        _winver = (_winmajor << 8) | _winminor;
+        _osver = (version >> 16) & 0xFFFF;
+        init = 1;
+    }
+}
+
+unsigned int* __cdecl __p__osver(void)
+{
+    init_versions();
+    return &_osver;
+}
+unsigned int* (__cdecl *__MINGW_IMP_SYMBOL(__p__osver))(void) = __p__osver;
+
+unsigned int* __cdecl __p__winmajor(void)
+{
+    init_versions();
+    return &_winmajor;
+}
+unsigned int* (__cdecl *__MINGW_IMP_SYMBOL(__p__winmajor))(void) = __p__winmajor;
+
+unsigned int* __cdecl __p__winminor(void)
+{
+    init_versions();
+    return &_winminor;
+}
+unsigned int* (__cdecl *__MINGW_IMP_SYMBOL(__p__winminor))(void) = __p__winminor;
+
+unsigned int* __cdecl __p__winver(void)
+{
+    init_versions();
+    return &_winver;
+}
+unsigned int* (__cdecl *__MINGW_IMP_SYMBOL(__p__winver))(void) = __p__winver;