https://git.reactos.org/?p=reactos.git;a=commitdiff;h=db4178795143f07b8f894…
commit db4178795143f07b8f894e70f368f2ac99324c0e
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Sat Jul 10 13:07:18 2021 +0200
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Sun Jul 11 21:45:29 2021 +0200
[CRT] Fix handling of intrinsics and inline functions
---
sdk/include/crt/math.h | 85 ++++++++++++++++++++++++++++++------------------
sdk/include/crt/stdlib.h | 4 +++
2 files changed, 57 insertions(+), 32 deletions(-)
diff --git a/sdk/include/crt/math.h b/sdk/include/crt/math.h
index f565491ad6a..d4d2de29ee4 100644
--- a/sdk/include/crt/math.h
+++ b/sdk/include/crt/math.h
@@ -99,6 +99,15 @@ _Check_return_ _CRT_JIT_INTRINSIC double __cdecl sqrt(_In_ double x);
_Check_return_ double __cdecl tan(_In_ double x);
_Check_return_ double __cdecl tanh(_In_ double x);
+#ifdef _MSC_VER
+/* Prevent the compiler from generating calls to _CIatan2 */
+#pragma function(atan2)
+#ifdef _M_AMD64
+/* Prevent the compiler from generating calls to __vdecl_xxx */
+#pragma function(cos,pow,sin,tan)
+#endif
+#endif
+
#ifndef _CRT_MATHERR_DEFINED
#define _CRT_MATHERR_DEFINED
int __CRTDECL _matherr(_Inout_ struct _exception *exception);
@@ -139,6 +148,10 @@ _Check_return_ _CRTIMP int __cdecl _set_SSE2_enable(_In_ int flag);
_Check_return_ _CRTIMP float __cdecl _nextafterf(_In_ float x, _In_ float y);
_Check_return_ _CRTIMP int __cdecl _isnanf(_In_ float x);
_Check_return_ _CRTIMP int __cdecl _fpclassf(_In_ float x);
+#ifdef _MSC_VER
+/* Prevent the compiler from generating calls to __vdecl_floor2 */
+#pragma function(floor)
+#endif
#endif
#if defined(__x86_64) || defined(_M_AMD64) || \
@@ -164,39 +177,40 @@ _Check_return_ _CRT_JIT_INTRINSIC _CRTIMP float __cdecl fabsf(_In_
float x);
_Check_return_ __CRT_INLINE float __CRTDECL fabsf(_In_ float x) { return
((float)fabs((double)x)); }
#endif /* _M_IA64 || _M_ARM || _M_ARM64 */
-#if defined(_CRTBLD) || \
- defined(__x86_64) || defined(_M_AMD64) || \
- defined(__ia64__) || defined(_M_IA64) || \
- defined(__arm__) || defined(_M_ARM) || \
- defined(__arm64__) || defined(_M_ARM64)
-_Check_return_ _CRTIMP float __cdecl _chgsignf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl _copysignf(_In_ float x, _In_ float y);
-_Check_return_ _CRTIMP float __cdecl _hypotf(_In_ float x, _In_ float y);
-_Check_return_ _CRTIMP float __cdecl acosf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl asinf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl atanf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl atan2f(_In_ float x, _In_ float y);
-_Check_return_ _CRTIMP float __cdecl ceilf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl cosf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl coshf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl expf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl floorf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl fmodf(_In_ float x, _In_ float y);
-_Check_return_ _CRTIMP float __cdecl logf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl log10f(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl modff(_In_ float x, _Out_ float *y);
-_Check_return_ _CRTIMP float __cdecl powf(_In_ float b, _In_ float e);
-_Check_return_ _CRTIMP float __cdecl sinf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl sinhf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl sqrtf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl tanf(_In_ float x);
-_Check_return_ _CRTIMP float __cdecl tanhf(_In_ float x);
-#else
-#if defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_ARM))
+_Check_return_ float __cdecl _chgsignf(_In_ float x);
+_Check_return_ float __cdecl _copysignf(_In_ float x, _In_ float y);
+_Check_return_ float __cdecl _hypotf(_In_ float x, _In_ float y);
+_Check_return_ float __cdecl acosf(_In_ float x);
+_Check_return_ float __cdecl asinf(_In_ float x);
+_Check_return_ float __cdecl atanf(_In_ float x);
+_Check_return_ float __cdecl atan2f(_In_ float x, _In_ float y);
+_Check_return_ float __cdecl ceilf(_In_ float x);
+_Check_return_ float __cdecl cosf(_In_ float x);
+_Check_return_ float __cdecl coshf(_In_ float x);
+_Check_return_ float __cdecl expf(_In_ float x);
+_Check_return_ float __cdecl floorf(_In_ float x);
+_Check_return_ float __cdecl fmodf(_In_ float x, _In_ float y);
+_Check_return_ float __cdecl logf(_In_ float x);
+_Check_return_ float __cdecl log10f(_In_ float x);
+_Check_return_ float __cdecl modff(_In_ float x, _Out_ float *y);
+_Check_return_ float __cdecl powf(_In_ float b, _In_ float e);
+_Check_return_ float __cdecl sinf(_In_ float x);
+_Check_return_ float __cdecl sinhf(_In_ float x);
+_Check_return_ float __cdecl sqrtf(_In_ float x);
+_Check_return_ float __cdecl tanf(_In_ float x);
+_Check_return_ float __cdecl tanhf(_In_ float x);
+
+#if defined(_MSC_VER)
/* Make sure intrinsics don't get in our way */
-#pragma warning(suppress:4164) /* intrinsic not declared */
-#pragma
function(acosf,asinf,atanf,atan2f,ceilf,cosf,coshf,expf,floorf,fmodf,logf,log10f,log10f,powf,sinf,sinhf,sqrtf,tanf,tanhf)
+#if defined(_M_AMD64) || defined(_M_ARM)
+#pragma
function(acosf,asinf,atanf,atan2f,ceilf,cosf,coshf,expf,floorf,fmodf,logf,log10f,powf,sinf,sinhf,sqrtf,tanf,tanhf)
+#endif /* defined(_M_AMD64) || defined(_M_ARM) */
+#if (_MSC_VER >= 1920)
+#pragma function(_hypotf)
+#endif
#endif /* _MSC_VER */
+
+#if !defined(_CRTBLD)
_Check_return_ __CRT_INLINE float _chgsignf(_In_ float x) { return
(float)_chgsign((double)x); }
_Check_return_ __CRT_INLINE float _copysignf(_In_ float x, _In_ float y) { return
(float)_copysign((double)x, (double)y); }
_Check_return_ __CRT_INLINE float _hypotf(_In_ float x, _In_ float y) { return
(float)_hypot((double)x, (double)y); }
@@ -219,7 +233,8 @@ _Check_return_ __CRT_INLINE float sinhf(_In_ float x) { return
(float)sinh((doub
_Check_return_ __CRT_INLINE float sqrtf(_In_ float x) { return (float)sqrt((double)x); }
_Check_return_ __CRT_INLINE float tanf(_In_ float x) { return (float)tan((double)x); }
_Check_return_ __CRT_INLINE float tanhf(_In_ float x) { return (float)tanh((double)x); }
-#endif
+#endif /* !defined(_CRTBLD) */
+
_Check_return_ __CRT_INLINE double hypot(_In_ double x, _In_ double y) { return _hypot(x,
y); }
_Check_return_ __CRT_INLINE float hypotf(_In_ float x, _In_ float y) { return _hypotf(x,
y); }
_Check_return_ __CRT_INLINE float frexpf(_In_ float x, _Out_ int *y) { return
((float)frexp((double)x,y)); }
@@ -252,6 +267,12 @@ _Check_return_ __CRT_INLINE long double ldexpl(_In_ long double x,
_In_ int y) {
_Check_return_ __CRT_INLINE long double modfl(_In_ long double x, _Out_ long double *y) {
return (long double)modf((double)x, (double *)y); }
/* Support for some functions, not exported in MSVCRT */
+#if (_MSC_VER >= 1929)
+_Check_return_ long lrint(_In_ double x);
+_Check_return_ long lrintf(_In_ float x);
+_Check_return_ long lrintl(_In_ long double x);
+#pragma function(lrint, lrintf, lrintl)
+#endif
_Check_return_ __CRT_INLINE double round(_In_ double x) { return (x < 0) ? ceil(x -
0.5f) : floor(x + 0.5); }
_Check_return_ __CRT_INLINE float roundf(_In_ float x) { return (x < 0) ? ceilf(x -
0.5f) : floorf(x + 0.5); }
_Check_return_ __CRT_INLINE long double roundl(_In_ long double x) { return (x < 0) ?
ceill(x - 0.5f) : floorl(x + 0.5); }
diff --git a/sdk/include/crt/stdlib.h b/sdk/include/crt/stdlib.h
index 2d0af78e3a3..298b7ffad54 100644
--- a/sdk/include/crt/stdlib.h
+++ b/sdk/include/crt/stdlib.h
@@ -1440,6 +1440,10 @@ extern "C" {
__MINGW_EXTENSION _Check_return_ lldiv_t __cdecl lldiv(_In_ long long, _In_ long
long);
+#if defined(_MSC_VER)
+ _Check_return_ long long __cdecl llabs(_In_ long long _j);
+ #pragma function(llabs)
+#endif
__MINGW_EXTENSION __CRT_INLINE long long __cdecl llabs(_In_ long long _j) { return (_j
>= 0 ? _j : -_j); }
__MINGW_EXTENSION long long __cdecl strtoll(const char* __restrict__, char**
__restrict, int);