Clang doesn't define `__GNUC__` in MSVC compatibility mode, but it still provides the functionality typically associated with it.
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..8e4a0ac65d4 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__) +#if defined(__i386__) && (defined(__GNUC__) || defined(__clang__)) __asm__( "sidtl %0" : "=m" (ret) ); #else ret.base = (BYTE *)idt;
From: Jacek Caban jacek@codeweavers.com
--- dlls/ntdll/large_int.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/ntdll/large_int.c b/dlls/ntdll/large_int.c index 0973888d654..3ef3aa70dd9 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__) +#if defined(__i386__) && (defined(__GNUC__) || defined(__clang__)) UINT ret, rem;
__asm__("divl %4"
From: Jacek Caban jacek@codeweavers.com
--- dlls/ntdll/signal_i386.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index 4446a9b1f3d..22364938ae4 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -215,7 +215,7 @@ void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len ) */ static inline void save_fpu( CONTEXT *context ) { -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) struct { DWORD ControlWord; @@ -247,7 +247,7 @@ static inline void save_fpu( CONTEXT *context ) */ static inline void save_fpux( CONTEXT *context ) { -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) /* we have to enforce alignment by hand */ char buffer[sizeof(XSAVE_FORMAT) + 16]; XSAVE_FORMAT *state = (XSAVE_FORMAT *)(((ULONG_PTR)buffer + 15) & ~15);
From: Jacek Caban jacek@codeweavers.com
--- dlls/ntdll/tests/exception.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c index 025923b7d8e..25f83ee5a8f 100644 --- a/dlls/ntdll/tests/exception.c +++ b/dlls/ntdll/tests/exception.c @@ -1072,7 +1072,7 @@ 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__ +#if defined(__GNUC__) || defined(__clang__) unsigned int flags; __asm__("pushfl; popl %0; cld" : "=r" (flags) ); /* older windows versions don't clear DF properly so don't test */ @@ -3175,7 +3175,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__ +#if defined(__GNUC__) || defined(__clang__) __asm__ volatile( "pushfq; andl $~0x40000,(%rsp); popfq" ); #endif ok (context->EFlags & 0x40000, "eflags has AC bit unset\n"); @@ -3199,7 +3199,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__ +#if defined(__GNUC__) || defined(__clang__) ULONG_PTR flags; __asm__("pushfq; popq %0; cld" : "=r" (flags) ); /* older windows versions don't clear DF properly so don't test */ @@ -5199,7 +5199,7 @@ static void test_KiUserExceptionDispatcher(void) test_kiuserexceptiondispatcher_saved_r12 = ctx.R12; ctx.R12 = (ULONG64)0xdeadbeeffeedcafe;
-#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) /* Spoil r12 value to make sure it doesn't come from the current userspace registers. */ __asm__ volatile("movq $0xdeadcafe, %%r12" : : : "%r12"); #endif @@ -10014,7 +10014,7 @@ static DWORD test_extended_context_handler(EXCEPTION_RECORD *rec, EXCEPTION_REGI }
done: -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) __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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/ntoskrnl.exe/instr.c b/dlls/ntoskrnl.exe/instr.c index 20fce992fcc..5af24eed0d1 100644 --- a/dlls/ntoskrnl.exe/instr.c +++ b/dlls/ntoskrnl.exe/instr.c @@ -64,7 +64,7 @@ static LDT_ENTRY idt[256]; static inline struct idtr get_idtr(void) { struct idtr ret; -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) __asm__( "sidtl %0" : "=m" (ret) ); #else ret.base = (BYTE *)idt;
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 747705f94e2..86a3f8b5950 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(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) /* This code gives identical results to Win32 on Intel. * Here we use fp exceptions to catch overflows when storing the value. */
This breaks the arm64ec build, because several places lack the required `&& !defined(__arm64ec__)`.
On Tue Jul 1 20:02:22 2025 +0000, Alexandre Julliard wrote:
This breaks the arm64ec build, because several places lack the required `&& !defined(__arm64ec__)`.
I missed that, sorry about that. Fixed in the new version.