|  | //===----- CGCUDARuntime.cpp - Interface to CUDA Runtimes -----------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This provides an abstract class for CUDA code generation.  Concrete | 
|  | // subclasses of this implement code generation for specific CUDA | 
|  | // runtime libraries. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "CGCUDARuntime.h" | 
|  | #include "CGCall.h" | 
|  | #include "CodeGenFunction.h" | 
|  | #include "clang/AST/Decl.h" | 
|  | #include "clang/AST/ExprCXX.h" | 
|  |  | 
|  | using namespace clang; | 
|  | using namespace CodeGen; | 
|  |  | 
|  | CGCUDARuntime::~CGCUDARuntime() {} | 
|  |  | 
|  | RValue CGCUDARuntime::EmitCUDAKernelCallExpr(CodeGenFunction &CGF, | 
|  | const CUDAKernelCallExpr *E, | 
|  | ReturnValueSlot ReturnValue) { | 
|  | llvm::BasicBlock *ConfigOKBlock = CGF.createBasicBlock("kcall.configok"); | 
|  | llvm::BasicBlock *ContBlock = CGF.createBasicBlock("kcall.end"); | 
|  |  | 
|  | CodeGenFunction::ConditionalEvaluation eval(CGF); | 
|  | CGF.EmitBranchOnBoolExpr(E->getConfig(), ContBlock, ConfigOKBlock, | 
|  | /*TrueCount=*/0); | 
|  |  | 
|  | eval.begin(CGF); | 
|  | CGF.EmitBlock(ConfigOKBlock); | 
|  | CGF.EmitSimpleCallExpr(E, ReturnValue); | 
|  | CGF.EmitBranch(ContBlock); | 
|  |  | 
|  | CGF.EmitBlock(ContBlock); | 
|  | eval.end(CGF); | 
|  |  | 
|  | return RValue::get(nullptr); | 
|  | } |