From e2f38a8aedd91d8511ebf3968208fb6c6cb80862 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin (Intel)" Date: Tue, 7 Jul 2026 12:57:50 -0700 Subject: [PATCH] config/msvc.h: fill in gaps versus configure.ac/config.h.in Cross-referenced configure.ac's AC_CHECK_HEADERS/AC_CHECK_FUNCS/PA_* tests (as materialized into config/config.h.in) against config/msvc.h and added definitions for macros MSVC actually supports: - HAVE_STDARG_H, HAVE_STDIO_H, HAVE_WCHAR_H: always present. - HAVE_STDINT_H: available starting with Visual Studio 2010 (_MSC_VER >= 1600). - HAVE_INTRIN_H plus an #include , gated on Visual Studio 2005 (_MSC_VER >= 1400) when the header was introduced. - HAVE_ISCNTRL: always present. - HAVE_ISASCII plus '#define isascii __isascii', since MSVC only provides the underscore-prefixed spelling. - HAVE__BYTESWAP_USHORT/_ULONG/_UINT64: always present, declared in , matching the names PA_FIND_FUNC probes for in autoconf/m4/pa_endian.m4. - HAVE__BITSCANREVERSE (>=1400) and HAVE__BITSCANREVERSE64 (>=1400 and only on _M_X64/_M_ARM64, since the 64-bit intrinsic does not exist on 32-bit x86). - HAVE_UNSIGNED_LONG_LONG_INT: always present. - HAVE_UINTMAX_T, gated on '#ifdef HAVE_STDINT_H' rather than a separate version check, with a textual 'unsigned long long' fallback for uintmax_t otherwise; gating strictly on HAVE_STDINT_H avoids the fallback macro clobbering 's own uintmax_t typedef when both would otherwise be available. Deliberately left out anything that is POSIX/GNU/BSD-only or does not exist verbatim on MSVC (strcasecmp/strsep/strlcpy/mempcpy, getuid/ getrlimit/realpath, GCC __builtin_*/attribute probes, byteswap.h/ endian.h family, C23 stdbit.h, etc.), since compiler.h and the relevant call sites already handle those cases separately for MSVC. Verified with x86_64-w64-mingw32-gcc -fsyntax-only using manually defined _MSC_VER/_M_X64/_M_ARM64 across Visual Studio versions 1310/1400/1600/1800/1929 (mingw-w64 declares the same intrinsics in the expected headers), then confirmed end-to-end with a real MSVC (cl.exe/nmake) build in CI. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- config/msvc.h | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/config/msvc.h b/config/msvc.h index b4f6a913d..45c23e982 100644 --- a/config/msvc.h +++ b/config/msvc.h @@ -25,6 +25,12 @@ #ifndef NASM_CONFIG_MSVC_H #define NASM_CONFIG_MSVC_H +/* Needed for the _BitScanReverse()/_BitScanReverse64() intrinsics below; + not available prior to Visual Studio 2005. */ +#if _MSC_VER >= 1400 +# include +#endif + /* Define to 1 if you have the header file. */ #define HAVE_FCNTL_H 1 @@ -33,9 +39,25 @@ # define HAVE_INTTYPES_H 1 #endif +/* Define to 1 if you have the header file. */ +#if _MSC_VER >= 1400 +# define HAVE_INTRIN_H 1 +#endif + /* Define to 1 if you have the header file. */ #define HAVE_IO_H 1 +/* Define to 1 if you have the header file. */ +#define HAVE_STDARG_H 1 + +/* Define to 1 if you have the header file. */ +#if _MSC_VER >= 1600 +# define HAVE_STDINT_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#define HAVE_STDIO_H 1 + /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 @@ -48,6 +70,9 @@ /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 +/* Define to 1 if you have the header file. */ +#define HAVE_WCHAR_H 1 + /* Define to 1 if you have the `access' function. */ #define HAVE_ACCESS 1 #if _MSC_VER < 1400 @@ -60,6 +85,13 @@ # define fileno _fileno #endif +/* Define to 1 if you have the `isascii' function. */ +#define HAVE_ISASCII 1 +#define isascii __isascii + +/* Define to 1 if you have the `iscntrl' function. */ +#define HAVE_ISCNTRL 1 + /* Define to 1 if you have the `snprintf' function. */ #define HAVE_SNPRINTF 1 #if _MSC_VER < 1900 @@ -77,6 +109,25 @@ /* Define to 1 if you have the `_filelengthi64' function. */ #define HAVE__FILELENGTHI64 1 +/* Define to 1 if you have the `_byteswap_ushort' intrinsic function. */ +#define HAVE__BYTESWAP_USHORT 1 + +/* Define to 1 if you have the `_byteswap_ulong' intrinsic function. */ +#define HAVE__BYTESWAP_ULONG 1 + +/* Define to 1 if you have the `_byteswap_uint64' intrinsic function. */ +#define HAVE__BYTESWAP_UINT64 1 + +/* Define to 1 if you have the `_BitScanReverse' intrinsic function. */ +#if _MSC_VER >= 1400 +# define HAVE__BITSCANREVERSE 1 +#endif + +/* Define to 1 if you have the `_BitScanReverse64' intrinsic function. */ +#if (defined(_M_X64) || defined(_M_ARM64)) && _MSC_VER >= 1400 +# define HAVE__BITSCANREVERSE64 1 +#endif + /* Define to 1 if you have the `_fseeki64' function. */ #define HAVE__FSEEKI64 1 @@ -132,6 +183,18 @@ # define uintptr_t size_t #endif +/* Define to 1 if the system has the type `uintmax_t'. */ +#ifdef HAVE_STDINT_H +# define HAVE_UINTMAX_T 1 +#else +/* Define to the widest unsigned integer type if and + do not define. */ +# define uintmax_t unsigned long long +#endif + +/* Define to 1 if the system has the type `unsigned long long int'. */ +#define HAVE_UNSIGNED_LONG_LONG_INT 1 + /* Define to 1 if you have the `vsnprintf' function. */ #define HAVE_VSNPRINTF 1 #if _MSC_VER < 1400