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

Reply via email to