181ad6265SDimitry Andric //===----- CGHLSLRuntime.h - Interface to HLSL Runtimes -----*- C++ -*-===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric // 981ad6265SDimitry Andric // This provides an abstract class for HLSL code generation. Concrete 1081ad6265SDimitry Andric // subclasses of this implement code generation for specific HLSL 1181ad6265SDimitry Andric // runtime libraries. 1281ad6265SDimitry Andric // 1381ad6265SDimitry Andric //===----------------------------------------------------------------------===// 1481ad6265SDimitry Andric 1581ad6265SDimitry Andric #ifndef LLVM_CLANG_LIB_CODEGEN_CGHLSLRUNTIME_H 1681ad6265SDimitry Andric #define LLVM_CLANG_LIB_CODEGEN_CGHLSLRUNTIME_H 1781ad6265SDimitry Andric 18*bdd1243dSDimitry Andric #include "llvm/IR/IRBuilder.h" 19*bdd1243dSDimitry Andric 20*bdd1243dSDimitry Andric #include "clang/Basic/HLSLRuntime.h" 21*bdd1243dSDimitry Andric 22*bdd1243dSDimitry Andric #include "llvm/ADT/SmallVector.h" 23*bdd1243dSDimitry Andric #include "llvm/ADT/StringRef.h" 24*bdd1243dSDimitry Andric #include "llvm/Frontend/HLSL/HLSLResource.h" 25*bdd1243dSDimitry Andric 26*bdd1243dSDimitry Andric #include <optional> 27*bdd1243dSDimitry Andric #include <vector> 28*bdd1243dSDimitry Andric 29*bdd1243dSDimitry Andric namespace llvm { 30*bdd1243dSDimitry Andric class GlobalVariable; 31*bdd1243dSDimitry Andric class Function; 32*bdd1243dSDimitry Andric class StructType; 33*bdd1243dSDimitry Andric } // namespace llvm 34*bdd1243dSDimitry Andric 3581ad6265SDimitry Andric namespace clang { 36*bdd1243dSDimitry Andric class VarDecl; 37*bdd1243dSDimitry Andric class ParmVarDecl; 38*bdd1243dSDimitry Andric class HLSLBufferDecl; 39*bdd1243dSDimitry Andric class HLSLResourceBindingAttr; 40*bdd1243dSDimitry Andric class Type; 41*bdd1243dSDimitry Andric class DeclContext; 42*bdd1243dSDimitry Andric 43*bdd1243dSDimitry Andric class FunctionDecl; 4481ad6265SDimitry Andric 4581ad6265SDimitry Andric namespace CodeGen { 4681ad6265SDimitry Andric 4781ad6265SDimitry Andric class CodeGenModule; 4881ad6265SDimitry Andric 4981ad6265SDimitry Andric class CGHLSLRuntime { 50*bdd1243dSDimitry Andric public: 51*bdd1243dSDimitry Andric struct BufferResBinding { 52*bdd1243dSDimitry Andric // The ID like 2 in register(b2, space1). 53*bdd1243dSDimitry Andric std::optional<unsigned> Reg; 54*bdd1243dSDimitry Andric // The Space like 1 is register(b2, space1). 55*bdd1243dSDimitry Andric // Default value is 0. 56*bdd1243dSDimitry Andric unsigned Space; 57*bdd1243dSDimitry Andric BufferResBinding(HLSLResourceBindingAttr *Attr); 58*bdd1243dSDimitry Andric }; 59*bdd1243dSDimitry Andric struct Buffer { 60*bdd1243dSDimitry Andric Buffer(const HLSLBufferDecl *D); 61*bdd1243dSDimitry Andric llvm::StringRef Name; 62*bdd1243dSDimitry Andric // IsCBuffer - Whether the buffer is a cbuffer (and not a tbuffer). 63*bdd1243dSDimitry Andric bool IsCBuffer; 64*bdd1243dSDimitry Andric BufferResBinding Binding; 65*bdd1243dSDimitry Andric // Global variable and offset for each constant. 66*bdd1243dSDimitry Andric std::vector<std::pair<llvm::GlobalVariable *, unsigned>> Constants; 67*bdd1243dSDimitry Andric llvm::StructType *LayoutStruct = nullptr; 68*bdd1243dSDimitry Andric }; 69*bdd1243dSDimitry Andric 7081ad6265SDimitry Andric protected: 7181ad6265SDimitry Andric CodeGenModule &CGM; 7281ad6265SDimitry Andric 73*bdd1243dSDimitry Andric llvm::Value *emitInputSemantic(llvm::IRBuilder<> &B, const ParmVarDecl &D, 74*bdd1243dSDimitry Andric llvm::Type *Ty); 75*bdd1243dSDimitry Andric 7681ad6265SDimitry Andric public: 7781ad6265SDimitry Andric CGHLSLRuntime(CodeGenModule &CGM) : CGM(CGM) {} 7881ad6265SDimitry Andric virtual ~CGHLSLRuntime() {} 7981ad6265SDimitry Andric 80*bdd1243dSDimitry Andric void annotateHLSLResource(const VarDecl *D, llvm::GlobalVariable *GV); 81*bdd1243dSDimitry Andric void generateGlobalCtorDtorCalls(); 82*bdd1243dSDimitry Andric 83*bdd1243dSDimitry Andric void addBuffer(const HLSLBufferDecl *D); 8481ad6265SDimitry Andric void finishCodeGen(); 85*bdd1243dSDimitry Andric 86*bdd1243dSDimitry Andric void setHLSLEntryAttributes(const FunctionDecl *FD, llvm::Function *Fn); 87*bdd1243dSDimitry Andric 88*bdd1243dSDimitry Andric void emitEntryFunction(const FunctionDecl *FD, llvm::Function *Fn); 89*bdd1243dSDimitry Andric void setHLSLFunctionAttributes(llvm::Function *, const FunctionDecl *); 90*bdd1243dSDimitry Andric 91*bdd1243dSDimitry Andric private: 92*bdd1243dSDimitry Andric void addBufferResourceAnnotation(llvm::GlobalVariable *GV, 93*bdd1243dSDimitry Andric llvm::StringRef TyName, 94*bdd1243dSDimitry Andric llvm::hlsl::ResourceClass RC, 95*bdd1243dSDimitry Andric llvm::hlsl::ResourceKind RK, 96*bdd1243dSDimitry Andric BufferResBinding &Binding); 97*bdd1243dSDimitry Andric void addConstant(VarDecl *D, Buffer &CB); 98*bdd1243dSDimitry Andric void addBufferDecls(const DeclContext *DC, Buffer &CB); 99*bdd1243dSDimitry Andric llvm::SmallVector<Buffer> Buffers; 10081ad6265SDimitry Andric }; 10181ad6265SDimitry Andric 10281ad6265SDimitry Andric } // namespace CodeGen 10381ad6265SDimitry Andric } // namespace clang 10481ad6265SDimitry Andric 10581ad6265SDimitry Andric #endif 106