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