#pragma once #ifndef MKQL_DISABLE_CODEGEN #include #include #include #include #include #include namespace NKikimr::NMiniKQL { template class TLLVMFieldsStructure; template class TLLVMFieldsStructure> { protected: llvm::LLVMContext& Context; ui32 GetFieldsCount() const { return FieldsCount; } const std::vector& GetFields() const { return Fields; } private: llvm::PointerType* StructPtrType; std::vector Fields; const ui32 FieldsCount; std::vector BuildFields() { std::vector result; result.emplace_back(StructPtrType); // vtbl result.emplace_back(llvm::Type::getInt32Ty(Context)); // ref result.emplace_back(llvm::Type::getInt16Ty(Context)); // abi result.emplace_back(llvm::Type::getInt16Ty(Context)); // reserved #ifndef NDEBUG result.emplace_back(StructPtrType); // meminfo #endif return result; } public: TLLVMFieldsStructure(llvm::LLVMContext& context) : Context(context) , StructPtrType(llvm::PointerType::getUnqual(llvm::StructType::get(Context))) , Fields(BuildFields()) , FieldsCount(Fields.size()) { } llvm::Constant* This() const { return llvm::ConstantInt::get(llvm::Type::getInt32Ty(Context), 0); } const std::vector& GetFieldsArray() const { return Fields; } }; } #endif