<div dir="ltr">Hi Pavel,<div><br></div><div>Looks like some code left after this revert is still expecting this file (added contemporary to <span style="font-size:12.8px">r284828)</span> that was removed in this revision.</div><div><br></div><div><span style="font-size:12.8px">--- lldb/trunk/source/Plugins/</span><wbr style="font-size:12.8px"><span style="font-size:12.8px">Language/CPlusPlus/</span><wbr style="font-size:12.8px"><span style="font-size:12.8px">LibStdcppSmartPointer.cpp (original)</span><br style="font-size:12.8px"><span style="font-size:12.8px">+++ lldb/trunk/source/Plugins/</span><wbr style="font-size:12.8px"><span style="font-size:12.8px">Language/CPlusPlus/</span><wbr style="font-size:12.8px"><span style="font-size:12.8px">LibStdcppSmartPointer.cpp (removed)</span><br style="font-size:12.8px"></div><div><br></div><div>This is causing the build to break. Does this require additional changes, or perhaps further reverts?</div><div><br></div><div>-Tim</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 25, 2016 at 6:24 AM, Pavel Labath via lldb-commits <span dir="ltr"><<a href="mailto:lldb-commits@lists.llvm.org" target="_blank">lldb-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: labath<br>
Date: Tue Oct 25 08:24:53 2016<br>
New Revision: 285068<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=285068&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=285068&view=rev</a><br>
Log:<br>
Revert "Improve the libstdc++ smart pointer formatters"<br>
<br>
This reverts commit r284828, as it causes an infinite loop in<br>
TestPrintStackTraces (funnily enough, only when logging is enabled).<br>
<br>
Removed:<br>
    lldb/trunk/source/Plugins/<wbr>Language/CPlusPlus/<wbr>LibStdcppSmartPointer.cpp<br>
Modified:<br>
    lldb/trunk/packages/Python/<wbr>lldbsuite/test/<wbr>functionalities/data-<wbr>formatter/data-formatter-stl/<wbr>libstdcpp/smart_ptr/Makefile<br>
    lldb/trunk/packages/Python/<wbr>lldbsuite/test/<wbr>functionalities/data-<wbr>formatter/data-formatter-stl/<wbr>libstdcpp/smart_ptr/<wbr>TestDataFormatterStdSmartPtr.<wbr>py<br>
    lldb/trunk/source/Plugins/<wbr>Language/CPlusPlus/CMakeLists.<wbr>txt<br>
    lldb/trunk/source/Plugins/<wbr>Language/CPlusPlus/LibStdcpp.<wbr>cpp<br>
<br>
Modified: lldb/trunk/packages/Python/<wbr>lldbsuite/test/<wbr>functionalities/data-<wbr>formatter/data-formatter-stl/<wbr>libstdcpp/smart_ptr/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/smart_ptr/Makefile?rev=285068&r1=285067&r2=285068&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lldb/trunk/packages/<wbr>Python/lldbsuite/test/<wbr>functionalities/data-<wbr>formatter/data-formatter-stl/<wbr>libstdcpp/smart_ptr/Makefile?<wbr>rev=285068&r1=285067&r2=<wbr>285068&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lldb/trunk/packages/Python/<wbr>lldbsuite/test/<wbr>functionalities/data-<wbr>formatter/data-formatter-stl/<wbr>libstdcpp/smart_ptr/Makefile (original)<br>
+++ lldb/trunk/packages/Python/<wbr>lldbsuite/test/<wbr>functionalities/data-<wbr>formatter/data-formatter-stl/<wbr>libstdcpp/smart_ptr/Makefile Tue Oct 25 08:24:53 2016<br>
@@ -2,7 +2,14 @@ LEVEL = ../../../../../make<br>
<br>
 CXX_SOURCES := main.cpp<br>
<br>
+CXXFLAGS := -O0<br>
 USE_LIBSTDCPP := 1<br>
-CFLAGS_EXTRAS += $(NO_LIMIT_DEBUG_INFO_FLAGS)<br>
+<br>
+# clang-3.5+ outputs FullDebugInfo by default for Darwin/FreeBSD<br>
+# targets.  Other targets do not, which causes this test to fail.<br>
+# This flag enables FullDebugInfo for all targets.<br>
+ifneq (,$(findstring clang,$(CC)))<br>
+  CFLAGS_EXTRAS += -fno-limit-debug-info<br>
+endif<br>
<br>
 include $(LEVEL)/Makefile.rules<br>
<br>
Modified: lldb/trunk/packages/Python/<wbr>lldbsuite/test/<wbr>functionalities/data-<wbr>formatter/data-formatter-stl/<wbr>libstdcpp/smart_ptr/<wbr>TestDataFormatterStdSmartPtr.<wbr>py<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/smart_ptr/TestDataFormatterStdSmartPtr.py?rev=285068&r1=285067&r2=285068&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lldb/trunk/packages/<wbr>Python/lldbsuite/test/<wbr>functionalities/data-<wbr>formatter/data-formatter-stl/<wbr>libstdcpp/smart_ptr/<wbr>TestDataFormatterStdSmartPtr.<wbr>py?rev=285068&r1=285067&r2=<wbr>285068&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lldb/trunk/packages/Python/<wbr>lldbsuite/test/<wbr>functionalities/data-<wbr>formatter/data-formatter-stl/<wbr>libstdcpp/smart_ptr/<wbr>TestDataFormatterStdSmartPtr.<wbr>py (original)<br>
+++ lldb/trunk/packages/Python/<wbr>lldbsuite/test/<wbr>functionalities/data-<wbr>formatter/data-formatter-stl/<wbr>libstdcpp/smart_ptr/<wbr>TestDataFormatterStdSmartPtr.<wbr>py Tue Oct 25 08:24:53 2016<br>
@@ -31,58 +31,19 @@ class StdSmartPtrDataFormatterTestCa<wbr>se(T<br>
                     substrs=['stopped', 'stop reason = breakpoint'])<br>
<br>
         self.expect("frame variable nsp", substrs=['nsp = nullptr'])<br>
-        self.expect("frame variable isp", substrs=['isp = 123', 'strong=1', 'weak=1'])<br>
-        self.expect("frame variable ssp", substrs=['ssp = "foobar"', 'strong=1', 'weak=1'])<br>
-        self.expect("frame variable nwp", substrs=['nwp = nullptr'])<br>
-        self.expect("frame variable iwp", substrs=['iwp = 123', 'strong=1', 'weak=1'])<br>
-        self.expect("frame variable swp", substrs=['swp = "foobar"', 'strong=1', 'weak=1'])<br>
-<br>
-        frame = self.frame()<br>
-        self.assertTrue(frame.IsValid(<wbr>))<br>
-<br>
-        self.assertEqual(0, frame.GetValueForVariablePath(<wbr>"nsp.pointer").<wbr>GetValueAsUnsigned())<br>
-        self.assertEqual(0, frame.GetValueForVariablePath(<wbr>"nwp.pointer").<wbr>GetValueAsUnsigned())<br>
-<br>
-        self.assertNotEqual(0, frame.GetValueForVariablePath(<wbr>"isp.pointer").<wbr>GetValueAsUnsigned())<br>
-        self.assertEqual(123, frame.GetValueForVariablePath(<wbr>"isp.object").<wbr>GetValueAsUnsigned())<br>
-        self.assertEqual(1, frame.GetValueForVariablePath(<wbr>"isp.count").<wbr>GetValueAsUnsigned())<br>
-        self.assertEqual(1, frame.GetValueForVariablePath(<wbr>"isp.weak_count").<wbr>GetValueAsUnsigned())<br>
-        self.assertFalse(frame.<wbr>GetValueForVariablePath("isp.<wbr>foobar").IsValid())<br>
+        self.expect("frame variable isp", substrs=['isp = 123'])<br>
+        self.expect("frame variable ssp", substrs=['ssp = "foobar"'])<br>
<br>
-        self.assertNotEqual(0, frame.GetValueForVariablePath(<wbr>"ssp.pointer").<wbr>GetValueAsUnsigned())<br>
-        self.assertEqual('"foobar"', frame.GetValueForVariablePath(<wbr>"ssp.object").GetSummary())<br>
-        self.assertEqual(1, frame.GetValueForVariablePath(<wbr>"ssp.count").<wbr>GetValueAsUnsigned())<br>
-        self.assertEqual(1, frame.GetValueForVariablePath(<wbr>"ssp.weak_count").<wbr>GetValueAsUnsigned())<br>
-        self.assertFalse(frame.<wbr>GetValueForVariablePath("ssp.<wbr>foobar").IsValid())<br>
-<br>
-        self.assertNotEqual(0, frame.GetValueForVariablePath(<wbr>"iwp.pointer").<wbr>GetValueAsUnsigned())<br>
-        self.assertEqual(123, frame.GetValueForVariablePath(<wbr>"iwp.object").<wbr>GetValueAsUnsigned())<br>
-        self.assertEqual(1, frame.GetValueForVariablePath(<wbr>"iwp.count").<wbr>GetValueAsUnsigned())<br>
-        self.assertEqual(1, frame.GetValueForVariablePath(<wbr>"iwp.weak_count").<wbr>GetValueAsUnsigned())<br>
-        self.assertFalse(frame.<wbr>GetValueForVariablePath("iwp.<wbr>foobar").IsValid())<br>
-<br>
-        self.assertNotEqual(0, frame.GetValueForVariablePath(<wbr>"swp.pointer").<wbr>GetValueAsUnsigned())<br>
-        self.assertEqual('"foobar"', frame.GetValueForVariablePath(<wbr>"swp.object").GetSummary())<br>
-        self.assertEqual(1, frame.GetValueForVariablePath(<wbr>"swp.count").<wbr>GetValueAsUnsigned())<br>
-        self.assertEqual(1, frame.GetValueForVariablePath(<wbr>"swp.weak_count").<wbr>GetValueAsUnsigned())<br>
-        self.assertFalse(frame.<wbr>GetValueForVariablePath("swp.<wbr>foobar").IsValid())<br>
+        self.expect("frame variable nwp", substrs=['nwp = nullptr'])<br>
+        self.expect("frame variable iwp", substrs=['iwp = 123'])<br>
+        self.expect("frame variable swp", substrs=['swp = "foobar"'])<br>
<br>
         self.runCmd("continue")<br>
<br>
-        frame = self.frame()<br>
-        self.assertTrue(frame.IsValid(<wbr>))<br>
-<br>
         self.expect("frame variable nsp", substrs=['nsp = nullptr'])<br>
         self.expect("frame variable isp", substrs=['isp = nullptr'])<br>
         self.expect("frame variable ssp", substrs=['ssp = nullptr'])<br>
-        self.expect("frame variable nwp", substrs=['nwp = nullptr'])<br>
-        self.expect("frame variable iwp", substrs=['iwp = nullptr', 'strong=0', 'weak=1'])<br>
-        self.expect("frame variable swp", substrs=['swp = nullptr', 'strong=0', 'weak=1'])<br>
<br>
-        self.assertFalse(frame.<wbr>GetValueForVariablePath("iwp.<wbr>object").IsValid())<br>
-        self.assertEqual(0, frame.GetValueForVariablePath(<wbr>"iwp.count").<wbr>GetValueAsUnsigned())<br>
-        self.assertEqual(1, frame.GetValueForVariablePath(<wbr>"iwp.weak_count").<wbr>GetValueAsUnsigned())<br>
-<br>
-        self.assertFalse(frame.<wbr>GetValueForVariablePath("swp.<wbr>object").IsValid())<br>
-        self.assertEqual(0, frame.GetValueForVariablePath(<wbr>"swp.count").<wbr>GetValueAsUnsigned())<br>
-        self.assertEqual(1, frame.GetValueForVariablePath(<wbr>"swp.weak_count").<wbr>GetValueAsUnsigned())<br>
+        self.expect("frame variable nwp", substrs=['nwp = nullptr'])<br>
+        self.expect("frame variable iwp", substrs=['iwp = nullptr'])<br>
+        self.expect("frame variable swp", substrs=['swp = nullptr'])<br>
<br>
Modified: lldb/trunk/source/Plugins/<wbr>Language/CPlusPlus/CMakeLists.<wbr>txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/CMakeLists.txt?rev=285068&r1=285067&r2=285068&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lldb/trunk/source/<wbr>Plugins/Language/CPlusPlus/<wbr>CMakeLists.txt?rev=285068&r1=<wbr>285067&r2=285068&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lldb/trunk/source/Plugins/<wbr>Language/CPlusPlus/CMakeLists.<wbr>txt (original)<br>
+++ lldb/trunk/source/Plugins/<wbr>Language/CPlusPlus/CMakeLists.<wbr>txt Tue Oct 25 08:24:53 2016<br>
@@ -10,7 +10,6 @@ add_lldb_library(<wbr>lldbPluginCPlusPlusLang<br>
   LibCxxUnorderedMap.cpp<br>
   LibCxxVector.cpp<br>
   LibStdcpp.cpp<br>
-  LibStdcppSmartPointer.cpp<br>
   LibStdcppTuple.cpp<br>
   LibStdcppUniquePointer.cpp<br>
 )<br>
<br>
Modified: lldb/trunk/source/Plugins/<wbr>Language/CPlusPlus/LibStdcpp.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp?rev=285068&r1=285067&r2=285068&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lldb/trunk/source/<wbr>Plugins/Language/CPlusPlus/<wbr>LibStdcpp.cpp?rev=285068&r1=<wbr>285067&r2=285068&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lldb/trunk/source/Plugins/<wbr>Language/CPlusPlus/LibStdcpp.<wbr>cpp (original)<br>
+++ lldb/trunk/source/Plugins/<wbr>Language/CPlusPlus/LibStdcpp.<wbr>cpp Tue Oct 25 08:24:53 2016<br>
@@ -63,6 +63,21 @@ private:<br>
   lldb::ValueObjectSP m_pair_sp;<br>
 };<br>
<br>
+class LibStdcppSharedPtrSyntheticFro<wbr>ntEnd : public SyntheticChildrenFrontEnd {<br>
+public:<br>
+  explicit LibStdcppSharedPtrSyntheticFro<wbr>ntEnd(lldb::ValueObjectSP valobj_sp);<br>
+<br>
+  size_t CalculateNumChildren() override;<br>
+<br>
+  lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;<br>
+<br>
+  bool Update() override;<br>
+<br>
+  bool MightHaveChildren() override;<br>
+<br>
+  size_t GetIndexOfChildWithName(const ConstString &name) override;<br>
+};<br>
+<br>
 } // end of anonymous namespace<br>
<br>
 LibstdcppMapIteratorSyntheticF<wbr>rontEnd::<wbr>LibstdcppMapIteratorSyntheticF<wbr>rontEnd(<br>
@@ -336,3 +351,80 @@ bool lldb_private::formatters::<wbr>LibStdcpp<br>
   }<br>
   return false;<br>
 }<br>
+<br>
+<wbr>LibStdcppSharedPtrSyntheticFro<wbr>ntEnd::<wbr>LibStdcppSharedPtrSyntheticFro<wbr>ntEnd(<br>
+    lldb::ValueObjectSP valobj_sp)<br>
+    : SyntheticChildrenFrontEnd(*<wbr>valobj_sp) {<br>
+  if (valobj_sp)<br>
+    Update();<br>
+}<br>
+<br>
+size_t LibStdcppSharedPtrSyntheticFro<wbr>ntEnd::CalculateNumChildren() { return 1; }<br>
+<br>
+lldb::ValueObjectSP<br>
+<wbr>LibStdcppSharedPtrSyntheticFro<wbr>ntEnd::GetChildAtIndex(size_t idx) {<br>
+  ValueObjectSP valobj_sp = m_backend.GetSP();<br>
+  if (!valobj_sp)<br>
+    return lldb::ValueObjectSP();<br>
+<br>
+  if (idx == 0)<br>
+    return valobj_sp-><wbr>GetChildMemberWithName(<wbr>ConstString("_M_ptr"), true);<br>
+  else<br>
+    return lldb::ValueObjectSP();<br>
+}<br>
+<br>
+bool LibStdcppSharedPtrSyntheticFro<wbr>ntEnd::Update() { return false; }<br>
+<br>
+bool LibStdcppSharedPtrSyntheticFro<wbr>ntEnd::MightHaveChildren() { return true; }<br>
+<br>
+size_t LibStdcppSharedPtrSyntheticFro<wbr>ntEnd::<wbr>GetIndexOfChildWithName(<br>
+    const ConstString &name) {<br>
+  if (name == ConstString("_M_ptr"))<br>
+    return 0;<br>
+  return UINT32_MAX;<br>
+}<br>
+<br>
+SyntheticChildrenFrontEnd *<br>
+lldb_private::formatters::<wbr>LibStdcppSharedPtrSyntheticFro<wbr>ntEndCreator(<br>
+    CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {<br>
+  return (valobj_sp ? new LibStdcppSharedPtrSyntheticFro<wbr>ntEnd(valobj_sp)<br>
+                    : nullptr);<br>
+}<br>
+<br>
+bool lldb_private::formatters::<wbr>LibStdcppSmartPointerSummaryPr<wbr>ovider(<br>
+    ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {<br>
+  ValueObjectSP valobj_sp(valobj.<wbr>GetNonSyntheticValue());<br>
+  if (!valobj_sp)<br>
+    return false;<br>
+<br>
+  ValueObjectSP ptr_sp(<br>
+      valobj_sp-><wbr>GetChildMemberWithName(<wbr>ConstString("_M_ptr"), true));<br>
+  if (!ptr_sp)<br>
+    return false;<br>
+<br>
+  ValueObjectSP usecount_sp(valobj_sp-><wbr>GetChildAtNamePath(<br>
+      {ConstString("_M_refcount"), ConstString("_M_pi"),<br>
+       ConstString("_M_use_count")}))<wbr>;<br>
+  if (!usecount_sp)<br>
+    return false;<br>
+<br>
+  if (ptr_sp->GetValueAsUnsigned(0) == 0 ||<br>
+      usecount_sp-><wbr>GetValueAsUnsigned(0) == 0) {<br>
+    stream.Printf("nullptr");<br>
+    return true;<br>
+  }<br>
+<br>
+  Error error;<br>
+  ValueObjectSP pointee_sp = ptr_sp->Dereference(error);<br>
+  if (pointee_sp && error.Success()) {<br>
+    if (pointee_sp-><wbr>DumpPrintableRepresentation(<br>
+            stream, ValueObject::<wbr>eValueObjectRepresentationStyl<wbr>eSummary,<br>
+            lldb::eFormatInvalid,<br>
+            ValueObject::<wbr>ePrintableRepresentationSpecia<wbr>lCasesDisable, false)) {<br>
+      return true;<br>
+    }<br>
+  }<br>
+<br>
+  stream.Printf("ptr = 0x%" PRIx64, ptr_sp->GetValueAsUnsigned(0))<wbr>;<br>
+  return true;<br>
+}<br>
<br>
Removed: lldb/trunk/source/Plugins/<wbr>Language/CPlusPlus/<wbr>LibStdcppSmartPointer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/LibStdcppSmartPointer.cpp?rev=285067&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lldb/trunk/source/<wbr>Plugins/Language/CPlusPlus/<wbr>LibStdcppSmartPointer.cpp?rev=<wbr>285067&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lldb/trunk/source/Plugins/<wbr>Language/CPlusPlus/<wbr>LibStdcppSmartPointer.cpp (original)<br>
+++ lldb/trunk/source/Plugins/<wbr>Language/CPlusPlus/<wbr>LibStdcppSmartPointer.cpp (removed)<br>
@@ -1,200 +0,0 @@<br>
-//===-- LibStdcppSmartPointer.cpp ------------------------------<wbr>-*- C++ -*-===//<br>
-//<br>
-//                     The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
-<br>
-#include "LibStdcpp.h"<br>
-<br>
-#include "lldb/Core/ConstString.h"<br>
-#include "lldb/Core/ValueObject.h"<br>
-#include "lldb/DataFormatters/<wbr>FormattersHelpers.h"<br>
-#include "lldb/DataFormatters/<wbr>TypeSynthetic.h"<br>
-#include "lldb/Target/Target.h"<br>
-<br>
-#include <memory><br>
-#include <vector><br>
-<br>
-using namespace lldb;<br>
-using namespace lldb_private;<br>
-using namespace lldb_private::formatters;<br>
-<br>
-namespace {<br>
-<br>
-class SharedPtrFrontEnd : public SyntheticChildrenFrontEnd {<br>
-public:<br>
-  explicit SharedPtrFrontEnd(lldb::<wbr>ValueObjectSP valobj_sp);<br>
-<br>
-  size_t CalculateNumChildren() override;<br>
-<br>
-  lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;<br>
-<br>
-  bool Update() override;<br>
-<br>
-  bool MightHaveChildren() override;<br>
-<br>
-  size_t GetIndexOfChildWithName(const ConstString &name) override;<br>
-<br>
-  bool GetSummary(Stream &stream, const TypeSummaryOptions &options);<br>
-<br>
-private:<br>
-  ValueObjectSP m_ptr_obj;<br>
-  ValueObjectSP m_obj_obj;<br>
-  ValueObjectSP m_use_obj;<br>
-  ValueObjectSP m_weak_obj;<br>
-<br>
-  uint8_t m_ptr_size = 0;<br>
-  lldb::ByteOrder m_byte_order = lldb::eByteOrderInvalid;<br>
-<br>
-  bool IsEmpty();<br>
-  bool IsValid();<br>
-};<br>
-<br>
-} // end of anonymous namespace<br>
-<br>
-SharedPtrFrontEnd::<wbr>SharedPtrFrontEnd(lldb::<wbr>ValueObjectSP valobj_sp)<br>
-    : SyntheticChildrenFrontEnd(*<wbr>valobj_sp) {<br>
-  Update();<br>
-}<br>
-<br>
-bool SharedPtrFrontEnd::Update() {<br>
-  ValueObjectSP valobj_backend_sp = m_backend.GetSP();<br>
-  if (!valobj_backend_sp)<br>
-    return false;<br>
-<br>
-  ValueObjectSP valobj_sp = valobj_backend_sp-><wbr>GetNonSyntheticValue();<br>
-  if (!valobj_sp)<br>
-    return false;<br>
-<br>
-  TargetSP target_sp(valobj_sp-><wbr>GetTargetSP());<br>
-  if (!target_sp)<br>
-    return false;<br>
-<br>
-  m_byte_order = target_sp->GetArchitecture().<wbr>GetByteOrder();<br>
-  m_ptr_size = target_sp->GetArchitecture().<wbr>GetAddressByteSize();<br>
-<br>
-  m_ptr_obj = valobj_sp-><wbr>GetChildMemberWithName(<wbr>ConstString("_M_ptr"), true);<br>
-<br>
-  m_use_obj = valobj_sp->GetChildAtNamePath(<wbr>{ConstString("_M_refcount"),<br>
-                                             ConstString("_M_pi"),<br>
-                                             ConstString("_M_use_count")});<br>
-<br>
-  m_weak_obj = valobj_sp->GetChildAtNamePath(<wbr>{ConstString("_M_refcount"),<br>
-                                              ConstString("_M_pi"),<br>
-                                              ConstString("_M_weak_count")})<wbr>;<br>
-<br>
-  // libstdc++ implements the weak usage count in a way that it is offset by 1<br>
-  // if the strong count is not 0 (as part of a preformance optimization). We<br>
-  // want to undo this before showing the weak count to the user as an offseted<br>
-  // weak count would be very confusing.<br>
-  if (m_use_obj && m_weak_obj && m_use_obj->GetValueAsUnsigned(<wbr>0) > 0) {<br>
-    bool success = false;<br>
-    uint64_t count = m_weak_obj-><wbr>GetValueAsUnsigned(0, &success) - 1;<br>
-    if (success) {<br>
-      auto data = std::make_shared<<wbr>DataBufferHeap>(&count, sizeof(count));<br>
-      m_weak_obj = CreateValueObjectFromData(<br>
-          "weak_count", DataExtractor(data, m_byte_order, m_ptr_size),<br>
-          m_weak_obj-><wbr>GetExecutionContextRef(), m_weak_obj->GetCompilerType())<wbr>;<br>
-    }<br>
-  }<br>
-<br>
-  if (m_ptr_obj && !IsEmpty()) {<br>
-    Error error;<br>
-    m_obj_obj = m_ptr_obj->Dereference(error);<br>
-    if (error.Success()) {<br>
-      m_obj_obj->SetName(<wbr>ConstString("object"));<br>
-    }<br>
-  }<br>
-<br>
-  return false;<br>
-}<br>
-<br>
-bool SharedPtrFrontEnd::<wbr>MightHaveChildren() { return true; }<br>
-<br>
-lldb::ValueObjectSP SharedPtrFrontEnd::<wbr>GetChildAtIndex(size_t idx) {<br>
-  if (idx == 0)<br>
-    return m_obj_obj;<br>
-  if (idx == 1)<br>
-    return m_ptr_obj;<br>
-  if (idx == 2)<br>
-    return m_use_obj;<br>
-  if (idx == 3)<br>
-    return m_weak_obj;<br>
-  return lldb::ValueObjectSP();<br>
-}<br>
-<br>
-size_t SharedPtrFrontEnd::<wbr>CalculateNumChildren() {<br>
-  if (IsEmpty())<br>
-    return 0;<br>
-  return 1;<br>
-}<br>
-<br>
-size_t SharedPtrFrontEnd::<wbr>GetIndexOfChildWithName(const ConstString &name) {<br>
-  if (name == ConstString("obj") || name == ConstString("object"))<br>
-    return 0;<br>
-  if (name == ConstString("ptr") || name == ConstString("pointer") ||<br>
-      name == ConstString("_M_ptr"))<br>
-    return 1;<br>
-  if (name == ConstString("cnt") || name == ConstString("count") ||<br>
-      name == ConstString("use_count") || name == ConstString("strong") ||<br>
-      name == ConstString("_M_use_count"))<br>
-    return 2;<br>
-  if (name == ConstString("weak") || name == ConstString("weak_count") ||<br>
-      name == ConstString("_M_weak_count"))<br>
-    return 3;<br>
-  return UINT32_MAX;<br>
-}<br>
-<br>
-bool SharedPtrFrontEnd::GetSummary(<wbr>Stream &stream,<br>
-                                   const TypeSummaryOptions &options) {<br>
-  if (!IsValid())<br>
-    return false;<br>
-<br>
-  if (IsEmpty()) {<br>
-    stream.Printf("nullptr");<br>
-  } else {<br>
-    Error error;<br>
-    bool print_pointee = false;<br>
-    if (m_obj_obj) {<br>
-      if (m_obj_obj-><wbr>DumpPrintableRepresentation(<br>
-              stream, ValueObject::<wbr>eValueObjectRepresentationStyl<wbr>eSummary,<br>
-              lldb::eFormatInvalid,<br>
-              ValueObject::<wbr>ePrintableRepresentationSpecia<wbr>lCasesDisable,<br>
-              false)) {<br>
-        print_pointee = true;<br>
-      }<br>
-    }<br>
-    if (!print_pointee)<br>
-      stream.Printf("ptr = 0x%" PRIx64, m_ptr_obj->GetValueAsUnsigned(<wbr>0));<br>
-  }<br>
-<br>
-  if (m_use_obj && m_use_obj->GetError().Success(<wbr>))<br>
-    stream.Printf(" strong=%" PRIu64, m_use_obj->GetValueAsUnsigned(<wbr>0));<br>
-<br>
-  if (m_weak_obj && m_weak_obj->GetError().<wbr>Success())<br>
-    stream.Printf(" weak=%" PRIu64, m_weak_obj-><wbr>GetValueAsUnsigned(0));<br>
-<br>
-  return true;<br>
-}<br>
-<br>
-bool SharedPtrFrontEnd::IsValid() { return m_ptr_obj != nullptr; }<br>
-<br>
-bool SharedPtrFrontEnd::IsEmpty() {<br>
-  return !IsValid() || m_ptr_obj->GetValueAsUnsigned(<wbr>0) == 0 ||<br>
-         (m_use_obj && m_use_obj->GetValueAsUnsigned(<wbr>0) == 0);<br>
-}<br>
-<br>
-SyntheticChildrenFrontEnd *<br>
-lldb_private::formatters::<wbr>LibStdcppSharedPtrSyntheticFro<wbr>ntEndCreator(<br>
-    CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {<br>
-  return valobj_sp ? new SharedPtrFrontEnd(valobj_sp) : nullptr;<br>
-}<br>
-<br>
-bool lldb_private::formatters::<wbr>LibStdcppSmartPointerSummaryPr<wbr>ovider(<br>
-    ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {<br>
-  SharedPtrFrontEnd formatter(valobj.GetSP());<br>
-  return formatter.GetSummary(stream, options);<br>
-}<br>
<br>
<br>
______________________________<wbr>_________________<br>
lldb-commits mailing list<br>
<a href="mailto:lldb-commits@lists.llvm.org">lldb-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/lldb-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Tim <<a href="mailto:penryu@gmail.com" target="_blank">penryu@gmail.com</a>></div>
</div>