[clang] [clang] Fallback to C calling convention for sycl_kernel attribute (PR #161349)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 30 15:54:26 PDT 2025
https://github.com/camc updated https://github.com/llvm/llvm-project/pull/161349
>From acaf93238a19bfbe6b6e1a6be59673691564305d Mon Sep 17 00:00:00 2001
From: camc <pushy-crop-cartel at duck.com>
Date: Tue, 30 Sep 2025 10:22:42 +0000
Subject: [PATCH 1/2] [clang] Fallback to C callingconv for sycl_kernel
attribute. (#GH161077)
---
clang/docs/ReleaseNotes.rst | 1 +
clang/lib/CodeGen/TargetInfo.cpp | 3 ++-
clang/test/CodeGen/sycl-kernel.c | 5 +++++
3 files changed, 8 insertions(+), 1 deletion(-)
create mode 100644 clang/test/CodeGen/sycl-kernel.c
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index e8deae50e4cb0..74580b77353d5 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -397,6 +397,7 @@ Bug Fixes to Attribute Support
- Using ``[[gnu::cleanup(some_func)]]`` where some_func is annotated with
``[[gnu::error("some error")]]`` now correctly triggers an error. (#GH146520)
- Fix a crash when the function name is empty in the `swift_name` attribute. (#GH157075)
+- Fix a crash when the ``sycl_kernel`` attribute is used while not compiling OpenCL (#GH161077).
Bug Fixes to C++ Support
^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp
index 1e58c3f217812..4ff847f4f6ff6 100644
--- a/clang/lib/CodeGen/TargetInfo.cpp
+++ b/clang/lib/CodeGen/TargetInfo.cpp
@@ -123,8 +123,9 @@ unsigned TargetCodeGenInfo::getDeviceKernelCallingConv() const {
// conventions; different targets might split structs passed as values
// to multiple function arguments etc.
return llvm::CallingConv::SPIR_KERNEL;
+ } else {
+ return llvm::CallingConv::C;
}
- llvm_unreachable("Unknown kernel calling convention");
}
void TargetCodeGenInfo::setOCLKernelStubCallingConvention(
diff --git a/clang/test/CodeGen/sycl-kernel.c b/clang/test/CodeGen/sycl-kernel.c
new file mode 100644
index 0000000000000..77410e5a216ff
--- /dev/null
+++ b/clang/test/CodeGen/sycl-kernel.c
@@ -0,0 +1,5 @@
+// RUN: %clang_cc1 -emit-llvm %s -o /dev/null
+
+__attribute__((sycl_kernel)) void foo(int *ret) {
+ *ret = 1;
+}
>From 31efdd2449637fbb9d21ddbadbe09bb22301f7ff Mon Sep 17 00:00:00 2001
From: c <c>
Date: Tue, 30 Sep 2025 22:54:15 +0000
Subject: [PATCH 2/2] Ignore device_kernel when not compiling OpenCL or CUDA
---
clang/docs/ReleaseNotes.rst | 2 +-
clang/lib/CodeGen/TargetInfo.cpp | 3 +--
clang/lib/Sema/SemaDeclAttr.cpp | 4 +++-
clang/lib/Sema/SemaType.cpp | 2 +-
4 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 74580b77353d5..e02509da7b06a 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -397,7 +397,7 @@ Bug Fixes to Attribute Support
- Using ``[[gnu::cleanup(some_func)]]`` where some_func is annotated with
``[[gnu::error("some error")]]`` now correctly triggers an error. (#GH146520)
- Fix a crash when the function name is empty in the `swift_name` attribute. (#GH157075)
-- Fix a crash when the ``sycl_kernel`` attribute is used while not compiling OpenCL (#GH161077).
+- Fix a crash when ``device_kernel`` attributes are used outside OpenCL/CUDA (#GH161077).
Bug Fixes to C++ Support
^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp
index 4ff847f4f6ff6..1e58c3f217812 100644
--- a/clang/lib/CodeGen/TargetInfo.cpp
+++ b/clang/lib/CodeGen/TargetInfo.cpp
@@ -123,9 +123,8 @@ unsigned TargetCodeGenInfo::getDeviceKernelCallingConv() const {
// conventions; different targets might split structs passed as values
// to multiple function arguments etc.
return llvm::CallingConv::SPIR_KERNEL;
- } else {
- return llvm::CallingConv::C;
}
+ llvm_unreachable("Unknown kernel calling convention");
}
void TargetCodeGenInfo::setOCLKernelStubCallingConvention(
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index a8dfa4d7df2d5..74fd5d89f3db7 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -5204,7 +5204,9 @@ static void handleCallConvAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
static void handleDeviceKernelAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
const auto *FD = dyn_cast_or_null<FunctionDecl>(D);
bool IsFunctionTemplate = FD && FD->getDescribedFunctionTemplate();
- if (S.getLangOpts().SYCLIsDevice) {
+ if (!S.getLangOpts().OpenCL && !S.getLangOpts().CUDA) {
+ S.Diag(AL.getLoc(), diag::warn_attribute_ignored) << AL;
+ } else if (S.getLangOpts().SYCLIsDevice) {
if (!IsFunctionTemplate) {
S.Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type_str)
<< AL << AL.isRegularKeywordAttribute() << "function templates";
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index bee613aa5f1c5..aaa92b238376c 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -3780,7 +3780,7 @@ static CallingConv getCCForDeclaratorChunk(
}
}
}
- if (!S.getLangOpts().isSYCL()) {
+ if (S.getLangOpts().OpenCL || S.getLangOpts().CUDA) {
for (const ParsedAttr &AL : D.getDeclSpec().getAttributes()) {
if (AL.getKind() == ParsedAttr::AT_DeviceKernel) {
CC = CC_DeviceKernel;
More information about the cfe-commits
mailing list