[clang] [clang] Use TargetInfo to determine device kernel calling convention (PR #144728)
Nick Sarnie via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 18 11:31:00 PDT 2025
https://github.com/sarnex updated https://github.com/llvm/llvm-project/pull/144728
>From da1523ec3b68d3d2a23f502df779c7e3f54320d0 Mon Sep 17 00:00:00 2001
From: "Sarnie, Nick" <nick.sarnie at intel.com>
Date: Wed, 18 Jun 2025 08:33:25 -0700
Subject: [PATCH 1/2] [clang][NFCI] Use TargetInfo to determine device kernel
calling convention
Signed-off-by: Sarnie, Nick <nick.sarnie at intel.com>
---
clang/lib/CodeGen/CGCall.cpp | 13 ++-----------
clang/lib/CodeGen/TargetInfo.cpp | 8 ++++----
clang/lib/CodeGen/TargetInfo.h | 4 ++--
clang/lib/CodeGen/Targets/AMDGPU.cpp | 4 ++--
clang/lib/CodeGen/Targets/NVPTX.cpp | 2 +-
clang/lib/CodeGen/Targets/SPIR.cpp | 4 ++--
6 files changed, 13 insertions(+), 22 deletions(-)
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index a06455d25b1ef..fd75de42515da 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -83,17 +83,8 @@ unsigned CodeGenTypes::ClangCallConvToLLVMCallConv(CallingConv CC) {
return llvm::CallingConv::AArch64_SVE_VectorCall;
case CC_SpirFunction:
return llvm::CallingConv::SPIR_FUNC;
- case CC_DeviceKernel: {
- if (CGM.getLangOpts().OpenCL)
- return CGM.getTargetCodeGenInfo().getOpenCLKernelCallingConv();
- if (CGM.getTriple().isSPIROrSPIRV())
- return llvm::CallingConv::SPIR_KERNEL;
- if (CGM.getTriple().isAMDGPU())
- return llvm::CallingConv::AMDGPU_KERNEL;
- if (CGM.getTriple().isNVPTX())
- return llvm::CallingConv::PTX_Kernel;
- llvm_unreachable("Unknown kernel calling convention");
- }
+ case CC_DeviceKernel:
+ return CGM.getTargetCodeGenInfo().getDeviceKernelCallingConv();
case CC_PreserveMost:
return llvm::CallingConv::PreserveMost;
case CC_PreserveAll:
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp
index f3df92c44bb6b..bc771c45951b3 100644
--- a/clang/lib/CodeGen/TargetInfo.cpp
+++ b/clang/lib/CodeGen/TargetInfo.cpp
@@ -103,11 +103,11 @@ TargetCodeGenInfo::getDependentLibraryOption(llvm::StringRef Lib,
Opt += Lib;
}
-unsigned TargetCodeGenInfo::getOpenCLKernelCallingConv() const {
- // OpenCL kernels are called via an explicit runtime API with arguments
- // set with clSetKernelArg(), not as normal sub-functions.
+unsigned TargetCodeGenInfo::getDeviceKernelCallingConv() const {
+ // Device kernels are called via an explicit runtime API with arguments,
+ // such as set with clSetKernelArg() for OpenCL, not as normal sub-functions.
// Return SPIR_KERNEL by default as the kernel calling convention to
- // ensure the fingerprint is fixed such way that each OpenCL argument
+ // ensure the fingerprint is fixed such way that each kernel argument
// gets one matching argument in the produced kernel function argument
// list to enable feasible implementation of clSetKernelArg() with
// aggregates etc. In case we would use the default C calling conv here,
diff --git a/clang/lib/CodeGen/TargetInfo.h b/clang/lib/CodeGen/TargetInfo.h
index 2783e222eb802..b4057d369f988 100644
--- a/clang/lib/CodeGen/TargetInfo.h
+++ b/clang/lib/CodeGen/TargetInfo.h
@@ -298,8 +298,8 @@ class TargetCodeGenInfo {
llvm::StringRef Value,
llvm::SmallString<32> &Opt) const {}
- /// Get LLVM calling convention for OpenCL kernel.
- virtual unsigned getOpenCLKernelCallingConv() const;
+ /// Get LLVM calling convention for device kernels.
+ virtual unsigned getDeviceKernelCallingConv() const;
/// Get target specific null pointer.
/// \param T is the LLVM type of the null pointer.
diff --git a/clang/lib/CodeGen/Targets/AMDGPU.cpp b/clang/lib/CodeGen/Targets/AMDGPU.cpp
index 8660373c3927f..47a552a7bf495 100644
--- a/clang/lib/CodeGen/Targets/AMDGPU.cpp
+++ b/clang/lib/CodeGen/Targets/AMDGPU.cpp
@@ -304,7 +304,7 @@ class AMDGPUTargetCodeGenInfo : public TargetCodeGenInfo {
void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
CodeGen::CodeGenModule &M) const override;
- unsigned getOpenCLKernelCallingConv() const override;
+ unsigned getDeviceKernelCallingConv() const override;
llvm::Constant *getNullPointer(const CodeGen::CodeGenModule &CGM,
llvm::PointerType *T, QualType QT) const override;
@@ -431,7 +431,7 @@ void AMDGPUTargetCodeGenInfo::setTargetAttributes(
F->addFnAttr("amdgpu-ieee", "false");
}
-unsigned AMDGPUTargetCodeGenInfo::getOpenCLKernelCallingConv() const {
+unsigned AMDGPUTargetCodeGenInfo::getDeviceKernelCallingConv() const {
return llvm::CallingConv::AMDGPU_KERNEL;
}
diff --git a/clang/lib/CodeGen/Targets/NVPTX.cpp b/clang/lib/CodeGen/Targets/NVPTX.cpp
index ad802c9131de0..82bdfe2666b52 100644
--- a/clang/lib/CodeGen/Targets/NVPTX.cpp
+++ b/clang/lib/CodeGen/Targets/NVPTX.cpp
@@ -78,7 +78,7 @@ class NVPTXTargetCodeGenInfo : public TargetCodeGenInfo {
return true;
}
- unsigned getOpenCLKernelCallingConv() const override {
+ unsigned getDeviceKernelCallingConv() const override {
return llvm::CallingConv::PTX_Kernel;
}
diff --git a/clang/lib/CodeGen/Targets/SPIR.cpp b/clang/lib/CodeGen/Targets/SPIR.cpp
index 2f1e43cdc8cc3..afa23bffcd073 100644
--- a/clang/lib/CodeGen/Targets/SPIR.cpp
+++ b/clang/lib/CodeGen/Targets/SPIR.cpp
@@ -51,7 +51,7 @@ class CommonSPIRTargetCodeGenInfo : public TargetCodeGenInfo {
getABIInfo().getDataLayout().getAllocaAddrSpace());
}
- unsigned getOpenCLKernelCallingConv() const override;
+ unsigned getDeviceKernelCallingConv() const override;
llvm::Type *getOpenCLType(CodeGenModule &CGM, const Type *T) const override;
llvm::Type *
getHLSLType(CodeGenModule &CGM, const Type *Ty,
@@ -219,7 +219,7 @@ void computeSPIRKernelABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI) {
}
}
-unsigned CommonSPIRTargetCodeGenInfo::getOpenCLKernelCallingConv() const {
+unsigned CommonSPIRTargetCodeGenInfo::getDeviceKernelCallingConv() const {
return llvm::CallingConv::SPIR_KERNEL;
}
>From 039b159b8149a53cb3ed2acc23b414133cfad14d Mon Sep 17 00:00:00 2001
From: "Sarnie, Nick" <nick.sarnie at intel.com>
Date: Wed, 18 Jun 2025 11:28:27 -0700
Subject: [PATCH 2/2] rework base class behavior
Signed-off-by: Sarnie, Nick <nick.sarnie at intel.com>
---
clang/lib/CodeGen/TargetInfo.cpp | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp
index bc771c45951b3..277d69daf493c 100644
--- a/clang/lib/CodeGen/TargetInfo.cpp
+++ b/clang/lib/CodeGen/TargetInfo.cpp
@@ -104,17 +104,20 @@ TargetCodeGenInfo::getDependentLibraryOption(llvm::StringRef Lib,
}
unsigned TargetCodeGenInfo::getDeviceKernelCallingConv() const {
- // Device kernels are called via an explicit runtime API with arguments,
- // such as set with clSetKernelArg() for OpenCL, not as normal sub-functions.
- // Return SPIR_KERNEL by default as the kernel calling convention to
- // ensure the fingerprint is fixed such way that each kernel argument
- // gets one matching argument in the produced kernel function argument
- // list to enable feasible implementation of clSetKernelArg() with
- // aggregates etc. In case we would use the default C calling conv here,
- // clSetKernelArg() might break depending on the target-specific
- // conventions; different targets might split structs passed as values
- // to multiple function arguments etc.
- return llvm::CallingConv::SPIR_KERNEL;
+ if (getABIInfo().getContext().getLangOpts().OpenCL) {
+ // Device kernels are called via an explicit runtime API with arguments,
+ // such as set with clSetKernelArg() for OpenCL, not as normal
+ // sub-functions. Return SPIR_KERNEL by default as the kernel calling
+ // convention to ensure the fingerprint is fixed such way that each kernel
+ // argument gets one matching argument in the produced kernel function
+ // argument list to enable feasible implementation of clSetKernelArg() with
+ // aggregates etc. In case we would use the default C calling conv here,
+ // clSetKernelArg() might break depending on the target-specific
+ // conventions; different targets might split structs passed as values
+ // to multiple function arguments etc.
+ return llvm::CallingConv::SPIR_KERNEL;
+ }
+ llvm_unreachable("Unknown kernel calling convention");
}
void TargetCodeGenInfo::setOCLKernelStubCallingConvention(
More information about the cfe-commits
mailing list