diff --git a/dlls/msvcrt/except.c b/dlls/msvcrt/except.c index 5cf36fcba7b..c26054d3583 100644 --- a/dlls/msvcrt/except.c +++ b/dlls/msvcrt/except.c @@ -24,7 +24,9 @@ * * FIXME: Incomplete support for nested exceptions/try block cleanup. */ + #include "config.h" +#include "wine/port.h" #include "ntddk.h" #include "wine/exception.h" diff --git a/dlls/ntdll/critsection.c b/dlls/ntdll/critsection.c index 0233ef370de..34294c5e762 100644 --- a/dlls/ntdll/critsection.c +++ b/dlls/ntdll/critsection.c @@ -18,6 +18,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "config.h" +#include "wine/port.h" + #include #include #include @@ -29,108 +32,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(ntdll); WINE_DECLARE_DEBUG_CHANNEL(relay); -/* Define the atomic exchange/inc/dec functions. - * These are available in kernel32.dll already, - * but we don't want to import kernel32 from ntdll. - */ - -#ifdef __i386__ - -# ifdef __GNUC__ - -inline static PVOID interlocked_cmpxchg( PVOID *dest, PVOID xchg, PVOID compare ) -{ - PVOID ret; - __asm__ __volatile__( "lock; cmpxchgl %2,(%1)" - : "=a" (ret) : "r" (dest), "r" (xchg), "0" (compare) : "memory" ); - return ret; -} inline static LONG interlocked_inc( PLONG dest ) { - LONG ret; - __asm__ __volatile__( "lock; xaddl %0,(%1)" - : "=r" (ret) : "r" (dest), "0" (1) : "memory" ); - return ret + 1; + return interlocked_xchg_add( dest, 1 ) + 1; } + inline static LONG interlocked_dec( PLONG dest ) { - LONG ret; - __asm__ __volatile__( "lock; xaddl %0,(%1)" - : "=r" (ret) : "r" (dest), "0" (-1) : "memory" ); - return ret - 1; + return interlocked_xchg_add( dest, -1 ) - 1; } -# else /* __GNUC__ */ - -PVOID WINAPI interlocked_cmpxchg( PVOID *dest, PVOID xchg, PVOID compare ); -__ASM_GLOBAL_FUNC(interlocked_cmpxchg, - "movl 12(%esp),%eax\n\t" - "movl 8(%esp),%ecx\n\t" - "movl 4(%esp),%edx\n\t" - "lock; cmpxchgl %ecx,(%edx)\n\t" - "ret $12"); -LONG WINAPI interlocked_inc( PLONG dest ); -__ASM_GLOBAL_FUNC(interlocked_inc, - "movl 4(%esp),%edx\n\t" - "movl $1,%eax\n\t" - "lock; xaddl %eax,(%edx)\n\t" - "incl %eax\n\t" - "ret $4"); -LONG WINAPI interlocked_dec( PLONG dest ); -__ASM_GLOBAL_FUNC(interlocked_dec, - "movl 4(%esp),%edx\n\t" - "movl $-1,%eax\n\t" - "lock; xaddl %eax,(%edx)\n\t" - "decl %eax\n\t" - "ret $4"); -# endif /* __GNUC__ */ - -#elif defined(__sparc__) && defined(__sun__) -/* - * As the earlier Sparc processors lack necessary atomic instructions, - * I'm simply falling back to the library-provided _lwp_mutex routines - * to ensure mutual exclusion in a way appropriate for the current - * architecture. - * - * FIXME: If we have the compare-and-swap instruction (Sparc v9 and above) - * we could use this to speed up the Interlocked operations ... - */ -#include -static lwp_mutex_t interlocked_mutex = DEFAULTMUTEX; - -static PVOID interlocked_cmpxchg( PVOID *dest, PVOID xchg, PVOID compare ) -{ - _lwp_mutex_lock( &interlocked_mutex ); - if ( *dest == compare ) - *dest = xchg; - else - compare = *dest; - _lwp_mutex_unlock( &interlocked_mutex ); - return compare; -} - -static LONG interlocked_inc( PLONG dest ) -{ - LONG retv; - _lwp_mutex_lock( &interlocked_mutex ); - retv = ++*dest; - _lwp_mutex_unlock( &interlocked_mutex ); - return retv; -} - -static LONG interlocked_dec( PLONG dest ) -{ - LONG retv; - _lwp_mutex_lock( &interlocked_mutex ); - retv = --*dest; - _lwp_mutex_unlock( &interlocked_mutex ); - return retv; -} -#else -# error You must implement the interlocked* functions for your CPU -#endif - - /*********************************************************************** * get_semaphore */ @@ -141,8 +52,8 @@ static inline HANDLE get_semaphore( RTL_CRITICAL_SECTION *crit ) { HANDLE sem; if (NtCreateSemaphore( &sem, SEMAPHORE_ALL_ACCESS, NULL, 0, 1 )) return 0; - if (!(ret = (HANDLE)interlocked_cmpxchg( (PVOID *)&crit->LockSemaphore, - (PVOID)sem, 0 ))) + if (!(ret = (HANDLE)interlocked_cmpxchg_ptr( (PVOID *)&crit->LockSemaphore, + (PVOID)sem, 0 ))) ret = sem; else NtClose(sem); /* somebody beat us to it */ @@ -270,7 +181,7 @@ NTSTATUS WINAPI RtlEnterCriticalSection( RTL_CRITICAL_SECTION *crit ) BOOL WINAPI RtlTryEnterCriticalSection( RTL_CRITICAL_SECTION *crit ) { BOOL ret = FALSE; - if (interlocked_cmpxchg( (PVOID *)&crit->LockCount, (PVOID)0L, (PVOID)-1L ) == (PVOID)-1L) + if (interlocked_cmpxchg( &crit->LockCount, 0L, -1 ) == -1) { crit->OwningThread = GetCurrentThreadId(); crit->RecursionCount = 1; diff --git a/dlls/ntdll/debugtools.c b/dlls/ntdll/debugtools.c index 35a5f737ca3..013e48529f1 100644 --- a/dlls/ntdll/debugtools.c +++ b/dlls/ntdll/debugtools.c @@ -31,7 +31,6 @@ #include "winbase.h" #include "winnt.h" #include "ntddk.h" -#include "wtypes.h" #include "msvcrt/excpt.h" WINE_DECLARE_DEBUG_CHANNEL(tid); diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index 9e0b45587a0..f936b77a258 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -20,6 +20,7 @@ */ #include "config.h" +#include "wine/port.h" #include #include diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index dd9bc68620a..5098b2f0228 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -21,6 +21,7 @@ #ifdef __i386__ #include "config.h" +#include "wine/port.h" #include #include diff --git a/dlls/winedos/int31.c b/dlls/winedos/int31.c index c4e1d49e83a..9dcc21f8642 100644 --- a/dlls/winedos/int31.c +++ b/dlls/winedos/int31.c @@ -19,6 +19,7 @@ */ #include "config.h" +#include "wine/port.h" #include "windef.h" #include "wine/winbase16.h" diff --git a/include/wine/port.h b/include/wine/port.h index b7e0dc0a3a9..56d5d26a7b3 100644 --- a/include/wine/port.h +++ b/include/wine/port.h @@ -200,6 +200,92 @@ extern int wine_dlclose( void *handle, char *error, int errorsize ); #define RTLD_GLOBAL 0x100 #endif +/* Interlocked functions */ + +#if defined(__i386__) && defined(__GNUC__) + +inline static long interlocked_cmpxchg( long *dest, long xchg, long compare ) +{ + long ret; + __asm__ __volatile__( "lock; cmpxchgl %2,(%1)" + : "=a" (ret) : "r" (dest), "r" (xchg), "0" (compare) : "memory" ); + return ret; +} + +inline static void *interlocked_cmpxchg_ptr( void **dest, void *xchg, void *compare ) +{ + void *ret; + __asm__ __volatile__( "lock; cmpxchgl %2,(%1)" + : "=a" (ret) : "r" (dest), "r" (xchg), "0" (compare) : "memory" ); + return ret; +} + +inline static long interlocked_xchg( long *dest, long val ) +{ + long ret; + __asm__ __volatile__( "lock; xchgl %0,(%1)" + : "=r" (ret) : "r" (dest), "0" (val) : "memory" ); + return ret; +} + +inline static void *interlocked_xchg_ptr( void **dest, void *val ) +{ + void *ret; + __asm__ __volatile__( "lock; xchgl %0,(%1)" + : "=r" (ret) : "r" (dest), "0" (val) : "memory" ); + return ret; +} + +inline static long interlocked_xchg_add( long *dest, long incr ) +{ + long ret; + __asm__ __volatile__( "lock; xaddl %0,(%1)" + : "=r" (ret) : "r" (dest), "0" (incr) : "memory" ); + return ret; +} + +#else /* __i386___ && __GNUC__ */ + +extern long interlocked_cmpxchg( long *dest, long xchg, long compare ); +extern void *interlocked_cmpxchg_ptr( void **dest, void *xchg, void *compare ); +extern long interlocked_xchg( long *dest, long val ); +extern void *interlocked_xchg_ptr( void **dest, void *val ); +extern long interlocked_xchg_add( long *dest, long incr ); + +#endif /* __i386___ && __GNUC__ */ + +/* Macros to define assembler functions somewhat portably */ + +#ifdef NEED_UNDERSCORE_PREFIX +# define __ASM_NAME(name) "_" name +#else +# define __ASM_NAME(name) name +#endif + +#ifdef NEED_TYPE_IN_DEF +# define __ASM_FUNC(name) ".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef" +#else +# define __ASM_FUNC(name) ".type " __ASM_NAME(name) ",@function" +#endif + +#ifdef __GNUC__ +# define __ASM_GLOBAL_FUNC(name,code) \ + __asm__( ".align 4\n\t" \ + ".globl " __ASM_NAME(#name) "\n\t" \ + __ASM_FUNC(#name) "\n" \ + __ASM_NAME(#name) ":\n\t" \ + code ); +#else /* __GNUC__ */ +# define __ASM_GLOBAL_FUNC(name,code) \ + void __asm_dummy_##name(void) { \ + asm( ".align 4\n\t" \ + ".globl " __ASM_NAME(#name) "\n\t" \ + __ASM_FUNC(#name) "\n" \ + __ASM_NAME(#name) ":\n\t" \ + code ); \ + } +#endif /* __GNUC__ */ + /* Macros to access unaligned or wrong-endian WORDs and DWORDs. */ diff --git a/include/winnt.h b/include/winnt.h index f701d86ca9e..481f3dd333e 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -1120,36 +1120,6 @@ typedef CONTEXT *PCONTEXT; /* Macros to retrieve the current context */ -#ifdef NEED_UNDERSCORE_PREFIX -# define __ASM_NAME(name) "_" name -#else -# define __ASM_NAME(name) name -#endif - -#ifdef NEED_TYPE_IN_DEF -# define __ASM_FUNC(name) ".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef" -#else -# define __ASM_FUNC(name) ".type " __ASM_NAME(name) ",@function" -#endif - -#ifdef __GNUC__ -# define __ASM_GLOBAL_FUNC(name,code) \ - __asm__( ".align 4\n\t" \ - ".globl " __ASM_NAME(#name) "\n\t" \ - __ASM_FUNC(#name) "\n" \ - __ASM_NAME(#name) ":\n\t" \ - code ); -#else /* __GNUC__ */ -# define __ASM_GLOBAL_FUNC(name,code) \ - void __asm_dummy_##name(void) { \ - asm( ".align 4\n\t" \ - ".globl " __ASM_NAME(#name) "\n\t" \ - __ASM_FUNC(#name) "\n" \ - __ASM_NAME(#name) ":\n\t" \ - code ); \ - } -#endif /* __GNUC__ */ - #ifdef __i386__ #define _DEFINE_REGS_ENTRYPOINT( name, fn, args ) \ diff --git a/library/port.c b/library/port.c index 9d46554b3f8..64f8149b603 100644 --- a/library/port.c +++ b/library/port.c @@ -738,3 +738,103 @@ char *gcvt (double number, size_t ndigit, char *buff) return buff; } #endif /* HAVE_ECVT */ + + +/*********************************************************************** + * interlocked functions + */ +#ifdef __i386__ + +__ASM_GLOBAL_FUNC(interlocked_cmpxchg, + "movl 12(%esp),%eax\n\t" + "movl 8(%esp),%ecx\n\t" + "movl 4(%esp),%edx\n\t" + "lock; cmpxchgl %ecx,(%edx)\n\t" + "ret"); +__ASM_GLOBAL_FUNC(interlocked_cmpxchg_ptr, + "movl 12(%esp),%eax\n\t" + "movl 8(%esp),%ecx\n\t" + "movl 4(%esp),%edx\n\t" + "lock; cmpxchgl %ecx,(%edx)\n\t" + "ret"); +__ASM_GLOBAL_FUNC(interlocked_xchg, + "movl 8(%esp),%eax\n\t" + "movl 4(%esp),%edx\n\t" + "lock; xchgl %eax,(%edx)\n\t" + "ret"); +__ASM_GLOBAL_FUNC(interlocked_xchg_ptr, + "movl 8(%esp),%eax\n\t" + "movl 4(%esp),%edx\n\t" + "lock; xchgl %eax,(%edx)\n\t" + "ret"); +__ASM_GLOBAL_FUNC(interlocked_xchg_add, + "movl 8(%esp),%eax\n\t" + "movl 4(%esp),%edx\n\t" + "lock; xaddl %eax,(%edx)\n\t" + "ret"); + +#elif defined(__sparc__) && defined(__sun__) + +/* + * As the earlier Sparc processors lack necessary atomic instructions, + * I'm simply falling back to the library-provided _lwp_mutex routines + * to ensure mutual exclusion in a way appropriate for the current + * architecture. + * + * FIXME: If we have the compare-and-swap instruction (Sparc v9 and above) + * we could use this to speed up the Interlocked operations ... + */ +#include +static lwp_mutex_t interlocked_mutex = DEFAULTMUTEX; + +long interlocked_cmpxchg( long *dest, long xchg, long compare ) +{ + _lwp_mutex_lock( &interlocked_mutex ); + if (*dest == compare) *dest = xchg; + else compare = *dest; + _lwp_mutex_unlock( &interlocked_mutex ); + return compare; +} + +void *interlocked_cmpxchg_ptr( void **dest, void *xchg, void *compare ) +{ + _lwp_mutex_lock( &interlocked_mutex ); + if (*dest == compare) *dest = xchg; + else compare = *dest; + _lwp_mutex_unlock( &interlocked_mutex ); + return compare; +} + +long interlocked_xchg( long *dest, long val ) +{ + long retv; + _lwp_mutex_lock( &interlocked_mutex ); + retv = *dest; + *dest = val; + _lwp_mutex_unlock( &interlocked_mutex ); + return retv; +} + +void *interlocked_xchg_ptr( void **dest, void *val ) +{ + long retv; + _lwp_mutex_lock( &interlocked_mutex ); + retv = *dest; + *dest = val; + _lwp_mutex_unlock( &interlocked_mutex ); + return retv; +} + +long interlocked_xchg_add( long *dest, long incr ) +{ + long retv; + _lwp_mutex_lock( &interlocked_mutex ); + retv = *dest; + *dest += incr; + _lwp_mutex_unlock( &interlocked_mutex ); + return retv; +} + +#else +# error You must implement the interlocked* functions for your CPU +#endif diff --git a/memory/selector.c b/memory/selector.c index 132ba4c1091..d52989b126d 100644 --- a/memory/selector.c +++ b/memory/selector.c @@ -19,6 +19,7 @@ */ #include "config.h" +#include "wine/port.h" #include diff --git a/relay32/relay386.c b/relay32/relay386.c index 03f5f28da1c..671061d4914 100644 --- a/relay32/relay386.c +++ b/relay32/relay386.c @@ -18,8 +18,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - #include "config.h" +#include "wine/port.h" #include #include diff --git a/relay32/snoop.c b/relay32/snoop.c index 17aa3ebb778..d9215b6c81d 100644 --- a/relay32/snoop.c +++ b/relay32/snoop.c @@ -19,6 +19,7 @@ */ #include "config.h" +#include "wine/port.h" #include #include diff --git a/scheduler/critsection.c b/scheduler/critsection.c index 617e18eebc9..20a17ca3cd6 100644 --- a/scheduler/critsection.c +++ b/scheduler/critsection.c @@ -19,6 +19,7 @@ */ #include "config.h" +#include "wine/port.h" #include #include @@ -150,35 +151,14 @@ __ASM_GLOBAL_FUNC(InterlockedDecrement, "decl %eax\n\t" "ret $4"); -#elif defined(__sparc__) && defined(__sun__) - -/* - * As the earlier Sparc processors lack necessary atomic instructions, - * I'm simply falling back to the library-provided _lwp_mutex routines - * to ensure mutual exclusion in a way appropriate for the current - * architecture. - * - * FIXME: If we have the compare-and-swap instruction (Sparc v9 and above) - * we could use this to speed up the Interlocked operations ... - */ - -#include -static lwp_mutex_t interlocked_mutex = DEFAULTMUTEX; +#else /* __i386__ */ /*********************************************************************** * InterlockedCompareExchange (KERNEL32.@) */ LONG WINAPI InterlockedCompareExchange( PLONG dest, LONG xchg, LONG compare ) { - _lwp_mutex_lock( &interlocked_mutex ); - - if ( *dest == compare ) - *dest = xchg; - else - compare = *dest; - - _lwp_mutex_unlock( &interlocked_mutex ); - return compare; + return interlocked_cmpxchg( dest, xchg, compare ); } /*********************************************************************** @@ -186,14 +166,7 @@ LONG WINAPI InterlockedCompareExchange( PLONG dest, LONG xchg, LONG compare ) */ LONG WINAPI InterlockedExchange( PLONG dest, LONG val ) { - LONG retv; - _lwp_mutex_lock( &interlocked_mutex ); - - retv = *dest; - *dest = val; - - _lwp_mutex_unlock( &interlocked_mutex ); - return retv; + return interlocked_xchg( dest, val ); } /*********************************************************************** @@ -201,14 +174,7 @@ LONG WINAPI InterlockedExchange( PLONG dest, LONG val ) */ LONG WINAPI InterlockedExchangeAdd( PLONG dest, LONG incr ) { - LONG retv; - _lwp_mutex_lock( &interlocked_mutex ); - - retv = *dest; - *dest += incr; - - _lwp_mutex_unlock( &interlocked_mutex ); - return retv; + return interlocked_xchg_add( dest, incr ); } /*********************************************************************** @@ -216,13 +182,7 @@ LONG WINAPI InterlockedExchangeAdd( PLONG dest, LONG incr ) */ LONG WINAPI InterlockedIncrement( PLONG dest ) { - LONG retv; - _lwp_mutex_lock( &interlocked_mutex ); - - retv = ++*dest; - - _lwp_mutex_unlock( &interlocked_mutex ); - return retv; + return interlocked_xchg_add( dest, 1 ) + 1; } /*********************************************************************** @@ -230,15 +190,7 @@ LONG WINAPI InterlockedIncrement( PLONG dest ) */ LONG WINAPI InterlockedDecrement( PLONG dest ) { - LONG retv; - _lwp_mutex_lock( &interlocked_mutex ); - - retv = --*dest; - - _lwp_mutex_unlock( &interlocked_mutex ); - return retv; + return interlocked_xchg_add( dest, -1 ) - 1; } -#else -#error You must implement the Interlocked* functions for your CPU -#endif +#endif /* __i386__ */ diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h index 1842b9c3783..5cce3c95163 100644 --- a/tools/winebuild/build.h +++ b/tools/winebuild/build.h @@ -23,66 +23,13 @@ #ifndef __WINE_BUILD_H #define __WINE_BUILD_H -#ifndef __WINE_CONFIG_H -# error You must include config.h to use this header -#endif +#ifndef __WINE_CONFIG_H +# error You must include config.h to use this header +#endif #include #include #include -#ifdef HAVE_DIRECT_H -# include -#endif -#ifdef HAVE_IO_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif - -#if !defined(HAVE_POPEN) && defined(HAVE__POPEN) -#define popen _popen -#endif - -#if !defined(HAVE_PCLOSE) && defined(HAVE__PCLOSE) -#define pclose _pclose -#endif - -#if !defined(HAVE_STRNCASECMP) && defined(HAVE__STRNICMP) -# define strncasecmp _strnicmp -#endif - -#if !defined(HAVE_STRCASECMP) && defined(HAVE__STRICMP) -# define strcasecmp _stricmp -#endif - -#define PUT_WORD(ptr, w) (*(WORD *)(ptr) = (w)) -#define PUT_LE_WORD(ptr, w) \ - do { ((BYTE *)(ptr))[0] = LOBYTE(w); \ - ((BYTE *)(ptr))[1] = HIBYTE(w); } while (0) -#define PUT_BE_WORD(ptr, w) \ - do { ((BYTE *)(ptr))[1] = LOBYTE(w); \ - ((BYTE *)(ptr))[0] = HIBYTE(w); } while (0) - -#if defined(ALLOW_UNALIGNED_ACCESS) -#define PUT_UA_WORD(ptr, w) PUT_WORD(ptr, w) -#elif defined(WORDS_BIGENDIAN) -#define PUT_UA_WORD(ptr, w) PUT_BE_WORD(ptr, w) -#else -#define PUT_UA_WORD(ptr, w) PUT_LE_WORD(ptr, w) -#endif - -#ifdef NEED_UNDERSCORE_PREFIX -# define __ASM_NAME(name) "_" name -#else -# define __ASM_NAME(name) name -#endif - -#ifdef NEED_TYPE_IN_DEF -# define __ASM_FUNC(name) ".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef" -#else -# define __ASM_FUNC(name) ".type " __ASM_NAME(name) ",@function" -#endif #ifdef NEED_UNDERSCORE_PREFIX # define PREFIX "_" diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index 10ae35e7f98..c16d6f2108e 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -20,6 +20,7 @@ */ #include "config.h" +#include "wine/port.h" #include #include diff --git a/tools/winebuild/main.c b/tools/winebuild/main.c index 4eb9fb29645..01d63197517 100644 --- a/tools/winebuild/main.c +++ b/tools/winebuild/main.c @@ -23,6 +23,7 @@ */ #include "config.h" +#include "wine/port.h" #include #include diff --git a/tools/winebuild/parser.c b/tools/winebuild/parser.c index 78b9bcfc22a..0f9811dce42 100644 --- a/tools/winebuild/parser.c +++ b/tools/winebuild/parser.c @@ -23,6 +23,7 @@ */ #include "config.h" +#include "wine/port.h" #include #include diff --git a/tools/winebuild/relay.c b/tools/winebuild/relay.c index 6d4e5e5daa3..6332543c17e 100644 --- a/tools/winebuild/relay.c +++ b/tools/winebuild/relay.c @@ -23,6 +23,7 @@ */ #include "config.h" +#include "wine/port.h" #include diff --git a/tools/winebuild/res16.c b/tools/winebuild/res16.c index 047cc986b6b..b91ffa3fbf7 100644 --- a/tools/winebuild/res16.c +++ b/tools/winebuild/res16.c @@ -19,6 +19,7 @@ */ #include "config.h" +#include "wine/port.h" #include #include diff --git a/tools/winebuild/res32.c b/tools/winebuild/res32.c index a295e6ba27d..ed4a38aa0f0 100644 --- a/tools/winebuild/res32.c +++ b/tools/winebuild/res32.c @@ -19,6 +19,7 @@ */ #include "config.h" +#include "wine/port.h" #include #include diff --git a/tools/winebuild/spec16.c b/tools/winebuild/spec16.c index e84150f1b0b..23d990f1049 100644 --- a/tools/winebuild/spec16.c +++ b/tools/winebuild/spec16.c @@ -23,6 +23,7 @@ */ #include "config.h" +#include "wine/port.h" #include #include diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c index 5bf55da6c39..7bfd39d31c7 100644 --- a/tools/winebuild/spec32.c +++ b/tools/winebuild/spec32.c @@ -23,6 +23,7 @@ */ #include "config.h" +#include "wine/port.h" #include #include diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c index 5f8cfa68bca..0d9b6aae3fb 100644 --- a/tools/winebuild/utils.c +++ b/tools/winebuild/utils.c @@ -19,6 +19,7 @@ */ #include "config.h" +#include "wine/port.h" #include #include diff --git a/windows/winproc.c b/windows/winproc.c index fb7a559219c..3fa6fb05ef6 100644 --- a/windows/winproc.c +++ b/windows/winproc.c @@ -20,6 +20,7 @@ */ #include "config.h" +#include "wine/port.h" #include