16c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne//===----- CGCUDARuntime.cpp - Interface to CUDA Runtimes -----------------===// 26c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne// 36c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne// The LLVM Compiler Infrastructure 46c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne// 56c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne// This file is distributed under the University of Illinois Open Source 66c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne// License. See LICENSE.TXT for details. 76c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne// 86c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne//===----------------------------------------------------------------------===// 96c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne// 106c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne// This provides an abstract class for CUDA code generation. Concrete 116c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne// subclasses of this implement code generation for specific CUDA 126c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne// runtime libraries. 136c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne// 146c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne//===----------------------------------------------------------------------===// 156c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne 166c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne#include "CGCUDARuntime.h" 176c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne#include "CGCall.h" 186c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne#include "CodeGenFunction.h" 1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/Decl.h" 2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/ExprCXX.h" 216c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne 226c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourneusing namespace clang; 236c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourneusing namespace CodeGen; 246c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne 256c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter CollingbourneCGCUDARuntime::~CGCUDARuntime() {} 266c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne 276c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter CollingbourneRValue CGCUDARuntime::EmitCUDAKernelCallExpr(CodeGenFunction &CGF, 286c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne const CUDAKernelCallExpr *E, 296c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne ReturnValueSlot ReturnValue) { 306c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne llvm::BasicBlock *ConfigOKBlock = CGF.createBasicBlock("kcall.configok"); 316c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne llvm::BasicBlock *ContBlock = CGF.createBasicBlock("kcall.end"); 326c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne 336c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne CodeGenFunction::ConditionalEvaluation eval(CGF); 34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CGF.EmitBranchOnBoolExpr(E->getConfig(), ContBlock, ConfigOKBlock, 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /*TrueCount=*/0); 366c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne 376c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne eval.begin(CGF); 386c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne CGF.EmitBlock(ConfigOKBlock); 396c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne 406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const Decl *TargetDecl = nullptr; 416c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E->getCallee())) { 426c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CE->getSubExpr())) { 436c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne TargetDecl = DRE->getDecl(); 446c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne } 456c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne } 466c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne 476c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne llvm::Value *Callee = CGF.EmitScalarExpr(E->getCallee()); 48b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne CGF.EmitCall(E->getCallee()->getType(), Callee, E->getLocStart(), 49b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne ReturnValue, E->arg_begin(), E->arg_end(), TargetDecl); 506c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne CGF.EmitBranch(ContBlock); 516c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne 526c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne CGF.EmitBlock(ContBlock); 536c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne eval.end(CGF); 546c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne 556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return RValue::get(nullptr); 566c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne} 57