1 //===- TCE.cpp ------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "ABIInfoImpl.h"
10 #include "TargetInfo.h"
12 using namespace clang
;
13 using namespace clang::CodeGen
;
15 //===----------------------------------------------------------------------===//
16 // TCE ABI Implementation (see http://tce.cs.tut.fi). Uses mostly the defaults.
17 // Currently subclassed only to implement custom OpenCL C function attribute
19 //===----------------------------------------------------------------------===//
23 class TCETargetCodeGenInfo
: public TargetCodeGenInfo
{
25 TCETargetCodeGenInfo(CodeGenTypes
&CGT
)
26 : TargetCodeGenInfo(std::make_unique
<DefaultABIInfo
>(CGT
)) {}
28 void setTargetAttributes(const Decl
*D
, llvm::GlobalValue
*GV
,
29 CodeGen::CodeGenModule
&M
) const override
;
32 void TCETargetCodeGenInfo::setTargetAttributes(
33 const Decl
*D
, llvm::GlobalValue
*GV
, CodeGen::CodeGenModule
&M
) const {
34 if (GV
->isDeclaration())
36 const FunctionDecl
*FD
= dyn_cast_or_null
<FunctionDecl
>(D
);
39 llvm::Function
*F
= cast
<llvm::Function
>(GV
);
41 if (M
.getLangOpts().OpenCL
) {
42 if (FD
->hasAttr
<OpenCLKernelAttr
>()) {
43 // OpenCL C Kernel functions are not subject to inlining
44 F
->addFnAttr(llvm::Attribute::NoInline
);
45 const ReqdWorkGroupSizeAttr
*Attr
= FD
->getAttr
<ReqdWorkGroupSizeAttr
>();
47 // Convert the reqd_work_group_size() attributes to metadata.
48 llvm::LLVMContext
&Context
= F
->getContext();
49 llvm::NamedMDNode
*OpenCLMetadata
=
50 M
.getModule().getOrInsertNamedMetadata(
51 "opencl.kernel_wg_size_info");
53 SmallVector
<llvm::Metadata
*, 5> Operands
;
54 Operands
.push_back(llvm::ConstantAsMetadata::get(F
));
57 llvm::ConstantAsMetadata::get(llvm::Constant::getIntegerValue(
58 M
.Int32Ty
, llvm::APInt(32, Attr
->getXDim()))));
60 llvm::ConstantAsMetadata::get(llvm::Constant::getIntegerValue(
61 M
.Int32Ty
, llvm::APInt(32, Attr
->getYDim()))));
63 llvm::ConstantAsMetadata::get(llvm::Constant::getIntegerValue(
64 M
.Int32Ty
, llvm::APInt(32, Attr
->getZDim()))));
66 // Add a boolean constant operand for "required" (true) or "hint"
67 // (false) for implementing the work_group_size_hint attr later.
68 // Currently always true as the hint is not yet implemented.
70 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getTrue(Context
)));
71 OpenCLMetadata
->addOperand(llvm::MDNode::get(Context
, Operands
));
79 std::unique_ptr
<TargetCodeGenInfo
>
80 CodeGen::createTCETargetCodeGenInfo(CodeGenModule
&CGM
) {
81 return std::make_unique
<TCETargetCodeGenInfo
>(CGM
.getTypes());