From d9de51a019f4f53e90c922959f6d1935107cfded Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 13 Feb 2024 06:06:39 -0500 Subject: [PATCH] Properly fill in padding members in innerconst aggs --- IDEHelper/Backend/BeIRCodeGen.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/IDEHelper/Backend/BeIRCodeGen.cpp b/IDEHelper/Backend/BeIRCodeGen.cpp index eaf5777e..ee44dc6c 100644 --- a/IDEHelper/Backend/BeIRCodeGen.cpp +++ b/IDEHelper/Backend/BeIRCodeGen.cpp @@ -429,6 +429,33 @@ void BeIRCodeGen::FixValues(BeStructType* structType, CmdParamVec& val } } +void BeIRCodeGen::FixValues(BeStructType* structType, SizedArrayImpl& values) +{ + if (values.size() >= structType->mMembers.size()) + return; + + int readIdx = values.size() - 1; + values.resize(structType->mMembers.size()); + for (int i = (int)values.size() - 1; i >= 0; i--) + { + if (mBeContext->AreTypesEqual(values[readIdx]->GetType(), structType->mMembers[i].mType)) + { + values[i] = values[readIdx]; + readIdx--; + } + else if (structType->mMembers[i].mType->IsSizedArray()) + { + auto beConst = mBeModule->mAlloc.Alloc(); + beConst->mType = structType->mMembers[i].mType; + values[i] = beConst; + } + else + { + FatalError("Malformed structure values"); + } + } +} + void BeIRCodeGen::Init(const BfSizedArray& buffer) { BP_ZONE("BeIRCodeGen::Init"); @@ -905,6 +932,10 @@ void BeIRCodeGen::Read(BeValue*& beValue) constStruct->mMemberValues.Add(constant); } + + if (type->IsStruct()) + FixValues((BeStructType*)type, constStruct->mMemberValues); + beValue = constStruct; BE_MEM_END("ParamType_Const_Array");