nasm/config/msvc.h
H. Peter Anvin (Intel) e2f38a8aed 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 <intrin.h>, 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
  <stdlib.h>, 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 <stdint.h>'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>
2026-07-07 12:57:50 -07:00

229 lines
6.1 KiB
C

/* SPDX-License-Identifier: BSD-2-Clause */
/* Copyright 2016 The NASM Authors - All Rights Reserved */
/*
* config/msvc.h
*
* Compiler definitions for Microsoft Visual C++;
* instead of unconfig.h. See config.h.in for the
* variables which can be defined here.
*
* MSDN seems to have information back to Visual Studio 2003, so aim
* for compatibility that far back.
*
* Relevant _MSC_VER values:
* 1310 - Visual Studio 2003
* 1400 - Visual Studio 2005
* 1500 - Visual Studio 2008
* 1600 - Visual Studio 2010
* 1700 - Visual Studio 2012
* 1800 - Visual Studio 2013
* 1900 - Visual Studio 2015
* 1910 - Visual Studio 2017
*/
#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 <intrin.h>
#endif
/* Define to 1 if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H 1
/* Define to 1 if you have the <inttypes.h> header file. */
#if _MSC_VER >= 1800
# define HAVE_INTTYPES_H 1
#endif
/* Define to 1 if you have the <intrin.h> header file. */
#if _MSC_VER >= 1400
# define HAVE_INTRIN_H 1
#endif
/* Define to 1 if you have the <io.h> header file. */
#define HAVE_IO_H 1
/* Define to 1 if you have the <stdarg.h> header file. */
#define HAVE_STDARG_H 1
/* Define to 1 if you have the <stdint.h> header file. */
#if _MSC_VER >= 1600
# define HAVE_STDINT_H 1
#endif
/* Define to 1 if you have the <stdio.h> header file. */
#define HAVE_STDIO_H 1
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <wchar.h> header file. */
#define HAVE_WCHAR_H 1
/* Define to 1 if you have the `access' function. */
#define HAVE_ACCESS 1
#if _MSC_VER < 1400
# define access _access
#endif
/* Define to 1 if you have the `fileno' function. */
#define HAVE_FILENO 1
#if _MSC_VER < 1400
# 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
# define snprintf _snprintf
#endif
/* Define to 1 if you have the `_chsize' function. */
#define HAVE__CHSIZE 1
/* Define to 1 if you have the `_chsize_s' function. */
#if _MSC_VER >= 1400
# define HAVE__CHSIZE_S 1
#endif
/* 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
/* Define to 1 if you have the `_fullpath' function. */
#define HAVE__FULLPATH 1
/* Define to 1 if the system has the type `struct _stati64'. */
#define HAVE_STRUCT__STATI64
/* Define to 1 if you have the `_stati64' function. */
#define HAVE__STATI64 1
/* Define to 1 if you have the `_fstati64' function. */
#define HAVE__FSTATI64 1
/* Define to 1 if stdbool.h conforms to C99. */
#if _MSC_VER >= 1800
# define HAVE_STDBOOL_H 1
#endif
/* Define to 1 if you have the `stricmp' function. */
#define HAVE_STRICMP 1
/* Define to 1 if you have the declaration of `stricmp', and to 0 if you
don't. */
#define HAVE_DECL_STRICMP 1
#if _MSC_VER < 1400
# define stricmp _stricmp
#endif
/* Define to 1 if you have the `strnicmp' function. */
#define HAVE_STRNICMP 1
/* Define to 1 if you have the declaration of `strnicmp', and to 0 if you
don't. */
#define HAVE_DECL_STRNICMP 1
#if _MSC_VER < 1400
# define strnicmp _strnicmp
#endif
#if _MSC_VER >= 1400
/* Define to 1 if you have the `strnlen' function. */
# define HAVE_STRNLEN 1
/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
don't. */
# define HAVE_DECL_STRNLEN 1
#endif
/* Define to 1 if the system has the type `uintptr_t'. */
#if _MSC_VER >= 1900
# define HAVE_UINTPTR_T 1
#else
/* Define to the type of an unsigned integer type wide enough to hold a
pointer, if such a type exists, and if the system does not define it. */
# 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 <stdint.h> and <inttypes.h>
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
# define vsnprint _vsnprintf
#endif
/* Define to 1 if the system has the type `_Bool'. */
#if _MSC_VER >= 1900
# define HAVE__BOOL 1
#endif
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Define to 1 if your processor stores words with the least significant byte
first (like Intel and VAX, unlike Motorola and SPARC). */
#define WORDS_LITTLEENDIAN 1
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#define inline __inline
/* Define to the equivalent of the C99 'restrict' keyword, or to
nothing if this is not supported. Do not define if restrict is
supported directly. */
#if _MSC_VER >= 1700
#define restrict __restrict
#else
#define restrict
#endif
#endif /* NASM_CONFIG_MSVC_H */