Clang doesn't define `__GNUC__` in MSVC compatibility mode, but it still provides the functionality typically associated with it.
-- v2: oleaut32: Remove __GNUC__ check. ntoskrnl: Remove __GNUC__ check. ntdll/tests: Remove __GNUC__ checks. ntdll: Remove __GNUC__ checks. krnl386: Remove __GNUC__ check.
From: Jacek Caban jacek@codeweavers.com
--- dlls/krnl386.exe16/instr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/krnl386.exe16/instr.c b/dlls/krnl386.exe16/instr.c index 666ef71363f..dc577f702d9 100644 --- a/dlls/krnl386.exe16/instr.c +++ b/dlls/krnl386.exe16/instr.c @@ -72,7 +72,7 @@ static LDT_ENTRY idt[256]; static inline struct idtr get_idtr(void) { struct idtr ret; -#if defined(__i386__) && defined(__GNUC__) +#ifdef __i386__ __asm__( "sidtl %0" : "=m" (ret) ); #else ret.base = (BYTE *)idt;
From: Jacek Caban jacek@codeweavers.com
--- dlls/ntdll/large_int.c | 2 +- dlls/ntdll/signal_i386.c | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-)
diff --git a/dlls/ntdll/large_int.c b/dlls/ntdll/large_int.c index 0973888d654..283651c7e15 100644 --- a/dlls/ntdll/large_int.c +++ b/dlls/ntdll/large_int.c @@ -256,7 +256,7 @@ ULONGLONG WINAPI RtlEnlargedUnsignedMultiply( UINT a, UINT b ) */ UINT WINAPI RtlEnlargedUnsignedDivide( ULONGLONG a, UINT b, UINT *remptr ) { -#if defined(__i386__) && defined(__GNUC__) +#ifdef __i386__ UINT ret, rem;
__asm__("divl %4" diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index 4446a9b1f3d..a55e50df178 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -215,7 +215,6 @@ void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len ) */ static inline void save_fpu( CONTEXT *context ) { -#ifdef __GNUC__ struct { DWORD ControlWord; @@ -236,7 +235,6 @@ static inline void save_fpu( CONTEXT *context ) float_status.StatusWord &= float_status.ControlWord | 0xffffff80;
__asm__ __volatile__( "fldenv %0" : : "m" (float_status) ); -#endif }
@@ -247,7 +245,6 @@ static inline void save_fpu( CONTEXT *context ) */ static inline void save_fpux( CONTEXT *context ) { -#ifdef __GNUC__ /* we have to enforce alignment by hand */ char buffer[sizeof(XSAVE_FORMAT) + 16]; XSAVE_FORMAT *state = (XSAVE_FORMAT *)(((ULONG_PTR)buffer + 15) & ~15); @@ -255,7 +252,6 @@ static inline void save_fpux( CONTEXT *context ) context->ContextFlags |= CONTEXT_EXTENDED_REGISTERS; __asm__ __volatile__( "fxsave %0" : "=m" (*state) ); memcpy( context->ExtendedRegisters, state, sizeof(*state) ); -#endif }
From: Jacek Caban jacek@codeweavers.com
--- dlls/ntdll/tests/exception.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c index 00c428e5071..6717831a212 100644 --- a/dlls/ntdll/tests/exception.c +++ b/dlls/ntdll/tests/exception.c @@ -1072,12 +1072,10 @@ static const BYTE direction_flag_code[] = { static DWORD direction_flag_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame, CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher ) { -#ifdef __GNUC__ unsigned int flags; __asm__("pushfl; popl %0; cld" : "=r" (flags) ); /* older windows versions don't clear DF properly so don't test */ if (flags & 0x400) trace( "eflags has DF bit set\n" ); -#endif ok( context->EFlags & 0x400, "context eflags has DF bit cleared\n" ); got_exception++; context->Eip++; /* skip cli */ @@ -3175,7 +3173,7 @@ static const BYTE align_check_code[] = static DWORD WINAPI align_check_handler( EXCEPTION_RECORD *rec, ULONG64 frame, CONTEXT *context, DISPATCHER_CONTEXT *dispatcher ) { -#ifdef __GNUC__ +#ifndef __arm64ec__ __asm__ volatile( "pushfq; andl $~0x40000,(%rsp); popfq" ); #endif ok (context->EFlags & 0x40000, "eflags has AC bit unset\n"); @@ -3199,7 +3197,7 @@ static const BYTE direction_flag_code[] = static DWORD WINAPI direction_flag_handler( EXCEPTION_RECORD *rec, ULONG64 frame, CONTEXT *context, DISPATCHER_CONTEXT *dispatcher ) { -#ifdef __GNUC__ +#ifndef __arm64ec__ ULONG_PTR flags; __asm__("pushfq; popq %0; cld" : "=r" (flags) ); /* older windows versions don't clear DF properly so don't test */ @@ -5199,7 +5197,7 @@ static void test_KiUserExceptionDispatcher(void) test_kiuserexceptiondispatcher_saved_r12 = ctx.R12; ctx.R12 = (ULONG64)0xdeadbeeffeedcafe;
-#ifdef __GNUC__ +#ifndef __arm64ec__ /* Spoil r12 value to make sure it doesn't come from the current userspace registers. */ __asm__ volatile("movq $0xdeadcafe, %%r12" : : : "%r12"); #endif @@ -10124,7 +10122,7 @@ static DWORD test_extended_context_handler(EXCEPTION_RECORD *rec, EXCEPTION_REGI }
done: -#ifdef __GNUC__ +#ifndef __arm64ec__ __asm__ volatile("vmovups (%0),%%ymm0" : : "r"(test_extended_context_spoil_data2)); #endif #ifdef __x86_64__
From: Jacek Caban jacek@codeweavers.com
--- dlls/ntoskrnl.exe/instr.c | 5 ----- 1 file changed, 5 deletions(-)
diff --git a/dlls/ntoskrnl.exe/instr.c b/dlls/ntoskrnl.exe/instr.c index 20fce992fcc..03f48152b94 100644 --- a/dlls/ntoskrnl.exe/instr.c +++ b/dlls/ntoskrnl.exe/instr.c @@ -64,12 +64,7 @@ static LDT_ENTRY idt[256]; static inline struct idtr get_idtr(void) { struct idtr ret; -#ifdef __GNUC__ __asm__( "sidtl %0" : "=m" (ret) ); -#else - ret.base = (BYTE *)idt; - ret.limit = sizeof(idt) - 1; -#endif return ret; }
From: Jacek Caban jacek@codeweavers.com
--- dlls/oleaut32/vartype.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/oleaut32/vartype.c b/dlls/oleaut32/vartype.c index f9ca5b39306..9fad7485a2d 100644 --- a/dlls/oleaut32/vartype.c +++ b/dlls/oleaut32/vartype.c @@ -3496,7 +3496,7 @@ HRESULT WINAPI VarCyFromR4(FLOAT fltIn, CY* pCyOut) */ HRESULT WINAPI VarCyFromR8(DOUBLE dblIn, CY* pCyOut) { -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +#if defined(__i386__) || (defined(__x86_64__) && !defined(__arm64ec__)) /* This code gives identical results to Win32 on Intel. * Here we use fp exceptions to catch overflows when storing the value. */
On Fri Jul 18 20:16:28 2025 +0000, Alexandre Julliard wrote:
You never pushed the new version... But I think we might just as well get rid of the `__GNUC__` checks, these dlls won't build with MSVC anyway.
I must have messed up a push, updated now. Removing those checks sounds good to me. I wasn't sure about the test, but I removed that too. MSVC doesn't define GNU-style target macros anyway.
On Fri Jul 18 21:30:51 2025 +0000, Jacek Caban wrote:
I must have messed up a push, updated now. Removing those checks sounds good to me. I wasn't sure about the test, but I removed that too. MSVC doesn't define GNU-style target macros anyway.
MSVC doesn't, [but we do.](https://gitlab.winehq.org/wine/wine/-/blob/master/include/minwindef.h?ref_ty...)
(Though there's no corresponding __x86_64__ define.)