|  | //===----- CGCUDARuntime.h - Interface to CUDA Runtimes ---------*- C++ -*-===// | 
|  | // | 
|  | //                     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. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_CLANG_LIB_CODEGEN_CGCUDARUNTIME_H | 
|  | #define LLVM_CLANG_LIB_CODEGEN_CGCUDARUNTIME_H | 
|  |  | 
|  | namespace llvm { | 
|  | class Function; | 
|  | class GlobalVariable; | 
|  | } | 
|  |  | 
|  | namespace clang { | 
|  |  | 
|  | class CUDAKernelCallExpr; | 
|  |  | 
|  | namespace CodeGen { | 
|  |  | 
|  | class CodeGenFunction; | 
|  | class CodeGenModule; | 
|  | class FunctionArgList; | 
|  | class ReturnValueSlot; | 
|  | class RValue; | 
|  |  | 
|  | class CGCUDARuntime { | 
|  | protected: | 
|  | CodeGenModule &CGM; | 
|  |  | 
|  | public: | 
|  | // Global variable properties that must be passed to CUDA runtime. | 
|  | enum DeviceVarFlags { | 
|  | ExternDeviceVar = 0x01,   // extern | 
|  | ConstantDeviceVar = 0x02, // __constant__ | 
|  | }; | 
|  |  | 
|  | CGCUDARuntime(CodeGenModule &CGM) : CGM(CGM) {} | 
|  | virtual ~CGCUDARuntime(); | 
|  |  | 
|  | virtual RValue EmitCUDAKernelCallExpr(CodeGenFunction &CGF, | 
|  | const CUDAKernelCallExpr *E, | 
|  | ReturnValueSlot ReturnValue); | 
|  |  | 
|  | /// Emits a kernel launch stub. | 
|  | virtual void emitDeviceStub(CodeGenFunction &CGF, FunctionArgList &Args) = 0; | 
|  | virtual void registerDeviceVar(llvm::GlobalVariable &Var, unsigned Flags) = 0; | 
|  |  | 
|  | /// Constructs and returns a module initialization function or nullptr if it's | 
|  | /// not needed. Must be called after all kernels have been emitted. | 
|  | virtual llvm::Function *makeModuleCtorFunction() = 0; | 
|  |  | 
|  | /// Returns a module cleanup function or nullptr if it's not needed. | 
|  | /// Must be called after ModuleCtorFunction | 
|  | virtual llvm::Function *makeModuleDtorFunction() = 0; | 
|  | }; | 
|  |  | 
|  | /// Creates an instance of a CUDA runtime class. | 
|  | CGCUDARuntime *CreateNVCUDARuntime(CodeGenModule &CGM); | 
|  |  | 
|  | } | 
|  | } | 
|  |  | 
|  | #endif |