https://github.com/AlexVlx updated 
https://github.com/llvm/llvm-project/pull/152023

>From e33787e50ac261d09aa9bcc7b9e25b162abb00d6 Mon Sep 17 00:00:00 2001
From: Alex Voicu <alexandru.vo...@amd.com>
Date: Mon, 4 Aug 2025 21:08:56 +0100
Subject: [PATCH 1/2] Prevent spurious CC clashes.

---
 clang/lib/Sema/SemaExprCXX.cpp                |  7 +++++
 ...v-implicit-alloc-function-calling-conv.hip | 26 +++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 
clang/test/SemaHIP/amdgcnspirv-implicit-alloc-function-calling-conv.hip

diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 0edfd6015cbd9..5b9cd65c52099 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -3497,6 +3497,13 @@ void 
Sema::DeclareGlobalAllocationFunction(DeclarationName Name,
   }
 
   auto CreateAllocationFunctionDecl = [&](Attr *ExtraAttr) {
+    // The MSVC STL has explicit cdecl on its (host-side) allocation function
+    // specializations for the allocation, so in order to prevent a CC clash
+    // we set cdecl on the host-side implicit decls, knowing these do not get
+    // emitted when compiling for device.
+    if (getLangOpts().CUDAIsDevice && ExtraAttr && isa<CUDAHostAttr>(ExtraAttr)
+        && Context.getTargetInfo().getTriple().isSPIRV())
+      EPI.ExtInfo = EPI.ExtInfo.withCallingConv(CallingConv::CC_C);
     QualType FnType = Context.getFunctionType(Return, Params, EPI);
     FunctionDecl *Alloc = FunctionDecl::Create(
         Context, GlobalCtx, SourceLocation(), SourceLocation(), Name, FnType,
diff --git 
a/clang/test/SemaHIP/amdgcnspirv-implicit-alloc-function-calling-conv.hip 
b/clang/test/SemaHIP/amdgcnspirv-implicit-alloc-function-calling-conv.hip
new file mode 100644
index 0000000000000..7e87a904054ce
--- /dev/null
+++ b/clang/test/SemaHIP/amdgcnspirv-implicit-alloc-function-calling-conv.hip
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 %s -fcuda-is-device -std=c++17 -triple spirv32 -verify
+// RUN: %clang_cc1 %s -fcuda-is-device -std=c++17 -triple spirv64 -verify
+// RUN: %clang_cc1 %s -fcuda-is-device -std=c++17 -triple spirv64-amd-amdhsa 
-verify
+
+// expected-no-diagnostics
+
+namespace std
+{
+    enum class align_val_t : __SIZE_TYPE__ {};
+    struct nothrow_t { explicit nothrow_t() = default; };
+    extern nothrow_t const nothrow;
+}
+
+void* __attribute__((cdecl)) operator new(__SIZE_TYPE__);
+void* __attribute__((cdecl)) operator new[](__SIZE_TYPE__);
+void* __attribute__((cdecl)) operator new(__SIZE_TYPE__, ::std::align_val_t);
+void* __attribute__((cdecl)) operator new[](__SIZE_TYPE__, ::std::align_val_t);
+
+void __attribute__((cdecl)) operator delete(void*) noexcept;
+void __attribute__((cdecl)) operator delete[](void*) noexcept;
+void __attribute__((cdecl)) operator delete(void*, __SIZE_TYPE__) noexcept;
+void __attribute__((cdecl)) operator delete[](void*, __SIZE_TYPE__) noexcept;
+void __attribute__((cdecl)) operator delete(void*, ::std::align_val_t) 
noexcept;
+void __attribute__((cdecl)) operator delete[](void*, ::std::align_val_t) 
noexcept;
+void __attribute__((cdecl)) operator delete(void*, __SIZE_TYPE__, 
::std::align_val_t) noexcept;
+void __attribute__((cdecl)) operator delete[](void*, __SIZE_TYPE__, 
::std::align_val_t) noexcept;

>From 1deb1be3e8dec354be5b83aa58c7c830d9268c9c Mon Sep 17 00:00:00 2001
From: Alex Voicu <alexandru.vo...@amd.com>
Date: Mon, 4 Aug 2025 21:21:21 +0100
Subject: [PATCH 2/2] Fix formatting.

---
 clang/lib/Sema/SemaExprCXX.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 5b9cd65c52099..8884f34a6f71b 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -3501,8 +3501,9 @@ void 
Sema::DeclareGlobalAllocationFunction(DeclarationName Name,
     // specializations for the allocation, so in order to prevent a CC clash
     // we set cdecl on the host-side implicit decls, knowing these do not get
     // emitted when compiling for device.
-    if (getLangOpts().CUDAIsDevice && ExtraAttr && isa<CUDAHostAttr>(ExtraAttr)
-        && Context.getTargetInfo().getTriple().isSPIRV())
+    if (getLangOpts().CUDAIsDevice && ExtraAttr &&
+        isa<CUDAHostAttr>(ExtraAttr) &&
+        Context.getTargetInfo().getTriple().isSPIRV())
       EPI.ExtInfo = EPI.ExtInfo.withCallingConv(CallingConv::CC_C);
     QualType FnType = Context.getFunctionType(Return, Params, EPI);
     FunctionDecl *Alloc = FunctionDecl::Create(

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to