//===- 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 |