summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/SymbolFile/NativePDB
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2018-11-09 16:29:19 +0000
committerZachary Turner <zturner@google.com>2018-11-09 16:29:19 +0000
commitd2ee4c6ddb065ef74d7e7e6aee7a3f8ada88ae7e (patch)
tree016c725b2e6dddb18d54a7fe0ee066d4bd88216c /lldb/source/Plugins/SymbolFile/NativePDB
parentd0c71609c52db321555672a7a827488d57b517ca (diff)
downloadbcm5719-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.cpp24
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();
OpenPOWER on IntegriCloud