Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR, DataMemberRecord &Field) { printMemberAttributes(Field.getAccess(), MethodKind::Vanilla, MethodOptions::None); printTypeIndex("Type", Field.getType()); W->printHex("FieldOffset", Field.getFieldOffset()); W->printString("Name", Field.getName()); return Error::success(); }
void CVTypeDumperImpl::visitDataMember(TypeLeafKind Leaf, DataMemberRecord &Field) { DictScope S(W, "DataMember"); printMemberAttributes(Field.getAccess(), MethodKind::Vanilla, MethodOptions::None); printTypeIndex("Type", Field.getType()); W.printHex("FieldOffset", Field.getFieldOffset()); W.printString("Name", Field.getName()); Name = Field.getName(); }
Error UdtRecordCompleter::visitKnownMember(CVMemberRecord &cvr, DataMemberRecord &data_member) { uint64_t offset = data_member.FieldOffset * 8; uint32_t bitfield_width = 0; TypeIndex ti(data_member.Type); if (!ti.isSimple()) { CVType cvt = m_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; } } clang::QualType member_qt = m_ast_builder.GetOrCreateType(PdbTypeSymId(ti)); m_ast_builder.CompleteType(member_qt); lldb::AccessType access = TranslateMemberAccess(data_member.getAccess()); clang::FieldDecl *decl = ClangASTContext::AddFieldToRecordType( m_derived_ct, data_member.Name, m_ast_builder.ToCompilerType(member_qt), access, bitfield_width); // FIXME: Add a PdbSymUid namespace for field list members and update // the m_uid_to_decl map with this decl. m_layout.field_offsets.insert(std::make_pair(decl, offset)); return Error::success(); }