Fix how we handle bit-fields for Objective-C when creating an AST
authorshafik <syaghmour@apple.com>
Mon, 20 Jul 2020 23:09:18 +0000 (16:09 -0700)
committershafik <syaghmour@apple.com>
Mon, 20 Jul 2020 23:12:29 +0000 (16:12 -0700)
commita54c42df9a7261eafc9291128be4ff5217302dd3
tree6e4066c6ea46749192997f5a96e2edfccf400ee1
parent8ed021382e6b1d00bf907ac595b5493a02355c2c
Fix how we handle bit-fields for Objective-C when creating an AST

Currently expressions dealing with bit-fields in Objective-C objects is pretty broken. When generating debug-info for Objective-C bit-fields DW_AT_data_bit_offset has a different meaning than it does to C and C++.
When we parse the DWARF we validate bit offsets for C and C++ correctly but not for ObjC. For ObjC in some cases we end up incorrectly flagging an error and we don't generate further bit-fields in the AST.
Later on when we do a name lookup we don't find the ObjCIvarDecl in the ObjCInterfaceDecl in some cases since we never added it and then we don't go to the runtime to obtain the offset.

This will fix how we handle bit-fields for the Objective-C case and add tests to verify this fix but also to documents areas that still don't work and will be addressed in follow-up PRs.

Note: we can never correctly calculate offsets statically because of how Objective-C deals with the fragile base class issue. Which means the runtime may need to shift fields over.

Differential Revision: https://reviews.llvm.org/D83433
lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
lldb/test/API/lang/objc/bitfield_ivars/Makefile [new file with mode: 0644]
lldb/test/API/lang/objc/bitfield_ivars/TestBitfieldIvars.py
lldb/test/API/lang/objc/bitfield_ivars/main.m