IIUC atexit isn't exported by ucrtbase, but still exists (maybe as a builtin) and is resolved to a module-local symbol which can be used to register functions executed on module process detach. It is called implicitly by C++ compilers to register static destructors.
-- v5: include: Define __cpuid(ex) as intrinsics when possible. include: Don't import atexit from CRTs.
From: Rémi Bernon rbernon@codeweavers.com
--- include/msvcrt/stdlib.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/msvcrt/stdlib.h b/include/msvcrt/stdlib.h index f3df662528a..df307196a12 100644 --- a/include/msvcrt/stdlib.h +++ b/include/msvcrt/stdlib.h @@ -203,7 +203,7 @@ _ACRTIMP DECLSPEC_NORETURN void __cdecl _Exit(int); _ACRTIMP DECLSPEC_NORETURN void __cdecl _exit(int); _ACRTIMP DECLSPEC_NORETURN void __cdecl abort(void); _ACRTIMP int __cdecl abs(int); -_ACRTIMP int __cdecl atexit(void (__cdecl *)(void)); +extern int __cdecl atexit(void (__cdecl *)(void)); _ACRTIMP double __cdecl atof(const char*); _ACRTIMP int __cdecl atoi(const char*); _ACRTIMP int __cdecl _atoi_l(const char*,_locale_t);
From: Rémi Bernon rbernon@codeweavers.com
--- include/msvcrt/intrin.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/include/msvcrt/intrin.h b/include/msvcrt/intrin.h index 7981e2798ba..ba825b7b09e 100644 --- a/include/msvcrt/intrin.h +++ b/include/msvcrt/intrin.h @@ -15,17 +15,34 @@ extern "C" { #endif
+#ifndef __has_builtin +# define __has_builtin(x) 0 +#endif + #if defined(__i386__) || (defined(__x86_64__) && !defined(__arm64ec__)) + +#if __has_builtin(__cpuidex) || (defined(_MSC_VER) && !defined(__clang__)) +void __cpuidex(int info[4], int ax, int cx); +#pragma intrinsic(__cpuidex) +#else static inline void __cpuidex(int info[4], int ax, int cx) { __asm__ ("cpuid" : "=a"(info[0]), "=b" (info[1]), "=c"(info[2]), "=d"(info[3]) : "a"(ax), "c"(cx)); } +#endif + +#if __has_builtin(__cpuid) || (defined(_MSC_VER) && !defined(__clang__)) +void __cpuid(int info[4], int ax); +#pragma intrinsic(__cpuid) +#else static inline void __cpuid(int info[4], int ax) { return __cpuidex(info, ax, 0); } #endif
+#endif + #if defined(__aarch64__) || defined(__arm64ec__) typedef enum _tag_ARM64INTR_BARRIER_TYPE {
This merge request was approved by Jacek Caban.