From: Peter Collingbourne Date: Thu, 13 Oct 2011 16:24:41 +0000 (+0000) Subject: TCE target: conversion of OpenCL reqd_work_group_size attr to metadata X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2f7aa998c0d6494301c12c4fceb6134a1bc248ab;p=clang TCE target: conversion of OpenCL reqd_work_group_size attr to metadata Patch by Pekka Jääskeläinen! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141865 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 97f9b718e0..e1dc8f7ffd 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -2742,8 +2742,8 @@ public: PTXTargetCodeGenInfo(CodeGenTypes &CGT) : TargetCodeGenInfo(new PTXABIInfo(CGT)) {} - virtual void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV, - CodeGen::CodeGenModule &M) const; + virtual void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV, + CodeGen::CodeGenModule &M) const; }; ABIArgInfo PTXABIInfo::classifyReturnType(QualType RetTy) const { @@ -3211,6 +3211,74 @@ MIPSTargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, return false; } +//===----------------------------------------------------------------------===// +// TCE ABI Implementation (see http://tce.cs.tut.fi). Uses mostly the defaults. +// Currently subclassed only to implement custom OpenCL C function attribute +// handling. +//===----------------------------------------------------------------------===// + +namespace { + +class TCETargetCodeGenInfo : public DefaultTargetCodeGenInfo { +public: + TCETargetCodeGenInfo(CodeGenTypes &CGT) + : DefaultTargetCodeGenInfo(CGT) {} + + virtual void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV, + CodeGen::CodeGenModule &M) const; +}; + +void TCETargetCodeGenInfo::SetTargetAttributes(const Decl *D, + llvm::GlobalValue *GV, + CodeGen::CodeGenModule &M) const { + const FunctionDecl *FD = dyn_cast(D); + if (!FD) return; + + llvm::Function *F = cast(GV); + + if (M.getLangOptions().OpenCL) { + if (FD->hasAttr()) { + // OpenCL C Kernel functions are not subject to inlining + F->addFnAttr(llvm::Attribute::NoInline); + + if (FD->hasAttr()) { + + // Convert the reqd_work_group_size() attributes to metadata. + llvm::LLVMContext &Context = F->getContext(); + llvm::NamedMDNode *OpenCLMetadata = + M.getModule().getOrInsertNamedMetadata("opencl.kernel_wg_size_info"); + + SmallVector Operands; + Operands.push_back(F); + + Operands.push_back(llvm::Constant::getIntegerValue( + llvm::Type::getInt32Ty(Context), + llvm::APInt( + 32, + FD->getAttr()->getXDim()))); + Operands.push_back(llvm::Constant::getIntegerValue( + llvm::Type::getInt32Ty(Context), + llvm::APInt( + 32, + FD->getAttr()->getYDim()))); + Operands.push_back(llvm::Constant::getIntegerValue( + llvm::Type::getInt32Ty(Context), + llvm::APInt( + 32, + FD->getAttr()->getZDim()))); + + // Add a boolean constant operand for "required" (true) or "hint" (false) + // for implementing the work_group_size_hint attr later. Currently + // always true as the hint is not yet implemented. + Operands.push_back(llvm::ConstantInt::getTrue(llvm::Type::getInt1Ty(Context))); + + OpenCLMetadata->addOperand(llvm::MDNode::get(Context, Operands)); + } + } + } +} + +} const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() { if (TheTargetCodeGenInfo) @@ -3258,6 +3326,9 @@ const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() { case llvm::Triple::msp430: return *(TheTargetCodeGenInfo = new MSP430TargetCodeGenInfo(Types)); + case llvm::Triple::tce: + return *(TheTargetCodeGenInfo = new TCETargetCodeGenInfo(Types)); + case llvm::Triple::x86: { bool DisableMMX = strcmp(getContext().getTargetInfo().getABI(), "no-mmx") == 0;