aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/TargetInfo.cpp
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2011-10-06 16:49:54 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2011-10-06 16:49:54 +0000
commit744d90bfe2a43847764a707b1bee7ef1e30ad5f2 (patch)
tree2e4009307cedc3c7797d65e0c2331c0ebee4e350 /lib/CodeGen/TargetInfo.cpp
parente57ffac6326c20da8f688f937100c03e90b7fabe (diff)
CUDA: set proper calling conventions for PTX
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141296 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/TargetInfo.cpp')
-rw-r--r--lib/CodeGen/TargetInfo.cpp20
1 files changed, 13 insertions, 7 deletions
diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp
index 83e01132de..91802d3b3a 100644
--- a/lib/CodeGen/TargetInfo.cpp
+++ b/lib/CodeGen/TargetInfo.cpp
@@ -2774,8 +2774,9 @@ void PTXABIInfo::computeInfo(CGFunctionInfo &FI) const {
// Calling convention as default by an ABI.
llvm::CallingConv::ID DefaultCC;
- if (getContext().getLangOptions().OpenCL) {
- // If we are in OpenCL mode, then default to device functions
+ const LangOptions &LangOpts = getContext().getLangOptions();
+ if (LangOpts.OpenCL || LangOpts.CUDA) {
+ // If we are in OpenCL or CUDA mode, then default to device functions
DefaultCC = llvm::CallingConv::PTX_Device;
} else {
// If we are in standard C/C++ mode, use the triple to decide on the default
@@ -2805,19 +2806,24 @@ void PTXTargetCodeGenInfo::SetTargetAttributes(const Decl *D,
llvm::Function *F = cast<llvm::Function>(GV);
// Perform special handling in OpenCL mode
- if (M.getContext().getLangOptions().OpenCL) {
+ if (M.getLangOptions().OpenCL) {
// Use OpenCL function attributes to set proper calling conventions
// By default, all functions are device functions
- llvm::CallingConv::ID CC = llvm::CallingConv::PTX_Device;
if (FD->hasAttr<OpenCLKernelAttr>()) {
// OpenCL __kernel functions get a kernel calling convention
- CC = llvm::CallingConv::PTX_Kernel;
+ F->setCallingConv(llvm::CallingConv::PTX_Kernel);
// And kernel functions are not subject to inlining
F->addFnAttr(llvm::Attribute::NoInline);
}
+ }
- // Set the derived calling convention
- F->setCallingConv(CC);
+ // Perform special handling in CUDA mode.
+ if (M.getLangOptions().CUDA) {
+ // CUDA __global__ functions get a kernel calling convention. Since
+ // __global__ functions cannot be called from the device, we do not
+ // need to set the noinline attribute.
+ if (FD->getAttr<CUDAGlobalAttr>())
+ F->setCallingConv(llvm::CallingConv::PTX_Kernel);
}
}