brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · 64fb9a3 Raw
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