Home | History | Annotate | Download | only in CodeGen
      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 
     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