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 18bdd1243dSDimitry Andric #include "llvm/IR/IRBuilder.h" 19bdd1243dSDimitry Andric 20bdd1243dSDimitry Andric #include "clang/Basic/HLSLRuntime.h" 21bdd1243dSDimitry Andric 22bdd1243dSDimitry Andric #include "llvm/ADT/SmallVector.h" 23bdd1243dSDimitry Andric #include "llvm/ADT/StringRef.h" 24bdd1243dSDimitry Andric #include "llvm/Frontend/HLSL/HLSLResource.h" 25bdd1243dSDimitry Andric 26bdd1243dSDimitry Andric #include <optional> 27bdd1243dSDimitry Andric #include <vector> 28bdd1243dSDimitry Andric 29bdd1243dSDimitry Andric namespace llvm { 30bdd1243dSDimitry Andric class GlobalVariable; 31bdd1243dSDimitry Andric class Function; 32bdd1243dSDimitry Andric class StructType; 33bdd1243dSDimitry Andric } // namespace llvm 34bdd1243dSDimitry Andric 3581ad6265SDimitry Andric namespace clang { 36bdd1243dSDimitry Andric class VarDecl; 37bdd1243dSDimitry Andric class ParmVarDecl; 38bdd1243dSDimitry Andric class HLSLBufferDecl; 39bdd1243dSDimitry Andric class HLSLResourceBindingAttr; 40bdd1243dSDimitry Andric class Type; 41bdd1243dSDimitry Andric class DeclContext; 42bdd1243dSDimitry Andric 43bdd1243dSDimitry Andric class FunctionDecl; 4481ad6265SDimitry Andric 4581ad6265SDimitry Andric namespace CodeGen { 4681ad6265SDimitry Andric 4781ad6265SDimitry Andric class CodeGenModule; 4881ad6265SDimitry Andric 4981ad6265SDimitry Andric class CGHLSLRuntime { 50bdd1243dSDimitry Andric public: 51bdd1243dSDimitry Andric struct BufferResBinding { 52bdd1243dSDimitry Andric // The ID like 2 in register(b2, space1). 53bdd1243dSDimitry Andric std::optional<unsigned> Reg; 54bdd1243dSDimitry Andric // The Space like 1 is register(b2, space1). 55bdd1243dSDimitry Andric // Default value is 0. 56bdd1243dSDimitry Andric unsigned Space; 57bdd1243dSDimitry Andric BufferResBinding(HLSLResourceBindingAttr *Attr); 58bdd1243dSDimitry Andric }; 59bdd1243dSDimitry Andric struct Buffer { 60bdd1243dSDimitry Andric Buffer(const HLSLBufferDecl *D); 61bdd1243dSDimitry Andric llvm::StringRef Name; 62bdd1243dSDimitry Andric // IsCBuffer - Whether the buffer is a cbuffer (and not a tbuffer). 63bdd1243dSDimitry Andric bool IsCBuffer; 64bdd1243dSDimitry Andric BufferResBinding Binding; 65bdd1243dSDimitry Andric // Global variable and offset for each constant. 66bdd1243dSDimitry Andric std::vector<std::pair<llvm::GlobalVariable *, unsigned>> Constants; 67bdd1243dSDimitry Andric llvm::StructType *LayoutStruct = nullptr; 68bdd1243dSDimitry Andric }; 69bdd1243dSDimitry Andric 7081ad6265SDimitry Andric protected: 7181ad6265SDimitry Andric CodeGenModule &CGM; 7281ad6265SDimitry Andric 73bdd1243dSDimitry Andric llvm::Value *emitInputSemantic(llvm::IRBuilder<> &B, const ParmVarDecl &D, 74bdd1243dSDimitry Andric llvm::Type *Ty); 75bdd1243dSDimitry Andric 7681ad6265SDimitry Andric public: 7781ad6265SDimitry Andric CGHLSLRuntime(CodeGenModule &CGM) : CGM(CGM) {} 7881ad6265SDimitry Andric virtual ~CGHLSLRuntime() {} 7981ad6265SDimitry Andric 80bdd1243dSDimitry Andric void annotateHLSLResource(const VarDecl *D, llvm::GlobalVariable *GV); 81bdd1243dSDimitry Andric void generateGlobalCtorDtorCalls(); 82bdd1243dSDimitry Andric 83bdd1243dSDimitry Andric void addBuffer(const HLSLBufferDecl *D); 8481ad6265SDimitry Andric void finishCodeGen(); 85bdd1243dSDimitry Andric 86bdd1243dSDimitry Andric void setHLSLEntryAttributes(const FunctionDecl *FD, llvm::Function *Fn); 87bdd1243dSDimitry Andric 88bdd1243dSDimitry Andric void emitEntryFunction(const FunctionDecl *FD, llvm::Function *Fn); 89bdd1243dSDimitry Andric void setHLSLFunctionAttributes(llvm::Function *, const FunctionDecl *); 90bdd1243dSDimitry Andric 91bdd1243dSDimitry Andric private: 92bdd1243dSDimitry Andric void addBufferResourceAnnotation(llvm::GlobalVariable *GV, 93bdd1243dSDimitry Andric llvm::StringRef TyName, 94bdd1243dSDimitry Andric llvm::hlsl::ResourceClass RC, 95*5f757f3fSDimitry Andric llvm::hlsl::ResourceKind RK, bool IsROV, 96bdd1243dSDimitry Andric BufferResBinding &Binding); 97bdd1243dSDimitry Andric void addConstant(VarDecl *D, Buffer &CB); 98bdd1243dSDimitry Andric void addBufferDecls(const DeclContext *DC, Buffer &CB); 99bdd1243dSDimitry Andric llvm::SmallVector<Buffer> Buffers; 10081ad6265SDimitry Andric }; 10181ad6265SDimitry Andric 10281ad6265SDimitry Andric } // namespace CodeGen 10381ad6265SDimitry Andric } // namespace clang 10481ad6265SDimitry Andric 10581ad6265SDimitry Andric #endif 106