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*e5dd7070SpatrickCGCUDARuntime::~CGCUDARuntime() {} 25*e5dd7070Spatrick EmitCUDAKernelCallExpr(CodeGenFunction & CGF,const CUDAKernelCallExpr * E,ReturnValueSlot ReturnValue)26*e5dd7070SpatrickRValue 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