1226586Sdim//===----- CGCUDARuntime.h - Interface to CUDA Runtimes ---------*- C++ -*-===// 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 16280031Sdim#ifndef LLVM_CLANG_LIB_CODEGEN_CGCUDARUNTIME_H 17280031Sdim#define LLVM_CLANG_LIB_CODEGEN_CGCUDARUNTIME_H 18226586Sdim 19288943Sdimnamespace llvm { 20288943Sdimclass Function; 21288943Sdim} 22288943Sdim 23226586Sdimnamespace clang { 24226586Sdim 25226586Sdimclass CUDAKernelCallExpr; 26226586Sdim 27226586Sdimnamespace CodeGen { 28226586Sdim 29226586Sdimclass CodeGenFunction; 30226586Sdimclass CodeGenModule; 31226586Sdimclass FunctionArgList; 32226586Sdimclass ReturnValueSlot; 33226586Sdimclass RValue; 34226586Sdim 35226586Sdimclass CGCUDARuntime { 36226586Sdimprotected: 37226586Sdim CodeGenModule &CGM; 38226586Sdim 39226586Sdimpublic: 40226586Sdim CGCUDARuntime(CodeGenModule &CGM) : CGM(CGM) {} 41226586Sdim virtual ~CGCUDARuntime(); 42226586Sdim 43226586Sdim virtual RValue EmitCUDAKernelCallExpr(CodeGenFunction &CGF, 44226586Sdim const CUDAKernelCallExpr *E, 45226586Sdim ReturnValueSlot ReturnValue); 46226586Sdim 47288943Sdim /// Emits a kernel launch stub. 48288943Sdim virtual void emitDeviceStub(CodeGenFunction &CGF, FunctionArgList &Args) = 0; 49288943Sdim 50288943Sdim /// Constructs and returns a module initialization function or nullptr if it's 51288943Sdim /// not needed. Must be called after all kernels have been emitted. 52288943Sdim virtual llvm::Function *makeModuleCtorFunction() = 0; 53288943Sdim 54288943Sdim /// Returns a module cleanup function or nullptr if it's not needed. 55288943Sdim /// Must be called after ModuleCtorFunction 56288943Sdim virtual llvm::Function *makeModuleDtorFunction() = 0; 57226586Sdim}; 58226586Sdim 59226586Sdim/// Creates an instance of a CUDA runtime class. 60226586SdimCGCUDARuntime *CreateNVCUDARuntime(CodeGenModule &CGM); 61226586Sdim 62226586Sdim} 63226586Sdim} 64226586Sdim 65226586Sdim#endif 66