130 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9// This provides an abstract class for CUDA code generation. Concrete10// subclasses of this implement code generation for specific CUDA11// runtime libraries.12//13//===----------------------------------------------------------------------===//14 15#ifndef LLVM_CLANG_LIB_CODEGEN_CGCUDARUNTIME_H16#define LLVM_CLANG_LIB_CODEGEN_CGCUDARUNTIME_H17 18#include "clang/AST/GlobalDecl.h"19#include "llvm/ADT/StringRef.h"20#include "llvm/Frontend/Offloading/Utility.h"21#include "llvm/IR/GlobalValue.h"22 23namespace llvm {24class CallBase;25class Function;26class GlobalVariable;27}28 29namespace clang {30 31class CUDAKernelCallExpr;32class NamedDecl;33class VarDecl;34 35namespace CodeGen {36 37class CodeGenFunction;38class CodeGenModule;39class FunctionArgList;40class ReturnValueSlot;41class RValue;42 43class CGCUDARuntime {44protected:45 CodeGenModule &CGM;46 47public:48 // Global variable properties that must be passed to CUDA runtime.49 class DeviceVarFlags {50 public:51 enum DeviceVarKind {52 Variable, // Variable53 Surface, // Builtin surface54 Texture, // Builtin texture55 };56 57 private:58 LLVM_PREFERRED_TYPE(DeviceVarKind)59 unsigned Kind : 2;60 LLVM_PREFERRED_TYPE(bool)61 unsigned Extern : 1;62 LLVM_PREFERRED_TYPE(bool)63 unsigned Constant : 1; // Constant variable.64 LLVM_PREFERRED_TYPE(bool)65 unsigned Managed : 1; // Managed variable.66 LLVM_PREFERRED_TYPE(bool)67 unsigned Normalized : 1; // Normalized texture.68 int SurfTexType; // Type of surface/texutre.69 70 public:71 DeviceVarFlags(DeviceVarKind K, bool E, bool C, bool M, bool N, int T)72 : Kind(K), Extern(E), Constant(C), Managed(M), Normalized(N),73 SurfTexType(T) {}74 75 DeviceVarKind getKind() const { return static_cast<DeviceVarKind>(Kind); }76 bool isExtern() const { return Extern; }77 bool isConstant() const { return Constant; }78 bool isManaged() const { return Managed; }79 bool isNormalized() const { return Normalized; }80 int getSurfTexType() const { return SurfTexType; }81 };82 83 CGCUDARuntime(CodeGenModule &CGM) : CGM(CGM) {}84 virtual ~CGCUDARuntime();85 86 virtual RValue87 EmitCUDAKernelCallExpr(CodeGenFunction &CGF, const CUDAKernelCallExpr *E,88 ReturnValueSlot ReturnValue,89 llvm::CallBase **CallOrInvoke = nullptr);90 91 virtual RValue EmitCUDADeviceKernelCallExpr(92 CodeGenFunction &CGF, const CUDAKernelCallExpr *E,93 ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke = nullptr);94 95 /// Emits a kernel launch stub.96 virtual void emitDeviceStub(CodeGenFunction &CGF, FunctionArgList &Args) = 0;97 98 /// Check whether a variable is a device variable and register it if true.99 virtual void handleVarRegistration(const VarDecl *VD,100 llvm::GlobalVariable &Var) = 0;101 102 /// Finalize generated LLVM module. Returns a module constructor function103 /// to be added or a null pointer.104 virtual llvm::Function *finalizeModule() = 0;105 106 /// Returns function or variable name on device side even if the current107 /// compilation is for host.108 virtual std::string getDeviceSideName(const NamedDecl *ND) = 0;109 110 /// Get kernel handle by stub function.111 virtual llvm::GlobalValue *getKernelHandle(llvm::Function *Stub,112 GlobalDecl GD) = 0;113 114 /// Get kernel stub by kernel handle.115 virtual llvm::Function *getKernelStub(llvm::GlobalValue *Handle) = 0;116 117 /// Adjust linkage of shadow variables in host compilation.118 virtual void119 internalizeDeviceSideVar(const VarDecl *D,120 llvm::GlobalValue::LinkageTypes &Linkage) = 0;121};122 123/// Creates an instance of a CUDA runtime class.124CGCUDARuntime *CreateNVCUDARuntime(CodeGenModule &CGM);125 126}127}128 129#endif130