llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lldb

Author: Michael Buch (Michael137)

<details>
<summary>Changes</summary>

For the `__shared_owners_` we need to add `+1` to the count, but for 
`__shared_weak_owners_` the value reflects the exact number of weak references.

---
Full diff: https://github.com/llvm/llvm-project/pull/147033.diff


3 Files Affected:

- (modified) lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp (+6-1) 
- (modified) 
lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/TestDataFormatterLibcxxSharedPtr.py
 (+20-8) 
- (modified) 
lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/main.cpp
 (+9-1) 


``````````diff
diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp
index 009586f525282..104521b8c3e71 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp
@@ -177,6 +177,9 @@ bool 
lldb_private::formatters::LibcxxSmartPointerSummaryProvider(
     if (!success)
       return false;
 
+    // std::shared_ptr releases the underlying resource when the
+    // __shared_owners_ count hits -1. So `__shared_owners_ == 0` indicates 1
+    // owner. Hence add +1 here.
     stream.Printf(" strong=%" PRIu64, count + 1);
   }
 
@@ -187,7 +190,9 @@ bool 
lldb_private::formatters::LibcxxSmartPointerSummaryProvider(
     if (!success)
       return false;
 
-    stream.Printf(" weak=%" PRIu64, count + 1);
+    // Unlike __shared_owners_, __shared_weak_owners_ indicates the exact
+    // std::weak_ptr reference count.
+    stream.Printf(" weak=%" PRIu64, count);
   }
 
   return true;
diff --git 
a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/TestDataFormatterLibcxxSharedPtr.py
 
b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/TestDataFormatterLibcxxSharedPtr.py
index 6ecf5ca88e90e..25f616ff61046 100644
--- 
a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/TestDataFormatterLibcxxSharedPtr.py
+++ 
b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/TestDataFormatterLibcxxSharedPtr.py
@@ -14,7 +14,7 @@ def test_shared_ptr_variables(self):
         """Test `frame variable` output for `std::shared_ptr` types."""
         self.build()
 
-        lldbutil.run_to_source_breakpoint(
+        (_, process, _, bkpt) = lldbutil.run_to_source_breakpoint(
             self, "// break here", lldb.SBFileSpec("main.cpp")
         )
 
@@ -37,7 +37,7 @@ def test_shared_ptr_variables(self):
             type="std::shared_ptr<int>",
             children=[ValueCheck(name="__ptr_")],
         )
-        self.assertRegex(valobj.summary, r"^10( strong=1)? weak=1$")
+        self.assertRegex(valobj.summary, r"^10( strong=1)? weak=0$")
         self.assertNotEqual(valobj.child[0].unsigned, 0)
 
         valobj = self.expect_var_path(
@@ -45,7 +45,7 @@ def test_shared_ptr_variables(self):
             type="std::shared_ptr<int> &",
             children=[ValueCheck(name="__ptr_")],
         )
-        self.assertRegex(valobj.summary, r"^10( strong=1)? weak=1$")
+        self.assertRegex(valobj.summary, r"^10( strong=1)? weak=0$")
         self.assertNotEqual(valobj.child[0].unsigned, 0)
 
         valobj = self.expect_var_path(
@@ -53,7 +53,7 @@ def test_shared_ptr_variables(self):
             type="std::shared_ptr<int> &&",
             children=[ValueCheck(name="__ptr_")],
         )
-        self.assertRegex(valobj.summary, r"^10( strong=1)? weak=1$")
+        self.assertRegex(valobj.summary, r"^10( strong=1)? weak=0$")
         self.assertNotEqual(valobj.child[0].unsigned, 0)
 
         if self.expectedCompiler(["clang"]) and self.expectedCompilerVersion(
@@ -68,12 +68,12 @@ def test_shared_ptr_variables(self):
             type="std::shared_ptr<" + string_type + ">",
             children=[ValueCheck(name="__ptr_", summary='"hello"')],
         )
-        self.assertRegex(valobj.summary, r'^"hello"( strong=1)? weak=1$')
+        self.assertRegex(valobj.summary, r'^"hello"( strong=1)? weak=0$')
 
         valobj = self.expect_var_path("sp_user", type="std::shared_ptr<User>")
         self.assertRegex(
             valobj.summary,
-            "^std(::__[^:]*)?::shared_ptr<User>::element_type @ 
0x0*[1-9a-f][0-9a-f]+( strong=1)? weak=1",
+            "^std(::__[^:]*)?::shared_ptr<User>::element_type @ 
0x0*[1-9a-f][0-9a-f]+( strong=1)? weak=0",
         )
         self.assertNotEqual(valobj.child[0].unsigned, 0)
 
@@ -91,11 +91,23 @@ def test_shared_ptr_variables(self):
         self.expect_var_path("sp_user->name", type="std::string", 
summary='"steph"')
 
         valobj = self.expect_var_path(
-            "si", type="std::shared_ptr<int>", summary="47 strong=2 weak=1"
+            "si", type="std::shared_ptr<int>", summary="47 strong=2 weak=0"
         )
 
         valobj = self.expect_var_path(
-            "sie", type="std::shared_ptr<int>", summary="nullptr strong=2 
weak=1"
+            "sie", type="std::shared_ptr<int>", summary="nullptr strong=2 
weak=0"
+        )
+
+        lldbutil.continue_to_breakpoint(process, bkpt)
+
+        valobj = self.expect_var_path(
+            "si", type="std::shared_ptr<int>", summary="47 strong=2 weak=2"
+        )
+        valobj = self.expect_var_path(
+            "sie", type="std::shared_ptr<int>", summary="nullptr strong=2 
weak=2"
+        )
+        valobj = self.expect_var_path(
+            "wie", type="std::weak_ptr<int>", summary="nullptr strong=2 weak=2"
         )
 
         self.runCmd("settings set target.experimental.use-DIL true")
diff --git 
a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/main.cpp
 
b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/main.cpp
index 3ac86a3ee9843..cfefaf37a5dbd 100644
--- 
a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/main.cpp
+++ 
b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/main.cpp
@@ -1,3 +1,4 @@
+#include <cstdio>
 #include <memory>
 #include <string>
 
@@ -26,5 +27,12 @@ int main() {
   std::shared_ptr<int> si(new int(47));
   std::shared_ptr<int> sie(si, nullptr);
 
-  return 0; // break here
+  std::puts("// break here");
+
+  std::weak_ptr<int> wie = sie;
+  std::weak_ptr<int> wie2 = sie;
+
+  std::puts("// break here");
+
+  return 0;
 }

``````````

</details>


https://github.com/llvm/llvm-project/pull/147033
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to