This is an archive of the discontinued LLVM Phabricator instance.

[lldb][DWARFASTParserClang] Don't create unnamed bitfields to account for vtable pointer
ClosedPublic

Authored by Michael137 on May 15 2023, 9:52 AM.

Details

Summary

Summary

When filling out the LayoutInfo for a structure with the offsets
from DWARF, LLDB fills gaps in the layout by creating unnamed
bitfields and adding them to the AST. If we don't do this correctly
and our layout has overlapping fields, we will hit an assertion
in clang::CGRecordLowering::lower(). Specifically, if we have
a derived class with a VTable and a bitfield immediately following
the vtable pointer, we create a layout with overlapping fields.

This is an oversight in some of the previous cleanups done around this
area.

In D76808, we prevented LLDB from creating unnamed bitfields if there
was a gap between the last field of a base class and the start of a bitfield
in the derived class.

In D112697, we started accounting for the vtable pointer. The intention
there was to make sure the offset bookkeeping accounted for the
existence of a vtable pointer (but we didn't actually want to create
any AST nodes for it). Now that last_field_info.bit_size was being
set even for artifical fields, the previous fix D76808 broke
specifically for cases where the bitfield was the first member of a
derived class with a vtable (this scenario wasn't tested so we didn't
notice it). I.e., we started creating redundant unnamed bitfields for
where the vtable pointer usually sits. This confused the lowering logic
in clang.

This patch adds a condition to ShouldCreateUnnamedBitfield which
checks whether the first field in the derived class is a vtable ptr.

Testing

  • Added API test case

Diff Detail

Event Timeline

Michael137 created this revision.May 15 2023, 9:52 AM
Herald added a project: Restricted Project. · View Herald Transcript
Michael137 requested review of this revision.May 15 2023, 9:52 AM
Herald added a project: Restricted Project. · View Herald TranscriptMay 15 2023, 9:52 AM
Michael137 edited the summary of this revision. (Show Details)May 15 2023, 9:54 AM
aprantl accepted this revision.May 15 2023, 10:04 AM
This revision is now accepted and ready to land.May 15 2023, 10:04 AM
  • Rephrase comment