[Lldb-commits] [PATCH] D134849: [LLDB][NativePDB] Fix struct layout when it has anonymous unions.
Pavel Labath via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Thu Oct 13 03:36:16 PDT 2022
labath accepted this revision.
labath added a comment.
This revision is now accepted and ready to land.
Looks good. I suggested some changes, which I hope will reduce duplication and better empasize the differences between the various branches in the code. I think I understand the algorithm now, and I believe it is ok, though I can't escape the feeling that this could have been done in a simpler way.
================
Comment at: lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp:459-469
+ if (parent->kind == Member::Struct) {
+ parent->fields.push_back(std::move(fields.back()));
+ end_offset_map[end_offset].push_back(parent);
+ } else {
+ lldbassert(parent == &record &&
+ "If parent is union, it must be the top level record.");
+ MemberUP anonymous_struct = std::make_unique<Member>(Member::Struct);
----------------
The current version will create a needless nested struct in case of a union with a single member. I think it should be possible to just insert a single field first, and let it be converted to a struct later -- if it is necessary.
================
Comment at: lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp:471-491
+ if (parent->kind == Member::Struct) {
+ MemberUP anonymous_union = std::make_unique<Member>(Member::Union);
+ for (auto &field : fields) {
+ int64_t bit_size = field->bit_size;
+ anonymous_union->fields.push_back(std::move(field));
+ end_offset_map[offset + bit_size].push_back(
+ anonymous_union->fields.back().get());
----------------
This should be equivalent but shorter, and -- I hope -- more obvious.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D134849/new/
https://reviews.llvm.org/D134849
More information about the lldb-commits
mailing list