Clang Project

clang_source_code/lib/CodeGen/CGCUDARuntime.h
1//===----- CGCUDARuntime.h - Interface to CUDA Runtimes ---------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This provides an abstract class for CUDA code generation.  Concrete
10// subclasses of this implement code generation for specific CUDA
11// runtime libraries.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CLANG_LIB_CODEGEN_CGCUDARUNTIME_H
16#define LLVM_CLANG_LIB_CODEGEN_CGCUDARUNTIME_H
17
18namespace llvm {
19class Function;
20class GlobalVariable;
21}
22
23namespace clang {
24
25class CUDAKernelCallExpr;
26class VarDecl;
27
28namespace CodeGen {
29
30class CodeGenFunction;
31class CodeGenModule;
32class FunctionArgList;
33class ReturnValueSlot;
34class RValue;
35
36class CGCUDARuntime {
37protected:
38  CodeGenModule &CGM;
39
40public:
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 &CGFFunctionArgList &Args) = 0;
56  virtual void registerDeviceVar(const VarDecl *VDllvm::GlobalVariable &Var,
57                                 unsigned Flags) = 0;
58
59  /// Constructs and returns a module initialization function or nullptr if it's
60  /// not needed. Must be called after all kernels have been emitted.
61  virtual llvm::Function *makeModuleCtorFunction() = 0;
62
63  /// Returns a module cleanup function or nullptr if it's not needed.
64  /// Must be called after ModuleCtorFunction
65  virtual llvm::Function *makeModuleDtorFunction() = 0;
66};
67
68/// Creates an instance of a CUDA runtime class.
69CGCUDARuntime *CreateNVCUDARuntime(CodeGenModule &CGM);
70
71}
72}
73
74#endif
75
clang::CodeGen::CGCUDARuntime::CGM
clang::CodeGen::CGCUDARuntime::DeviceVarFlags
clang::CodeGen::CGCUDARuntime::EmitCUDAKernelCallExpr
clang::CodeGen::CGCUDARuntime::emitDeviceStub
clang::CodeGen::CGCUDARuntime::registerDeviceVar
clang::CodeGen::CGCUDARuntime::makeModuleCtorFunction
clang::CodeGen::CGCUDARuntime::makeModuleDtorFunction