fix: not differentiating wordsize in offset field

This commit is contained in:
Jan Laupetin committed 2026-10-22 20:01:06 +02:00
1 parent ca890bc236
commit 6fc988a079
7 files changed
+21 -15

No files matched your search

@@ -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)];
}
@@ -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<TypeDeclaration> m_type_declaration;
};
@@ -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))
}
}
@@ -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())
@@ -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)
@@ -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);
@@ -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)]);