CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
87 lines
3.6 KiB
C++
87 lines
3.6 KiB
C++
//===--------- CodeGenSYCL.cpp - Code for SYCL kernel generation ----------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This contains code required for generation of SYCL kernel caller offload
|
|
// entry point functions.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "CodeGenFunction.h"
|
|
#include "CodeGenModule.h"
|
|
#include <cassert>
|
|
|
|
using namespace clang;
|
|
using namespace CodeGen;
|
|
|
|
void CodeGenFunction::EmitSYCLKernelCallStmt(const SYCLKernelCallStmt &S) {
|
|
// SYCLKernelCallStmt instances are only injected in the definitions of
|
|
// functions declared with the sycl_kernel_entry_point attribute. ODR-use of
|
|
// such a function in code emitted during device compilation should be
|
|
// diagnosed. Thus, any attempt to emit a SYCLKernelCallStmt during device
|
|
// compilation indicates a missing diagnostic.
|
|
assert(!getLangOpts().SYCLIsDevice &&
|
|
"Attempt to emit a SYCL kernel call statement during device"
|
|
" compilation");
|
|
EmitStmt(S.getKernelLaunchStmt());
|
|
}
|
|
|
|
static void SetSYCLKernelAttributes(llvm::Function *Fn, CodeGenFunction &CGF) {
|
|
// SYCL 2020 device language restrictions require forward progress and
|
|
// disallow recursion.
|
|
Fn->setDoesNotRecurse();
|
|
if (CGF.checkIfFunctionMustProgress())
|
|
Fn->addFnAttr(llvm::Attribute::MustProgress);
|
|
}
|
|
|
|
void CodeGenModule::EmitSYCLKernelCaller(const FunctionDecl *KernelEntryPointFn,
|
|
ASTContext &Ctx) {
|
|
assert(Ctx.getLangOpts().SYCLIsDevice &&
|
|
"SYCL kernel caller offload entry point functions can only be emitted"
|
|
" during device compilation");
|
|
|
|
const auto *KernelEntryPointAttr =
|
|
KernelEntryPointFn->getAttr<SYCLKernelEntryPointAttr>();
|
|
assert(KernelEntryPointAttr && "Missing sycl_kernel_entry_point attribute");
|
|
assert(!KernelEntryPointAttr->isInvalidAttr() &&
|
|
"sycl_kernel_entry_point attribute is invalid");
|
|
|
|
// Find the SYCLKernelCallStmt.
|
|
SYCLKernelCallStmt *KernelCallStmt =
|
|
cast<SYCLKernelCallStmt>(KernelEntryPointFn->getBody());
|
|
|
|
// Retrieve the SYCL kernel caller parameters from the OutlinedFunctionDecl.
|
|
FunctionArgList Args;
|
|
const OutlinedFunctionDecl *OutlinedFnDecl =
|
|
KernelCallStmt->getOutlinedFunctionDecl();
|
|
Args.append(OutlinedFnDecl->param_begin(), OutlinedFnDecl->param_end());
|
|
|
|
// Compute the function info and LLVM function type.
|
|
const CGFunctionInfo &FnInfo =
|
|
getTypes().arrangeDeviceKernelCallerDeclaration(Ctx.VoidTy, Args);
|
|
llvm::FunctionType *FnTy = getTypes().GetFunctionType(FnInfo);
|
|
|
|
// Retrieve the generated name for the SYCL kernel caller function.
|
|
CanQualType KernelNameType =
|
|
Ctx.getCanonicalType(KernelEntryPointAttr->getKernelName());
|
|
const SYCLKernelInfo &KernelInfo = Ctx.getSYCLKernelInfo(KernelNameType);
|
|
auto *Fn = llvm::Function::Create(FnTy, llvm::Function::ExternalLinkage,
|
|
KernelInfo.GetKernelName(), &getModule());
|
|
|
|
// Emit the SYCL kernel caller function.
|
|
CodeGenFunction CGF(*this);
|
|
SetLLVMFunctionAttributes(GlobalDecl(), FnInfo, Fn, false);
|
|
SetSYCLKernelAttributes(Fn, CGF);
|
|
addSYCLModuleIdAttr(Fn);
|
|
CGF.StartFunction(GlobalDecl(), Ctx.VoidTy, Fn, FnInfo, Args,
|
|
SourceLocation(), SourceLocation());
|
|
CGF.EmitFunctionBody(OutlinedFnDecl->getBody());
|
|
setDSOLocal(Fn);
|
|
SetLLVMFunctionAttributesForDefinition(cast<Decl>(OutlinedFnDecl), Fn);
|
|
CGF.FinishFunction();
|
|
}
|