https://github.com/vossjannik updated https://github.com/llvm/llvm-project/pull/154946
>From ffb2d85fe3eb672b157008e18f58b9a5eaeb18de Mon Sep 17 00:00:00 2001 From: Jannik Voss <[email protected]> Date: Mon, 7 Jul 2025 21:49:22 +0200 Subject: [PATCH] [BuiltinsX86] Use long long for the __int64 MS intrinsics Microsoft declares _Interlocked*64, _xgetbv and _xsetbv with __int64, which is long long on every target. BuiltinsX86.td used int64_t and uint64_t, which are long on LP64, so declaring them as Microsoft does fails there: error: conflicting types for '_InterlockedIncrement64' Use long long int and unsigned long long int, as __emul does. --- clang/include/clang/Basic/BuiltinsX86.td | 20 ++++++++++---------- clang/test/Sema/ms-x86-builtins-int64-lp64.c | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 clang/test/Sema/ms-x86-builtins-int64-lp64.c diff --git a/clang/include/clang/Basic/BuiltinsX86.td b/clang/include/clang/Basic/BuiltinsX86.td index 94204fdc3fd77..c3680e21513f4 100644 --- a/clang/include/clang/Basic/BuiltinsX86.td +++ b/clang/include/clang/Basic/BuiltinsX86.td @@ -739,7 +739,7 @@ let Features = "xsave", Attributes = [NoThrow] in { } let Header = "immintrin.h", Languages = "ALL_MS_LANGUAGES", Attributes = [NoThrow, RequireDeclaration] in { - def _xgetbv : X86LibBuiltin<"uint64_t(unsigned int)">; + def _xgetbv : X86LibBuiltin<"unsigned long long int(unsigned int)">; } let Features = "xsave", Attributes = [NoThrow] in { @@ -747,7 +747,7 @@ let Features = "xsave", Attributes = [NoThrow] in { } let Header = "immintrin.h", Languages = "ALL_MS_LANGUAGES", Attributes = [NoThrow, RequireDeclaration] in { - def _xsetbv : X86LibBuiltin<"void(unsigned int, uint64_t)">; + def _xsetbv : X86LibBuiltin<"void(unsigned int, unsigned long long int)">; } let Features = "xsaveopt", Attributes = [NoThrow] in { @@ -4475,14 +4475,14 @@ let Features = "sha512", Attributes = [NoThrow, RequiredVectorWidth<256>] in { } let Header = "intrin.h", Languages = "ALL_MS_LANGUAGES", Attributes = [NoThrow, RequireDeclaration] in { - def _InterlockedAnd64 : X86LibBuiltin<"int64_t(int64_t volatile *, int64_t)">; - def _InterlockedDecrement64 : X86LibBuiltin<"int64_t(int64_t volatile *)">; - def _InterlockedExchange64 : X86LibBuiltin<"int64_t(int64_t volatile *, int64_t)">; - def _InterlockedExchangeAdd64 : X86LibBuiltin<"int64_t(int64_t volatile *, int64_t)">; - def _InterlockedExchangeSub64 : X86LibBuiltin<"int64_t(int64_t volatile *, int64_t)">; - def _InterlockedIncrement64 : X86LibBuiltin<"int64_t(int64_t volatile *)">; - def _InterlockedOr64 : X86LibBuiltin<"int64_t(int64_t volatile *, int64_t)">; - def _InterlockedXor64 : X86LibBuiltin<"int64_t(int64_t volatile *, int64_t)">; + def _InterlockedAnd64 : X86LibBuiltin<"long long int(long long int volatile *, long long int)">; + def _InterlockedDecrement64 : X86LibBuiltin<"long long int(long long int volatile *)">; + def _InterlockedExchange64 : X86LibBuiltin<"long long int(long long int volatile *, long long int)">; + def _InterlockedExchangeAdd64 : X86LibBuiltin<"long long int(long long int volatile *, long long int)">; + def _InterlockedExchangeSub64 : X86LibBuiltin<"long long int(long long int volatile *, long long int)">; + def _InterlockedIncrement64 : X86LibBuiltin<"long long int(long long int volatile *)">; + def _InterlockedOr64 : X86LibBuiltin<"long long int(long long int volatile *, long long int)">; + def _InterlockedXor64 : X86LibBuiltin<"long long int(long long int volatile *, long long int)">; } let Features = "sm3", Attributes = [NoThrow, RequiredVectorWidth<128>] in { diff --git a/clang/test/Sema/ms-x86-builtins-int64-lp64.c b/clang/test/Sema/ms-x86-builtins-int64-lp64.c new file mode 100644 index 0000000000000..33ebf0eba26d4 --- /dev/null +++ b/clang/test/Sema/ms-x86-builtins-int64-lp64.c @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -triple x86_64-linux-gnu -fms-extensions -fsyntax-only -verify %s +// RUN: %clang_cc1 -triple x86_64-pc-windows-msvc -fms-extensions -fsyntax-only -verify %s +// expected-no-diagnostics + +// intrin0.h and xsaveintrin.h declare these intrinsics with __int64, which is +// 'long long' on every target. The builtin types must match: int64_t is 'long' +// on LP64 targets such as x86_64-linux-gnu, where a mismatch makes each +// declaration below a "conflicting types" error. + +__int64 _InterlockedAnd64(__int64 volatile *, __int64); +__int64 _InterlockedDecrement64(__int64 volatile *); +__int64 _InterlockedExchange64(__int64 volatile *, __int64); +__int64 _InterlockedExchangeAdd64(__int64 volatile *, __int64); +__int64 _InterlockedExchangeSub64(__int64 volatile *, __int64); +__int64 _InterlockedIncrement64(__int64 volatile *); +__int64 _InterlockedOr64(__int64 volatile *, __int64); +__int64 _InterlockedXor64(__int64 volatile *, __int64); +unsigned __int64 _xgetbv(unsigned int); +void _xsetbv(unsigned int, unsigned __int64); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
