From a98fac28aa7636998158a3ac1bf764bf14ca8570 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Tue, 24 Mar 2015 18:56:08 +0000 Subject: Fix error introduced by changing function signatures. Since ClangASTSource::layoutRecordType() was overriding a virtual function in the base, this was inadvertently causing a new method to be introduced rather than an override. To fix this all method signatures are changed back to taking DenseMaps, and the `override` keyword is added to make sure this type of error doesn't happen again. To keep the original fix intact, which is that fields and bases must be added in offset order, the ImportOffsetMap() function now copies the DenseMap into a vector and then sorts the vector on the value type (e.g. the offset) before iterating over the sorted vector and inserting the items. llvm-svn: 233099 --- .../Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 70 ++++++++++++---------- .../Plugins/SymbolFile/DWARF/SymbolFileDWARF.h | 21 ++++--- .../SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp | 10 ++-- .../SymbolFile/DWARF/SymbolFileDWARFDebugMap.h | 9 ++- 4 files changed, 59 insertions(+), 51 deletions(-) (limited to 'lldb/source/Plugins/SymbolFile') diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 6df5768e964..a546542ca91 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -2074,7 +2074,7 @@ SymbolFileDWARF::ParseChildMembers accessibility, anon_field_info.bit_size); - layout_info.field_offsets.push_back( + layout_info.field_offsets.insert( std::make_pair(unnamed_bitfield_decl, anon_field_info.bit_offset)); } } @@ -2126,7 +2126,7 @@ SymbolFileDWARF::ParseChildMembers GetClangASTContext().SetMetadataAsUserID (field_decl, MakeUserID(die->GetOffset())); - layout_info.field_offsets.push_back(std::make_pair(field_decl, field_bit_offset)); + layout_info.field_offsets.insert(std::make_pair(field_decl, field_bit_offset)); } else { @@ -2287,7 +2287,7 @@ SymbolFileDWARF::ParseChildMembers } else { - layout_info.base_offsets.push_back( + layout_info.base_offsets.insert( std::make_pair(base_class_clang_type.GetAsCXXRecordDecl(), clang::CharUnits::fromQuantity(member_byte_offset))); } @@ -2670,36 +2670,46 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (ClangASTType &clang_type) static_cast(layout_info.base_offsets.size()), static_cast(layout_info.vbase_offsets.size())); - for (const auto &entry : layout_info.field_offsets) + uint32_t idx; + { + llvm::DenseMap::const_iterator pos, + end = layout_info.field_offsets.end(); + for (idx = 0, pos = layout_info.field_offsets.begin(); pos != end; ++pos, ++idx) { GetObjectFile()->GetModule()->LogMessage( log, "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) field[%u] = " "{ bit_offset=%u, name='%s' }", - static_cast(clang_type.GetOpaqueQualType()), entry.first->getFieldIndex(), - static_cast(entry.second), entry.first->getNameAsString().c_str()); + static_cast(clang_type.GetOpaqueQualType()), idx, + static_cast(pos->second), pos->first->getNameAsString().c_str()); + } } - uint32_t idx = 0; - for (const auto &entry : layout_info.base_offsets) { - GetObjectFile()->GetModule()->LogMessage( - log, "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) base[%u] = { " - "byte_offset=%u, name='%s' }", - clang_type.GetOpaqueQualType(), idx, (uint32_t)entry.second.getQuantity(), - entry.first->getNameAsString().c_str()); - ++idx; + llvm::DenseMap::const_iterator base_pos, + base_end = layout_info.base_offsets.end(); + for (idx = 0, base_pos = layout_info.base_offsets.begin(); base_pos != base_end; + ++base_pos, ++idx) + { + GetObjectFile()->GetModule()->LogMessage( + log, "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) base[%u] " + "= { byte_offset=%u, name='%s' }", + clang_type.GetOpaqueQualType(), idx, (uint32_t)base_pos->second.getQuantity(), + base_pos->first->getNameAsString().c_str()); + } } - - idx = 0; - for (const auto &entry : layout_info.vbase_offsets) { - GetObjectFile()->GetModule()->LogMessage( - log, "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) vbase[%u] = " - "{ byte_offset=%u, name='%s' }", - static_cast(clang_type.GetOpaqueQualType()), idx, - static_cast(entry.second.getQuantity()), - entry.first->getNameAsString().c_str()); - ++idx; + llvm::DenseMap::const_iterator vbase_pos, + vbase_end = layout_info.vbase_offsets.end(); + for (idx = 0, vbase_pos = layout_info.vbase_offsets.begin(); vbase_pos != vbase_end; + ++vbase_pos, ++idx) + { + GetObjectFile()->GetModule()->LogMessage( + log, "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) " + "vbase[%u] = { byte_offset=%u, name='%s' }", + static_cast(clang_type.GetOpaqueQualType()), idx, + static_cast(vbase_pos->second.getQuantity()), + vbase_pos->first->getNameAsString().c_str()); + } } } m_record_decl_to_layout_map.insert(std::make_pair(record_decl, layout_info)); @@ -7933,9 +7943,9 @@ SymbolFileDWARF::FindExternalVisibleDeclsByName (void *baton, bool SymbolFileDWARF::LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, - std::vector> &field_offsets, - std::vector> &base_offsets, - std::vector> &vbase_offsets) + llvm::DenseMap &field_offsets, + llvm::DenseMap &base_offsets, + llvm::DenseMap &vbase_offsets) { SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; return symbol_file_dwarf->LayoutRecordType (record_decl, size, alignment, field_offsets, base_offsets, vbase_offsets); @@ -7943,9 +7953,9 @@ SymbolFileDWARF::LayoutRecordType(void *baton, const clang::RecordDecl *record_d bool SymbolFileDWARF::LayoutRecordType(const clang::RecordDecl *record_decl, uint64_t &bit_size, uint64_t &alignment, - std::vector> &field_offsets, - std::vector> &base_offsets, - std::vector> &vbase_offsets) + llvm::DenseMap &field_offsets, + llvm::DenseMap &base_offsets, + llvm::DenseMap &vbase_offsets) { Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO)); RecordDeclToLayoutMap::iterator pos = m_record_decl_to_layout_map.find (record_decl); diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index 4551d6ef56b..981e3551460 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -151,16 +151,15 @@ public: clang::DeclarationName Name, llvm::SmallVectorImpl *results); - static bool - LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, - std::vector> &FieldOffsets, - std::vector> &BaseOffsets, - std::vector> &VirtualBaseOffsets); + static bool LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, + llvm::DenseMap &field_offsets, + llvm::DenseMap &base_offsets, + llvm::DenseMap &vbase_offsets); bool LayoutRecordType(const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, - std::vector> &FieldOffsets, - std::vector> &BaseOffsets, - std::vector> &VirtualBaseOffsets); + llvm::DenseMap &field_offsets, + llvm::DenseMap &base_offsets, + llvm::DenseMap &vbase_offsets); struct LayoutInfo { @@ -174,9 +173,9 @@ public: } uint64_t bit_size; uint64_t alignment; - std::vector> field_offsets; - std::vector> base_offsets; - std::vector> vbase_offsets; + llvm::DenseMap field_offsets; + llvm::DenseMap base_offsets; + llvm::DenseMap vbase_offsets; }; //------------------------------------------------------------------ // PluginInterface protocol diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index eeb3ef8242a..9636028d0f5 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -1475,11 +1475,11 @@ SymbolFileDWARFDebugMap::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInte } bool -SymbolFileDWARFDebugMap::LayoutRecordType( - void *baton, const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, - std::vector> &field_offsets, - std::vector> &base_offsets, - std::vector> &vbase_offsets) +SymbolFileDWARFDebugMap::LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &size, + uint64_t &alignment, + llvm::DenseMap &field_offsets, + llvm::DenseMap &base_offsets, + llvm::DenseMap &vbase_offsets) { SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton; SymbolFileDWARF *oso_dwarf; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index cecd6396784..d4400eb78e6 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -103,11 +103,10 @@ public: static void CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *); - static bool - LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, - std::vector> &FieldOffsets, - std::vector> &BaseOffsets, - std::vector> &VirtualBaseOffsets); + static bool LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, + llvm::DenseMap &field_offsets, + llvm::DenseMap &base_offsets, + llvm::DenseMap &vbase_offsets); //------------------------------------------------------------------ // PluginInterface protocol -- cgit v1.2.3