| //===- 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 "llvm/ADT/StringRef.h" | |
| #include "llvm/IR/DerivedTypes.h" | |
| namespace clang { | |
| class RecordType; | |
| class FieldDecl; | |
| namespace CodeGen { | |
| class CodeGenModule; | |
| //===----------------------------------------------------------------------===// | |
| // Implementation of constant buffer layout common between DirectX and | |
| // SPIR/SPIR-V. | |
| //===----------------------------------------------------------------------===// | |
| class HLSLBufferLayoutBuilder { | |
| private: | |
| CodeGenModule &CGM; | |
| llvm::StringRef LayoutTypeName; | |
| public: | |
| HLSLBufferLayoutBuilder(CodeGenModule &CGM, llvm::StringRef LayoutTypeName) | |
| : CGM(CGM), LayoutTypeName(LayoutTypeName) {} | |
| // Returns LLVM target extension type with the name LayoutTypeName | |
| // for given structure type and layout data. The first number in | |
| // the Layout is the size followed by offsets for each struct element. | |
| llvm::TargetExtType * | |
| createLayoutType(const RecordType *StructType, | |
| const llvm::SmallVector<int32_t> *Packoffsets = nullptr); | |
| private: | |
| bool layoutField(const clang::FieldDecl *FD, unsigned &EndOffset, | |
| unsigned &FieldOffset, llvm::Type *&FieldType, | |
| int Packoffset = -1); | |
| }; | |
| } // namespace CodeGen | |
| } // namespace clang |