12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- //===----- 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 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.
- 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(const VarDecl *VD, 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;
- /// Construct and return the stub name of a kernel.
- virtual std::string getDeviceStubName(llvm::StringRef Name) const = 0;
- };
- /// Creates an instance of a CUDA runtime class.
- CGCUDARuntime *CreateNVCUDARuntime(CodeGenModule &CGM);
- }
- }
- #endif
|