From b6bfaf5ab96eedfdfacba42c7601fa9a3a79f987 Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Sun, 19 Jan 2025 13:37:01 +0100 Subject: [PATCH] Check that __cpuid() is not a macro --- src/libsodium/sodium/runtime.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/libsodium/sodium/runtime.c b/src/libsodium/sodium/runtime.c index bd3cf5fc..bca57e9e 100644 --- a/src/libsodium/sodium/runtime.c +++ b/src/libsodium/sodium/runtime.c @@ -11,6 +11,9 @@ #ifdef HAVE_SYS_AUXV_H # include #endif +#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) +# include +#endif #include "private/common.h" #include "runtime.h" @@ -150,7 +153,13 @@ _sodium_runtime_arm_cpu_features(CPUFeatures * const cpu_features) static void _cpuid(unsigned int cpu_info[4U], const unsigned int cpu_info_type) { -#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) + /* + * Visual Studio has a __cpuid() intrinsic with 2 parameters, + * but clang defines _MSC_VER as an incompatible __cpuid() macro + * with 5 parameters, that may be defined if is + * unintentionally included. + */ +#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) && !defined(__cpuid) __cpuid((int *) cpu_info, cpu_info_type); #elif defined(HAVE_CPUID) cpu_info[0] = cpu_info[1] = cpu_info[2] = cpu_info[3] = 0;