Index: lldb/include/lldb/Symbol/ClangASTImporter.h =================================================================== --- lldb/include/lldb/Symbol/ClangASTImporter.h +++ lldb/include/lldb/Symbol/ClangASTImporter.h @@ -67,7 +67,7 @@ llvm::DenseMap &base_offsets, llvm::DenseMap - &vbase_offsets); + &vbase_offsets) const; bool CanImport(const CompilerType &type); Index: lldb/source/Symbol/ClangASTImporter.cpp =================================================================== --- lldb/source/Symbol/ClangASTImporter.cpp +++ lldb/source/Symbol/ClangASTImporter.cpp @@ -525,26 +525,23 @@ llvm::DenseMap &base_offsets, llvm::DenseMap - &vbase_offsets) { - RecordDeclToLayoutMap::iterator pos = + &vbase_offsets) const { + RecordDeclToLayoutMap::const_iterator pos = m_record_decl_to_layout_map.find(record_decl); - bool success = false; base_offsets.clear(); vbase_offsets.clear(); if (pos != m_record_decl_to_layout_map.end()) { bit_size = pos->second.bit_size; alignment = pos->second.alignment; - field_offsets.swap(pos->second.field_offsets); - base_offsets.swap(pos->second.base_offsets); - vbase_offsets.swap(pos->second.vbase_offsets); - m_record_decl_to_layout_map.erase(pos); - success = true; - } else { - bit_size = 0; - alignment = 0; - field_offsets.clear(); + field_offsets = pos->second.field_offsets; + base_offsets = pos->second.base_offsets; + vbase_offsets = pos->second.vbase_offsets; + return true; } - return success; + bit_size = 0; + alignment = 0; + field_offsets.clear(); + return false; } void ClangASTImporter::InsertRecordDecl(clang::RecordDecl *decl, Index: lldb/unittests/Symbol/TestClangASTImporter.cpp =================================================================== --- lldb/unittests/Symbol/TestClangASTImporter.cpp +++ lldb/unittests/Symbol/TestClangASTImporter.cpp @@ -203,18 +203,25 @@ layout_info.field_offsets[field] = 1; importer.InsertRecordDecl(source_record, layout_info); - uint64_t bit_size; - uint64_t alignment; - llvm::DenseMap field_offsets; - llvm::DenseMap base_offsets; - llvm::DenseMap vbase_offsets; - importer.LayoutRecordType(source_record, bit_size, alignment, field_offsets, - base_offsets, vbase_offsets); - - EXPECT_EQ(15U, bit_size); - EXPECT_EQ(2U, alignment); - EXPECT_EQ(1U, field_offsets.size()); - EXPECT_EQ(1U, field_offsets[field]); - EXPECT_EQ(0U, base_offsets.size()); - EXPECT_EQ(0U, vbase_offsets.size()); + // Check that asking for the layout multiple times will always return the + // same result. Three times should be enough to find any changing + for (unsigned i = 0; i < 3U; ++i) { + SCOPED_TRACE("Iteration: " + std::to_string(i)); + + uint64_t bit_size; + uint64_t alignment; + llvm::DenseMap field_offsets; + llvm::DenseMap base_offsets; + llvm::DenseMap + vbase_offsets; + importer.LayoutRecordType(source_record, bit_size, alignment, field_offsets, + base_offsets, vbase_offsets); + + EXPECT_EQ(15U, bit_size); + EXPECT_EQ(2U, alignment); + EXPECT_EQ(1U, field_offsets.size()); + EXPECT_EQ(1U, field_offsets[field]); + EXPECT_EQ(0U, base_offsets.size()); + EXPECT_EQ(0U, vbase_offsets.size()); + } }