//===- HLSLBufferLayoutBuilder.h ------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// #include "clang/AST/TypeBase.h" #include "llvm/ADT/StringRef.h" #include "llvm/IR/DerivedTypes.h" namespace clang { namespace CodeGen { class CGHLSLOffsetInfo; class CodeGenModule; class CGHLSLOffsetInfo; //===----------------------------------------------------------------------===// // Implementation of constant buffer layout common between DirectX and // SPIR/SPIR-V. //===----------------------------------------------------------------------===// class HLSLBufferLayoutBuilder { private: CodeGenModule &CGM; public: HLSLBufferLayoutBuilder(CodeGenModule &CGM) : CGM(CGM) {} /// Lays out a struct type following HLSL buffer rules and considering any /// explicit offset information. Previously created layout structs are cached /// by CGHLSLRuntime. /// /// The function iterates over all fields of the record type (including base /// classes) and works out a padded llvm type to represent the buffer layout. /// /// If a non-empty OffsetInfo is provided (ie, from `packoffset` annotations /// in the source), any provided offsets offsets will be respected. If the /// OffsetInfo is available but has empty entries, those will be layed out at /// the end of the structure. llvm::StructType *layOutStruct(const RecordType *StructType, const CGHLSLOffsetInfo &OffsetInfo); /// Lays out an array type following HLSL buffer rules. llvm::Type *layOutArray(const ConstantArrayType *AT); /// Lays out a type following HLSL buffer rules. Arrays and structures will be /// padded appropriately and nested objects will be converted as appropriate. llvm::Type *layOutType(QualType Type); }; } // namespace CodeGen } // namespace clang