1226586Sdim//===----- CGCUDARuntime.cpp - Interface to CUDA Runtimes -----------------===// 2226586Sdim// 3226586Sdim// The LLVM Compiler Infrastructure 4226586Sdim// 5226586Sdim// This file is distributed under the University of Illinois Open Source 6226586Sdim// License. See LICENSE.TXT for details. 7226586Sdim// 8226586Sdim//===----------------------------------------------------------------------===// 9226586Sdim// 10226586Sdim// This provides an abstract class for CUDA code generation. Concrete 11226586Sdim// subclasses of this implement code generation for specific CUDA 12226586Sdim// runtime libraries. 13226586Sdim// 14226586Sdim//===----------------------------------------------------------------------===// 15226586Sdim 16226586Sdim#include "CGCUDARuntime.h" 17252723Sdim#include "CGCall.h" 18252723Sdim#include "CodeGenFunction.h" 19226586Sdim#include "clang/AST/Decl.h" 20226586Sdim#include "clang/AST/ExprCXX.h" 21226586Sdim 22226586Sdimusing namespace clang; 23226586Sdimusing namespace CodeGen; 24226586Sdim 25226586SdimCGCUDARuntime::~CGCUDARuntime() {} 26226586Sdim 27226586SdimRValue CGCUDARuntime::EmitCUDAKernelCallExpr(CodeGenFunction &CGF, 28226586Sdim const CUDAKernelCallExpr *E, 29226586Sdim ReturnValueSlot ReturnValue) { 30226586Sdim llvm::BasicBlock *ConfigOKBlock = CGF.createBasicBlock("kcall.configok"); 31226586Sdim llvm::BasicBlock *ContBlock = CGF.createBasicBlock("kcall.end"); 32226586Sdim 33226586Sdim CodeGenFunction::ConditionalEvaluation eval(CGF); 34226586Sdim CGF.EmitBranchOnBoolExpr(E->getConfig(), ContBlock, ConfigOKBlock); 35226586Sdim 36226586Sdim eval.begin(CGF); 37226586Sdim CGF.EmitBlock(ConfigOKBlock); 38226586Sdim 39226586Sdim const Decl *TargetDecl = 0; 40226586Sdim if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E->getCallee())) { 41226586Sdim if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CE->getSubExpr())) { 42226586Sdim TargetDecl = DRE->getDecl(); 43226586Sdim } 44226586Sdim } 45226586Sdim 46226586Sdim llvm::Value *Callee = CGF.EmitScalarExpr(E->getCallee()); 47263509Sdim CGF.EmitCall(E->getCallee()->getType(), Callee, E->getLocStart(), 48263509Sdim ReturnValue, E->arg_begin(), E->arg_end(), TargetDecl); 49226586Sdim CGF.EmitBranch(ContBlock); 50226586Sdim 51226586Sdim CGF.EmitBlock(ContBlock); 52226586Sdim eval.end(CGF); 53226586Sdim 54226586Sdim return RValue::get(0); 55226586Sdim} 56