https://github.com/jeffreytan81 created 
https://github.com/llvm/llvm-project/pull/67069

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]
...
```

Differential Revision: https://reviews.llvm.org/D159542

>From 64e7184c1887ae964bd7a5df5b9167cb44f95116 Mon Sep 17 00:00:00 2001
From: Jeffrey Tan <jeffrey...@fb.com>
Date: Thu, 21 Sep 2023 14:40:20 -0700
Subject: [PATCH] Lazy deference underlying object for shared/weak/unique_ptr
 synthetic provider

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]
...
```

Differential Revision: https://reviews.llvm.org/D159542
---
 .../Plugins/Language/CPlusPlus/LibStdcpp.cpp  | 22 +++++++++----------
 .../CPlusPlus/LibStdcppUniquePointer.cpp      | 22 ++++++++++---------
 2 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp
index c65bb9b6bc9b187..23af50fdb7124ec 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp
@@ -377,9 +377,16 @@ lldb::ValueObjectSP
 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 @@ bool LibStdcppSharedPtrSyntheticFrontEnd::Update() {
     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;
 }
diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp
index 7174e9102e1bd0a..a84d641b57bc475 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp
@@ -108,14 +108,7 @@ bool LibStdcppUniquePtrSyntheticFrontEnd::Update() {
     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 @@ 
LibStdcppUniquePtrSyntheticFrontEnd::GetChildAtIndex(size_t idx) {
     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();
 }
 

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to