xref: /openbsd-src/gnu/llvm/clang/lib/CodeGen/CGCUDARuntime.cpp (revision e5dd70708596ae51455a0ffa086a00c5b29f8583)
1*e5dd7070Spatrick //===----- CGCUDARuntime.cpp - Interface to CUDA Runtimes -----------------===//
2*e5dd7070Spatrick //
3*e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*e5dd7070Spatrick //
7*e5dd7070Spatrick //===----------------------------------------------------------------------===//
8*e5dd7070Spatrick //
9*e5dd7070Spatrick // This provides an abstract class for CUDA code generation.  Concrete
10*e5dd7070Spatrick // subclasses of this implement code generation for specific CUDA
11*e5dd7070Spatrick // runtime libraries.
12*e5dd7070Spatrick //
13*e5dd7070Spatrick //===----------------------------------------------------------------------===//
14*e5dd7070Spatrick 
15*e5dd7070Spatrick #include "CGCUDARuntime.h"
16*e5dd7070Spatrick #include "CGCall.h"
17*e5dd7070Spatrick #include "CodeGenFunction.h"
18*e5dd7070Spatrick #include "clang/AST/Decl.h"
19*e5dd7070Spatrick #include "clang/AST/ExprCXX.h"
20*e5dd7070Spatrick 
21*e5dd7070Spatrick using namespace clang;
22*e5dd7070Spatrick using namespace CodeGen;
23*e5dd7070Spatrick 
~CGCUDARuntime()24*e5dd7070Spatrick CGCUDARuntime::~CGCUDARuntime() {}
25*e5dd7070Spatrick 
EmitCUDAKernelCallExpr(CodeGenFunction & CGF,const CUDAKernelCallExpr * E,ReturnValueSlot ReturnValue)26*e5dd7070Spatrick RValue CGCUDARuntime::EmitCUDAKernelCallExpr(CodeGenFunction &CGF,
27*e5dd7070Spatrick                                              const CUDAKernelCallExpr *E,
28*e5dd7070Spatrick                                              ReturnValueSlot ReturnValue) {
29*e5dd7070Spatrick   llvm::BasicBlock *ConfigOKBlock = CGF.createBasicBlock("kcall.configok");
30*e5dd7070Spatrick   llvm::BasicBlock *ContBlock = CGF.createBasicBlock("kcall.end");
31*e5dd7070Spatrick 
32*e5dd7070Spatrick   CodeGenFunction::ConditionalEvaluation eval(CGF);
33*e5dd7070Spatrick   CGF.EmitBranchOnBoolExpr(E->getConfig(), ContBlock, ConfigOKBlock,
34*e5dd7070Spatrick                            /*TrueCount=*/0);
35*e5dd7070Spatrick 
36*e5dd7070Spatrick   eval.begin(CGF);
37*e5dd7070Spatrick   CGF.EmitBlock(ConfigOKBlock);
38*e5dd7070Spatrick   CGF.EmitSimpleCallExpr(E, ReturnValue);
39*e5dd7070Spatrick   CGF.EmitBranch(ContBlock);
40*e5dd7070Spatrick 
41*e5dd7070Spatrick   CGF.EmitBlock(ContBlock);
42*e5dd7070Spatrick   eval.end(CGF);
43*e5dd7070Spatrick 
44*e5dd7070Spatrick   return RValue::get(nullptr);
45*e5dd7070Spatrick }
46