1 //===----- CGCUDARuntime.h - Interface to CUDA Runtimes ---------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This provides an abstract class for CUDA code generation. Concrete 11 // subclasses of this implement code generation for specific CUDA 12 // runtime libraries. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #ifndef LLVM_CLANG_LIB_CODEGEN_CGCUDARUNTIME_H 17 #define LLVM_CLANG_LIB_CODEGEN_CGCUDARUNTIME_H 18 19 namespace llvm { 20 class Function; 21 class GlobalVariable; 22 } 23 24 namespace clang { 25 26 class CUDAKernelCallExpr; 27 28 namespace CodeGen { 29 30 class CodeGenFunction; 31 class CodeGenModule; 32 class FunctionArgList; 33 class ReturnValueSlot; 34 class RValue; 35 36 class CGCUDARuntime { 37 protected: 38 CodeGenModule &CGM; 39 40 public: 41 // Global variable properties that must be passed to CUDA runtime. 42 enum DeviceVarFlags { 43 ExternDeviceVar = 0x01, // extern 44 ConstantDeviceVar = 0x02, // __constant__ 45 }; 46 CGCUDARuntime(CodeGenModule & CGM)47 CGCUDARuntime(CodeGenModule &CGM) : CGM(CGM) {} 48 virtual ~CGCUDARuntime(); 49 50 virtual RValue EmitCUDAKernelCallExpr(CodeGenFunction &CGF, 51 const CUDAKernelCallExpr *E, 52 ReturnValueSlot ReturnValue); 53 54 /// Emits a kernel launch stub. 55 virtual void emitDeviceStub(CodeGenFunction &CGF, FunctionArgList &Args) = 0; 56 virtual void registerDeviceVar(llvm::GlobalVariable &Var, unsigned Flags) = 0; 57 58 /// Constructs and returns a module initialization function or nullptr if it's 59 /// not needed. Must be called after all kernels have been emitted. 60 virtual llvm::Function *makeModuleCtorFunction() = 0; 61 62 /// Returns a module cleanup function or nullptr if it's not needed. 63 /// Must be called after ModuleCtorFunction 64 virtual llvm::Function *makeModuleDtorFunction() = 0; 65 }; 66 67 /// Creates an instance of a CUDA runtime class. 68 CGCUDARuntime *CreateNVCUDARuntime(CodeGenModule &CGM); 69 70 } 71 } 72 73 #endif 74