yinghuitan created this revision. yinghuitan added reviewers: clayborg, labath, jingham, jdoerfert, JDevlieghere, kusmour, GeorgeHuyubo. Herald added a project: All. yinghuitan requested review of this revision. Herald added subscribers: lldb-commits, wangpc. Herald added a project: LLDB.
We noticed some performance issue while in lldb-vscode for grabing the name of the SBValue. Profiling shows SBValue::GetName() can cause synthetic children provider of shared/unique_ptr to deference underlying object and complete it type. This patch lazily moves the dereference from synthetic child provider's Update() method to GetChildAtIndex() so that SBValue::GetName() won't trigger the slow code path. Here is the culprit slow code path: ... frame #59: 0x00007ff4102e0660 liblldb.so.15`SymbolFileDWARF::CompleteType(this=<unavailable>, compiler_type=0x00007ffdd9829450) at SymbolFileDWARF.cpp:1567:25 [opt] ... frame #67: 0x00007ff40fdf9bd4 liblldb.so.15`lldb_private::ValueObject::Dereference(this=0x0000022bb5dfe980, error=0x00007ffdd9829970) at ValueObject.cpp:2672:41 [opt] frame #68: 0x00007ff41011bb0a liblldb.so.15`(anonymous namespace)::LibStdcppSharedPtrSyntheticFrontEnd::Update(this=0x000002298fb94380) at LibStdcpp.cpp:403:40 [opt] frame #69: 0x00007ff41011af9a liblldb.so.15`lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator(lldb_private::CXXSyntheticChildren*, std::shared_ptr<lldb_private::ValueObject>) [inlined] (anonymous namespace)::LibStdcppSharedPtrSyntheticFrontEnd::LibStdcppSharedPtrSyntheticFrontEnd(this=0x000002298fb94380, valobj_sp=<unavailable>) at LibStdcpp.cpp:371:5 [opt] ... frame #78: 0x00007ff40fdf6e42 liblldb.so.15`lldb_private::ValueObject::CalculateSyntheticValue(this=0x000002296c66a500) at ValueObject.cpp:1836:27 [opt] frame #79: 0x00007ff40fdf1939 liblldb.so.15`lldb_private::ValueObject::GetSyntheticValue(this=<unavailable>) at ValueObject.cpp:1867:3 [opt] frame #80: 0x00007ff40fc89008 liblldb.so.15`ValueImpl::GetSP(this=0x0000022c71b90de0, stop_locker=0x00007ffdd9829d00, lock=0x00007ffdd9829d08, error=0x00007ffdd9829d18) at SBValue.cpp:141:46 [opt] frame #81: 0x00007ff40fc7d82a liblldb.so.15`lldb::SBValue::GetSP(ValueLocker&) const [inlined] ValueLocker::GetLockedSP(this=0x00007ffdd9829d00, in_value=<unavailable>) at SBValue.cpp:208:21 [opt] frame #82: 0x00007ff40fc7d817 liblldb.so.15`lldb::SBValue::GetSP(this=0x00007ffdd9829d90, locker=0x00007ffdd9829d00) const at SBValue.cpp:1047:17 [opt] frame #83: 0x00007ff40fc7da6f liblldb.so.15`lldb::SBValue::GetName(this=0x00007ffdd9829d90) at SBValue.cpp:294:32 [opt] ... Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D159542 Files: lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp Index: lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp =================================================================== --- lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp +++ lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp @@ -108,14 +108,7 @@ if (del_obj) m_del_obj = del_obj->Clone(ConstString("deleter")).get(); } - - if (m_ptr_obj) { - Status error; - ValueObjectSP obj_obj = m_ptr_obj->Dereference(error); - if (error.Success()) { - m_obj_obj = obj_obj->Clone(ConstString("object")).get(); - } - } + m_obj_obj = nullptr; return false; } @@ -128,8 +121,17 @@ return m_ptr_obj->GetSP(); if (idx == 1 && m_del_obj) return m_del_obj->GetSP(); - if (idx == 2 && m_obj_obj) - return m_obj_obj->GetSP(); + if (idx == 2) { + if (m_ptr_obj && !m_obj_obj) { + Status error; + ValueObjectSP obj_obj = m_ptr_obj->Dereference(error); + if (error.Success()) { + m_obj_obj = obj_obj->Clone(ConstString("object")).get(); + } + } + if (m_obj_obj) + return m_obj_obj->GetSP(); + } return lldb::ValueObjectSP(); } Index: lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp =================================================================== --- lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp +++ lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp @@ -377,9 +377,16 @@ LibStdcppSharedPtrSyntheticFrontEnd::GetChildAtIndex(size_t idx) { if (idx == 0) return m_ptr_obj->GetSP(); - if (idx == 1) - return m_obj_obj->GetSP(); - + if (idx == 1) { + if (m_ptr_obj && !m_obj_obj) { + Status error; + ValueObjectSP obj_obj = m_ptr_obj->Dereference(error); + if (error.Success()) + m_obj_obj = obj_obj->Clone(ConstString("object")).get(); + } + if (m_obj_obj) + return m_obj_obj->GetSP(); + } return lldb::ValueObjectSP(); } @@ -397,14 +404,7 @@ return false; m_ptr_obj = ptr_obj_sp->Clone(ConstString("pointer")).get(); - - if (m_ptr_obj) { - Status error; - ValueObjectSP obj_obj = m_ptr_obj->Dereference(error); - if (error.Success()) { - m_obj_obj = obj_obj->Clone(ConstString("object")).get(); - } - } + m_obj_obj = nullptr; return false; }
Index: lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp =================================================================== --- lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp +++ lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp @@ -108,14 +108,7 @@ if (del_obj) m_del_obj = del_obj->Clone(ConstString("deleter")).get(); } - - if (m_ptr_obj) { - Status error; - ValueObjectSP obj_obj = m_ptr_obj->Dereference(error); - if (error.Success()) { - m_obj_obj = obj_obj->Clone(ConstString("object")).get(); - } - } + m_obj_obj = nullptr; return false; } @@ -128,8 +121,17 @@ return m_ptr_obj->GetSP(); if (idx == 1 && m_del_obj) return m_del_obj->GetSP(); - if (idx == 2 && m_obj_obj) - return m_obj_obj->GetSP(); + if (idx == 2) { + if (m_ptr_obj && !m_obj_obj) { + Status error; + ValueObjectSP obj_obj = m_ptr_obj->Dereference(error); + if (error.Success()) { + m_obj_obj = obj_obj->Clone(ConstString("object")).get(); + } + } + if (m_obj_obj) + return m_obj_obj->GetSP(); + } return lldb::ValueObjectSP(); } Index: lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp =================================================================== --- lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp +++ lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp @@ -377,9 +377,16 @@ LibStdcppSharedPtrSyntheticFrontEnd::GetChildAtIndex(size_t idx) { if (idx == 0) return m_ptr_obj->GetSP(); - if (idx == 1) - return m_obj_obj->GetSP(); - + if (idx == 1) { + if (m_ptr_obj && !m_obj_obj) { + Status error; + ValueObjectSP obj_obj = m_ptr_obj->Dereference(error); + if (error.Success()) + m_obj_obj = obj_obj->Clone(ConstString("object")).get(); + } + if (m_obj_obj) + return m_obj_obj->GetSP(); + } return lldb::ValueObjectSP(); } @@ -397,14 +404,7 @@ return false; m_ptr_obj = ptr_obj_sp->Clone(ConstString("pointer")).get(); - - if (m_ptr_obj) { - Status error; - ValueObjectSP obj_obj = m_ptr_obj->Dereference(error); - if (error.Success()) { - m_obj_obj = obj_obj->Clone(ConstString("object")).get(); - } - } + m_obj_obj = nullptr; return false; }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits