99#include " ABIInfoImpl.h"
1010#include " TargetInfo.h"
1111#include " llvm/ADT/STLExtras.h"
12+ #include " llvm/IR/CallingConv.h"
1213#include " llvm/IR/IntrinsicsNVPTX.h"
1314
1415using namespace clang ;
@@ -79,13 +80,11 @@ class NVPTXTargetCodeGenInfo : public TargetCodeGenInfo {
7980 // Adds a NamedMDNode with GV, Name, and Operand as operands, and adds the
8081 // resulting MDNode to the nvvm.annotations MDNode.
8182 static void addNVVMMetadata (llvm::GlobalValue *GV, StringRef Name,
82- int Operand,
83- const SmallVectorImpl<int > &GridConstantArgs);
83+ int Operand);
8484
85- static void addNVVMMetadata (llvm::GlobalValue *GV, StringRef Name,
86- int Operand) {
87- addNVVMMetadata (GV, Name, Operand, SmallVector<int , 1 >(0 ));
88- }
85+ static void
86+ addGridConstantNVVMMetadata (llvm::GlobalValue *GV,
87+ const SmallVectorImpl<int > &GridConstantArgs);
8988
9089private:
9190 static void emitBuiltinSurfTexDeviceCopy (CodeGenFunction &CGF, LValue Dst,
@@ -259,7 +258,7 @@ void NVPTXTargetCodeGenInfo::setTargetAttributes(
259258 if (FD->hasAttr <OpenCLKernelAttr>()) {
260259 // OpenCL __kernel functions get kernel metadata
261260 // Create !{<func-ref>, metadata !"kernel", i32 1} node
262- addNVVMMetadata (F, " kernel " , 1 );
261+ F-> setCallingConv (llvm::CallingConv::PTX_Kernel );
263262 // And kernel functions are not subject to inlining
264263 F->addFnAttr (llvm::Attribute::NoInline);
265264 }
@@ -277,21 +276,21 @@ void NVPTXTargetCodeGenInfo::setTargetAttributes(
277276 // For some reason arg indices are 1-based in NVVM
278277 GCI.push_back (IV.index () + 1 );
279278 // Create !{<func-ref>, metadata !"kernel", i32 1} node
280- addNVVMMetadata (F, " kernel" , 1 , GCI);
279+ F->setCallingConv (llvm::CallingConv::PTX_Kernel);
280+ addGridConstantNVVMMetadata (F, GCI);
281281 }
282282 if (CUDALaunchBoundsAttr *Attr = FD->getAttr <CUDALaunchBoundsAttr>())
283283 M.handleCUDALaunchBoundsAttr (F, Attr);
284284 }
285285
286286 // Attach kernel metadata directly if compiling for NVPTX.
287287 if (FD->hasAttr <NVPTXKernelAttr>()) {
288- addNVVMMetadata (F, " kernel " , 1 );
288+ F-> setCallingConv (llvm::CallingConv::PTX_Kernel );
289289 }
290290}
291291
292- void NVPTXTargetCodeGenInfo::addNVVMMetadata (
293- llvm::GlobalValue *GV, StringRef Name, int Operand,
294- const SmallVectorImpl<int > &GridConstantArgs) {
292+ void NVPTXTargetCodeGenInfo::addNVVMMetadata (llvm::GlobalValue *GV,
293+ StringRef Name, int Operand) {
295294 llvm::Module *M = GV->getParent ();
296295 llvm::LLVMContext &Ctx = M->getContext ();
297296
@@ -302,6 +301,21 @@ void NVPTXTargetCodeGenInfo::addNVVMMetadata(
302301 llvm::ConstantAsMetadata::get (GV), llvm::MDString::get (Ctx, Name),
303302 llvm::ConstantAsMetadata::get (
304303 llvm::ConstantInt::get (llvm::Type::getInt32Ty (Ctx), Operand))};
304+
305+ // Append metadata to nvvm.annotations
306+ MD->addOperand (llvm::MDNode::get (Ctx, MDVals));
307+ }
308+
309+ void NVPTXTargetCodeGenInfo::addGridConstantNVVMMetadata (
310+ llvm::GlobalValue *GV, const SmallVectorImpl<int > &GridConstantArgs) {
311+
312+ llvm::Module *M = GV->getParent ();
313+ llvm::LLVMContext &Ctx = M->getContext ();
314+
315+ // Get "nvvm.annotations" metadata node
316+ llvm::NamedMDNode *MD = M->getOrInsertNamedMetadata (" nvvm.annotations" );
317+
318+ SmallVector<llvm::Metadata *, 5 > MDVals = {llvm::ConstantAsMetadata::get (GV)};
305319 if (!GridConstantArgs.empty ()) {
306320 SmallVector<llvm::Metadata *, 10 > GCM;
307321 for (int I : GridConstantArgs)
@@ -310,6 +324,7 @@ void NVPTXTargetCodeGenInfo::addNVVMMetadata(
310324 MDVals.append ({llvm::MDString::get (Ctx, " grid_constant" ),
311325 llvm::MDNode::get (Ctx, GCM)});
312326 }
327+
313328 // Append metadata to nvvm.annotations
314329 MD->addOperand (llvm::MDNode::get (Ctx, MDVals));
315330}
0 commit comments