clang 23.0.0git
CodeGenSYCL.cpp
Go to the documentation of this file.
1//===--------- CodeGenSYCL.cpp - Code for SYCL kernel generation ----------===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9// This contains code required for generation of SYCL kernel caller offload
10// entry point functions.
11//
12//===----------------------------------------------------------------------===//
13
14#include "CodeGenFunction.h"
15#include "CodeGenModule.h"
16#include <cassert>
17
18using namespace clang;
19using namespace CodeGen;
20
22 // SYCLKernelCallStmt instances are only injected in the definitions of
23 // functions declared with the sycl_kernel_entry_point attribute. ODR-use of
24 // such a function in code emitted during device compilation should be
25 // diagnosed. Thus, any attempt to emit a SYCLKernelCallStmt during device
26 // compilation indicates a missing diagnostic.
27 assert(!getLangOpts().SYCLIsDevice &&
28 "Attempt to emit a SYCL kernel call statement during device"
29 " compilation");
31}
32
33static void SetSYCLKernelAttributes(llvm::Function *Fn, CodeGenFunction &CGF) {
34 // SYCL 2020 device language restrictions require forward progress and
35 // disallow recursion.
36 Fn->setDoesNotRecurse();
38 Fn->addFnAttr(llvm::Attribute::MustProgress);
39}
40
41void CodeGenModule::EmitSYCLKernelCaller(const FunctionDecl *KernelEntryPointFn,
42 ASTContext &Ctx) {
43 assert(Ctx.getLangOpts().SYCLIsDevice &&
44 "SYCL kernel caller offload entry point functions can only be emitted"
45 " during device compilation");
46
47 const auto *KernelEntryPointAttr =
48 KernelEntryPointFn->getAttr<SYCLKernelEntryPointAttr>();
49 assert(KernelEntryPointAttr && "Missing sycl_kernel_entry_point attribute");
50 assert(!KernelEntryPointAttr->isInvalidAttr() &&
51 "sycl_kernel_entry_point attribute is invalid");
52
53 // Find the SYCLKernelCallStmt.
54 SYCLKernelCallStmt *KernelCallStmt =
55 cast<SYCLKernelCallStmt>(KernelEntryPointFn->getBody());
56
57 // Retrieve the SYCL kernel caller parameters from the OutlinedFunctionDecl.
58 FunctionArgList Args;
59 const OutlinedFunctionDecl *OutlinedFnDecl =
60 KernelCallStmt->getOutlinedFunctionDecl();
61 Args.append(OutlinedFnDecl->param_begin(), OutlinedFnDecl->param_end());
62
63 // Compute the function info and LLVM function type.
64 const CGFunctionInfo &FnInfo =
66 llvm::FunctionType *FnTy = getTypes().GetFunctionType(FnInfo);
67
68 // Retrieve the generated name for the SYCL kernel caller function.
69 CanQualType KernelNameType =
70 Ctx.getCanonicalType(KernelEntryPointAttr->getKernelName());
71 const SYCLKernelInfo &KernelInfo = Ctx.getSYCLKernelInfo(KernelNameType);
72 auto *Fn = llvm::Function::Create(FnTy, llvm::Function::ExternalLinkage,
73 KernelInfo.GetKernelName(), &getModule());
74
75 // Emit the SYCL kernel caller function.
76 CodeGenFunction CGF(*this);
77 SetLLVMFunctionAttributes(GlobalDecl(), FnInfo, Fn, false);
79 CGF.StartFunction(GlobalDecl(), Ctx.VoidTy, Fn, FnInfo, Args,
80 SourceLocation(), SourceLocation());
81 CGF.EmitFunctionBody(OutlinedFnDecl->getBody());
82 setDSOLocal(Fn);
84 CGF.FinishFunction();
85}
static void SetSYCLKernelAttributes(llvm::Function *Fn, CodeGenFunction &CGF)
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
const LangOptions & getLangOpts() const
Definition ASTContext.h:951
CanQualType VoidTy
const SYCLKernelInfo & getSYCLKernelInfo(QualType T) const
Given a type used as a SYCL kernel name, returns a reference to the metadata generated from the corre...
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
const LangOptions & getLangOpts() const
void EmitStmt(const Stmt *S, ArrayRef< const Attr * > Attrs={})
EmitStmt - Emit the code for the statement.
Definition CGStmt.cpp:58
void EmitSYCLKernelCallStmt(const SYCLKernelCallStmt &S)
bool checkIfFunctionMustProgress()
Returns true if a function must make progress, which means the mustprogress attribute can be added.
void setDSOLocal(llvm::GlobalValue *GV) const
llvm::Module & getModule() const
void SetLLVMFunctionAttributes(GlobalDecl GD, const CGFunctionInfo &Info, llvm::Function *F, bool IsThunk)
Set the LLVM function attributes (sext, zext, etc).
void SetLLVMFunctionAttributesForDefinition(const Decl *D, llvm::Function *F)
Set the LLVM function attributes which only apply to a function definition.
llvm::FunctionType * GetFunctionType(const CGFunctionInfo &Info)
GetFunctionType - Get the LLVM function type for.
Definition CGCall.cpp:1801
const CGFunctionInfo & arrangeDeviceKernelCallerDeclaration(QualType resultType, const FunctionArgList &args)
A device kernel caller function is an offload device entry point function with a target device depend...
Definition CGCall.cpp:758
T * getAttr() const
Definition DeclBase.h:573
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
Definition Decl.cpp:3280
parameter_const_iterator param_end() const
Definition Decl.h:4929
Stmt * getBody() const override
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
Definition Decl.cpp:5673
parameter_const_iterator param_begin() const
Definition Decl.h:4928
SYCLKernelCallStmt represents the transformation that is applied to the body of a function declared w...
Definition StmtSYCL.h:36
OutlinedFunctionDecl * getOutlinedFunctionDecl()
Definition StmtSYCL.h:66
const std::string & GetKernelName() const
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
U cast(CodeGen::Address addr)
Definition Address.h:327