diff --git a/oi/type_graph/AlignmentCalc.cpp b/oi/type_graph/AlignmentCalc.cpp index cf23eff..9abad71 100644 --- a/oi/type_graph/AlignmentCalc.cpp +++ b/oi/type_graph/AlignmentCalc.cpp @@ -50,24 +50,26 @@ void AlignmentCalc::accept(Type& type) { void AlignmentCalc::visit(Class& c) { RecursiveVisitor::visit(c); - uint64_t alignment = 1; - for (auto& member : c.members) { - if (member.align == 0) { - // If the member does not have an explicit alignment, calculate it from - // the member's type. - accept(member.type()); - member.align = member.type().align(); - } - alignment = std::max(alignment, member.align); + if (c.align() == 0) { + uint64_t alignment = 1; + for (auto& member : c.members) { + if (member.align == 0) { + // If the member does not have an explicit alignment, calculate it from + // the member's type. + accept(member.type()); + member.align = member.type().align(); + } + alignment = std::max(alignment, member.align); - if (member.align != 0 && (member.bitOffset / 8) % member.align != 0) { - // Mark as packed if members are not aligned - c.setPacked(); + if (member.align != 0 && (member.bitOffset / 8) % member.align != 0) { + // Mark as packed if members are not aligned + c.setPacked(); + } } + + c.setAlign(alignment); } - c.setAlign(alignment); - if (c.size() % c.align() != 0) { // Mark as packed if there is no tail padding c.setPacked(); diff --git a/oi/type_graph/ClangTypeParser.cpp b/oi/type_graph/ClangTypeParser.cpp index 40f3a69..5280aa1 100644 --- a/oi/type_graph/ClangTypeParser.cpp +++ b/oi/type_graph/ClangTypeParser.cpp @@ -178,7 +178,7 @@ Type& ClangTypeParser::enumerateClass(const clang::RecordType& ty) { if (auto* info = getContainerInfo(fqName)) { auto& c = makeType(ty, *info, size, nullptr); enumerateClassTemplateParams(ty, c.templateParams); - c.setAlign(ast->getTypeAlign(clang::QualType(&ty, 0))); + c.setAlign(ast->getTypeAlign(clang::QualType(&ty, 0)) / 8); return c; } @@ -197,6 +197,7 @@ Type& ClangTypeParser::enumerateClass(const clang::RecordType& ty) { auto& c = makeType( ty, kind, std::move(name), std::move(fqName), size, virtuality); + c.setAlign(ast->getTypeAlign(clang::QualType(&ty, 0)) / 8); enumerateClassTemplateParams(ty, c.templateParams); // enumerateClassParents(type, c.parents); @@ -317,7 +318,6 @@ void ClangTypeParser::enumerateClassMembers(const clang::RecordType& ty, auto& mtype = enumerateType(*qualType); Member m{mtype, std::move(member_name), offset_in_bits, size_in_bits}; - m.align = decl->getASTContext().getTypeAlign(qualType) / 8; members.push_back(m); }