diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.cpp b/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.cpp index 10ca9770..8ddf1b62 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.cpp @@ -21,3 +21,8 @@ bool Variable::GetForceAlignment() const { return m_has_alignment_override || m_type_declaration->GetForceAlignment(); } + +unsigned Variable::GetOffset(const WordSize wordSize) const +{ + return m_offset[std::to_underlying(wordSize)]; +} diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.h b/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.h index a2117a6a..1a9f09e4 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.h @@ -12,10 +12,11 @@ public: [[nodiscard]] unsigned GetAlignment(WordSize wordSize) const; [[nodiscard]] bool GetForceAlignment() const; + [[nodiscard]] unsigned GetOffset(WordSize wordSize) const; std::string m_name; bool m_has_alignment_override; unsigned m_alignment_override; - unsigned m_offset; + unsigned m_offset[WORD_SIZE_COUNT]; std::unique_ptr m_type_declaration; }; diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp index 8377449d..5a6803a4 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp @@ -65,7 +65,7 @@ namespace { if (!member->m_member->m_name.empty() && !member->m_member->m_type_declaration->m_has_custom_bit_size) { - LINEF("REQUIRE(offsetof({0}, {1}) == {2});", structure->m_definition->GetFullName(), member->m_member->m_name, member->m_member->m_offset) + LINEF("REQUIRE(offsetof({0}, {1}) == {2});", structure->m_definition->GetFullName(), member->m_member->m_name, member->m_member->GetOffset(m_env.m_word_size)) } } diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BasePerVariantTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BasePerVariantTemplate.cpp index bc3064e4..ff2dfcc4 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BasePerVariantTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BasePerVariantTemplate.cpp @@ -45,7 +45,7 @@ size_t BasePerVariantTemplate::OffsetForMemberModifier(const MemberInformation& const DeclarationModifierComputations& modifier, const size_t nestedBaseOffset) const { - size_t curOffset = memberInfo.m_member->m_offset; + size_t curOffset = memberInfo.m_member->GetOffset(m_env.m_word_size); auto curLevel = 0u; for (const auto index : modifier.GetArrayIndices()) diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp index 02f71547..cbcbb16f 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp @@ -390,7 +390,8 @@ namespace } else { - LINEF("fillAccessor.Fill({0}[0], {1});", MakeMemberAccess(&structInfo, &memberInfo, modifier), memberInfo.m_member->m_offset) + LINEF( + "fillAccessor.Fill({0}[0], {1});", MakeMemberAccess(&structInfo, &memberInfo, modifier), memberInfo.m_member->GetOffset(m_env.m_word_size)) } LINEF("for (auto i = 1uz; i < dynamicArraySize; i++)", structInfo.m_definition->m_name, memberInfo.m_member->m_name) @@ -507,7 +508,7 @@ namespace } else if (memberInfo.m_member->m_name.empty()) { - const auto anonymousMemberOffset = memberInfo.m_member->m_offset + nestedBaseOffset; + const auto anonymousMemberOffset = memberInfo.m_member->GetOffset(m_env.m_word_size) + nestedBaseOffset; for (const auto& anonymousMember : memberInfo.m_type->m_ordered_members) { PrintFillStruct_Member(structInfo, *anonymousMember, DeclarationModifierComputations(anonymousMember.get()), anonymousMemberOffset); @@ -734,7 +735,7 @@ namespace { LINEF("return LoadDynamicFill_{0}(fillAccessor.AtOffset({1})) + offsetof({2}, {3});", MakeSafeTypeName(member.m_type->m_definition), - member.m_member->m_offset, + member.m_member->GetOffset(m_env.m_word_size), info.m_definition->GetFullName(), member.m_member->m_name) } @@ -774,7 +775,7 @@ namespace const StructureComputations structureComputations(&info); const auto dynamicMember = structureComputations.GetDynamicMember(); - LINEF("const auto fillAccessor = m_stream.AppendToFill({0}).AtOffset(parentFill.Offset());", dynamicMember->m_member->m_offset) + LINEF("const auto fillAccessor = m_stream.AppendToFill({0}).AtOffset(parentFill.Offset());", dynamicMember->m_member->GetOffset(m_env.m_word_size)) LINE("") for (const auto& member : info.m_ordered_members) diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp index 2282402f..90addf80 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp @@ -844,7 +844,7 @@ namespace std::string MakeReusableInnerOffset(const DataDefinition* dataDefinition, const Variable* member) const { if (m_env.m_word_size_mismatch) - return std::to_string(member->m_offset); + return std::to_string(member->GetOffset(m_env.m_word_size)); return std::format("offsetof({0}, {1})", dataDefinition->GetFullName(), member->m_name); } @@ -1138,7 +1138,7 @@ namespace LINE("{") m_intendation++; LINEF("const auto fillAccessor = m_stream->WriteWithFill({0});", - dynamicMember == nullptr ? info->m_definition->GetSize(m_env.m_word_size) : dynamicMember->m_member->m_offset) + dynamicMember == nullptr ? info->m_definition->GetSize(m_env.m_word_size) : dynamicMember->m_member->GetOffset(m_env.m_word_size)) LINEF("{0} = fillAccessor.Offset();", MakeTypeWrittenVarName(info->m_definition)) LINEF("FillStruct_{0}(fillAccessor);", MakeSafeTypeName(info->m_definition)) m_intendation--; @@ -1310,7 +1310,7 @@ namespace } else if (memberInfo.m_member->m_name.empty()) { - const auto anonymousMemberOffset = memberInfo.m_member->m_offset + nestedBaseOffset; + const auto anonymousMemberOffset = memberInfo.m_member->GetOffset(m_env.m_word_size) + nestedBaseOffset; for (const auto& anonymousMember : memberInfo.m_type->m_ordered_members) { PrintFillStruct_Member(structInfo, *anonymousMember, DeclarationModifierComputations(anonymousMember.get()), anonymousMemberOffset); diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.cpp index 2a68d594..447a4bf0 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.cpp @@ -119,7 +119,7 @@ namespace if (member->m_type_declaration->m_has_custom_bit_size) { - member->m_offset = definitionSize + currentBitOffset / 8; + member->m_offset[std::to_underlying(wordSize)] = definitionSize + currentBitOffset / 8; currentBitOffset += member->m_type_declaration->m_custom_bit_size; } else @@ -135,7 +135,7 @@ namespace utils::Align(definitionSize, member->GetForceAlignment() ? member->GetAlignment(wordSize) : std::min(member->GetAlignment(wordSize), definition->m_pack)); - member->m_offset = definitionSize; + member->m_offset[std::to_underlying(wordSize)] = definitionSize; definitionSize += member->m_type_declaration->GetSize(wordSize); } @@ -162,11 +162,10 @@ namespace if (!CalculateFields(repository, member->m_type_declaration.get(), wordSize)) return false; - member->m_offset = 0; + member->m_offset[std::to_underlying(wordSize)] = 0; const auto memberSize = member->m_type_declaration->GetSize(wordSize); - if (memberSize > definitionSize) - definitionSize = memberSize; + definitionSize = std::max(memberSize, definitionSize); } definitionSize = utils::Align(definitionSize, definition->m_alignment[std::to_underlying(wordSize)]);