[Lldb-commits] [PATCH] D134849: [LLDB][NativePDB] Fix struct layout when it has anonymous unions.
Zequan Wu via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Wed Oct 12 14:43:23 PDT 2022
zequanwu added inline comments.
================
Comment at: lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp:459
+ uint64_t end_offset = offset + fields.back()->bit_size;
+ parent->fields.push_back(fields.back());
+ end_offset_map[end_offset].push_back(parent);
----------------
labath wrote:
> zequanwu wrote:
> > labath wrote:
> > > Can `parent` be a union here? Would the algorithm still be correct?
> > `parent` could only be union when the top level record is a union (at this line `Member *parent = &record;`). That's the only case when we add an union into `end_offset_map`. In that case, all the fields would start at the same offset and we only iterate the loop `for (auto &pair : fields) {` once and then we are done.
> > Otherwise, we only insert {end offset, struct/field} into `end_offset_map` where field must be within an union.
> Are you sure about that? I've created what I think is a [[ https://reviews.llvm.org/D135768 | counterexample ]] to these statements. Here a top-level union contains a bunch of sequential fields, which is perfectly possible if the only member of that union is an anonymous struct which contains those fields.
>
> I don't think that's what supposed to happen in this case, but I'm open to being convinced otherwise.
>
> (I've also rewritten the test logic so it produces better error messages than "false is not true".)
Thanks for writing the counter example and making better error message. I appended your changes in this file.
I updated to handle the case when parent is an union here by creating an anonymous struct to hold it.
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