diff --git a/IDEHelper/Backend/BeCOFFObject.cpp b/IDEHelper/Backend/BeCOFFObject.cpp index 8c9026b3..3ef70a7a 100644 --- a/IDEHelper/Backend/BeCOFFObject.cpp +++ b/IDEHelper/Backend/BeCOFFObject.cpp @@ -1880,8 +1880,14 @@ void BeCOFFObject::WriteConst(BeCOFFSection& sect, BeConstant* constVal) } else if (constStruct->mType->mTypeCode == BeTypeCode_SizedArray) { + BeSizedArrayType* arrayType = (BeSizedArrayType*)constStruct->mType; for (auto& memberVal : constStruct->mMemberValues) + { WriteConst(sect, memberVal); + int padding = arrayType->mElementType->GetStride() - arrayType->mElementType->mSize; + if (padding > 0) + sect.mData.WriteZeros(padding); + } } else BF_FATAL("Invalid StructConst type"); diff --git a/IDEHelper/Backend/BeIRCodeGen.cpp b/IDEHelper/Backend/BeIRCodeGen.cpp index 4aef0132..884244e5 100644 --- a/IDEHelper/Backend/BeIRCodeGen.cpp +++ b/IDEHelper/Backend/BeIRCodeGen.cpp @@ -899,8 +899,10 @@ void BeIRCodeGen::Read(BeValue*& beValue) } else if (constType == BfConstType_Undef) { - CMD_PARAM(BeType*, type); - beValue = mBeModule->CreateUndefValue(type); + CMD_PARAM(BeType*, type); + auto constUndef = mBeModule->mOwnedValues.Alloc(); + constUndef->mType = type; + beValue = constUndef; return; } else if (constType == BfConstType_TypeOf) diff --git a/IDEHelper/Backend/BeMCContext.cpp b/IDEHelper/Backend/BeMCContext.cpp index a3dc9aa2..c8d3471e 100644 --- a/IDEHelper/Backend/BeMCContext.cpp +++ b/IDEHelper/Backend/BeMCContext.cpp @@ -2949,7 +2949,7 @@ void BeMCContext::CreateStore(BeMCInstKind instKind, const BeMCOperand& val, con //AllocInst(instKind, destOperand, elementVal); CreateStore(instKind, elementVal, destOperand); - offset += elemType->mSize; + offset += elemType->GetStride(); } return; } diff --git a/IDEHelper/Backend/BeModule.cpp b/IDEHelper/Backend/BeModule.cpp index ed137086..8fcded15 100644 --- a/IDEHelper/Backend/BeModule.cpp +++ b/IDEHelper/Backend/BeModule.cpp @@ -1348,6 +1348,16 @@ void BeDumpContext::ToString(StringImpl& str, BeValue* value, bool showType, boo return; } + if (auto constant = BeValueDynCast(value)) + { + if (showType) + { + BeModule::ToString(str, constant->mType); + str += " "; + } + str += "undef"; + } + if (auto constant = BeValueDynCast(value)) { ToString(str, constant->mType); diff --git a/IDEHelper/Backend/BeModule.h b/IDEHelper/Backend/BeModule.h index a960732e..8b6d2b27 100644 --- a/IDEHelper/Backend/BeModule.h +++ b/IDEHelper/Backend/BeModule.h @@ -403,12 +403,25 @@ public: virtual void HashContent(BeHashContext& hashCtx) override { hashCtx.Mixin(TypeId); + hashCtx.Mixin(mType); hashCtx.Mixin(mMemberValues.size()); for (auto member : mMemberValues) member->HashReference(hashCtx); } }; +class BeUndefConstant : public BeConstant +{ +public: + BE_VALUE_TYPE(BeUndefConstant, BeConstant); + + virtual void HashContent(BeHashContext& hashCtx) override + { + hashCtx.Mixin(mType); + hashCtx.Mixin(TypeId); + } +}; + class BeStringConstant : public BeConstant { public: