diff options
| author | Zachary Turner <zturner@google.com> | 2018-11-09 16:29:19 +0000 |
|---|---|---|
| committer | Zachary Turner <zturner@google.com> | 2018-11-09 16:29:19 +0000 |
| commit | d2ee4c6ddb065ef74d7e7e6aee7a3f8ada88ae7e (patch) | |
| tree | 016c725b2e6dddb18d54a7fe0ee066d4bd88216c /lldb/source/Plugins/SymbolFile/NativePDB | |
| parent | d0c71609c52db321555672a7a827488d57b517ca (diff) | |
| download | bcm5719-llvm-d2ee4c6ddb065ef74d7e7e6aee7a3f8ada88ae7e.tar.gz bcm5719-llvm-d2ee4c6ddb065ef74d7e7e6aee7a3f8ada88ae7e.zip | |
[NativePDB] Add support for bitfield records.
Bitfields are represented as LF_MEMBER records whose TypeIndex
points to an LF_BITFIELD record that describes the bit width,
bit offset, and underlying type of the bitfield. All we need to
do is resolve these when resolving record types.
llvm-svn: 346511
Diffstat (limited to 'lldb/source/Plugins/SymbolFile/NativePDB')
| -rw-r--r-- | lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp index 432ba9ecea7..dfca59d9881 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp @@ -123,17 +123,33 @@ Error UdtRecordCompleter::visitKnownMember(CVMemberRecord &cvr, Error UdtRecordCompleter::visitKnownMember(CVMemberRecord &cvr, DataMemberRecord &data_member) { - TypeSP member_type = m_symbol_file.GetOrCreateType(data_member.Type); - CompilerType complete_member_type = member_type->GetFullCompilerType(); + uint64_t offset = data_member.FieldOffset * 8; + uint32_t bitfield_width = 0; + + TypeSP member_type; + TpiStream &tpi = m_symbol_file.m_index->tpi(); + TypeIndex ti(data_member.Type); + if (!ti.isSimple()) { + CVType cvt = tpi.getType(ti); + if (cvt.kind() == LF_BITFIELD) { + BitFieldRecord bfr; + llvm::cantFail(TypeDeserializer::deserializeAs<BitFieldRecord>(cvt, bfr)); + offset += bfr.BitOffset; + bitfield_width = bfr.BitSize; + ti = bfr.Type; + } + } + member_type = m_symbol_file.GetOrCreateType(ti); + CompilerType complete_member_type = member_type->GetFullCompilerType(); lldb::AccessType access = TranslateMemberAccess(data_member.getAccess()); clang::FieldDecl *decl = ClangASTContext::AddFieldToRecordType( - m_derived_ct, data_member.Name, complete_member_type, access, 0); + m_derived_ct, data_member.Name, complete_member_type, access, + bitfield_width); // FIXME: Add a PdbSymUid namespace for field list members and update // the m_uid_to_decl map with this decl. - uint64_t offset = data_member.FieldOffset * 8; m_layout.field_offsets.insert(std::make_pair(decl, offset)); return Error::success(); |

