|  | //===----- CGCUDARuntime.h - Interface to CUDA Runtimes ---------*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // 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 | 
|  |  | 
|  | #include "llvm/ADT/StringRef.h" | 
|  |  | 
|  | namespace llvm { | 
|  | class Function; | 
|  | class GlobalVariable; | 
|  | } | 
|  |  | 
|  | namespace clang { | 
|  |  | 
|  | class CUDAKernelCallExpr; | 
|  | class NamedDecl; | 
|  | class VarDecl; | 
|  |  | 
|  | 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. | 
|  | class DeviceVarFlags { | 
|  | public: | 
|  | enum DeviceVarKind { | 
|  | Variable, // Variable | 
|  | Surface,  // Builtin surface | 
|  | Texture,  // Builtin texture | 
|  | }; | 
|  |  | 
|  | private: | 
|  | unsigned Kind : 2; | 
|  | unsigned Extern : 1; | 
|  | unsigned Constant : 1;   // Constant variable. | 
|  | unsigned Normalized : 1; // Normalized texture. | 
|  | int SurfTexType;         // Type of surface/texutre. | 
|  |  | 
|  | public: | 
|  | DeviceVarFlags(DeviceVarKind K, bool E, bool C, bool N, int T) | 
|  | : Kind(K), Extern(E), Constant(C), Normalized(N), SurfTexType(T) {} | 
|  |  | 
|  | DeviceVarKind getKind() const { return static_cast<DeviceVarKind>(Kind); } | 
|  | bool isExtern() const { return Extern; } | 
|  | bool isConstant() const { return Constant; } | 
|  | bool isNormalized() const { return Normalized; } | 
|  | int getSurfTexType() const { return SurfTexType; } | 
|  | }; | 
|  |  | 
|  | 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(const VarDecl *VD, llvm::GlobalVariable &Var, | 
|  | bool Extern, bool Constant) = 0; | 
|  | virtual void registerDeviceSurf(const VarDecl *VD, llvm::GlobalVariable &Var, | 
|  | bool Extern, int Type) = 0; | 
|  | virtual void registerDeviceTex(const VarDecl *VD, llvm::GlobalVariable &Var, | 
|  | bool Extern, int Type, bool Normalized) = 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; | 
|  |  | 
|  | /// Returns function or variable name on device side even if the current | 
|  | /// compilation is for host. | 
|  | virtual std::string getDeviceSideName(const NamedDecl *ND) = 0; | 
|  | }; | 
|  |  | 
|  | /// Creates an instance of a CUDA runtime class. | 
|  | CGCUDARuntime *CreateNVCUDARuntime(CodeGenModule &CGM); | 
|  |  | 
|  | } | 
|  | } | 
|  |  | 
|  | #endif |