1 //===-- LibCxxAtomic.cpp ------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "LibCxxAtomic.h" 11 12 using namespace lldb; 13 using namespace lldb_private; 14 using namespace lldb_private::formatters; 15 16 bool 17 lldb_private::formatters::LibCxxAtomicSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) 18 { 19 static ConstString g___a_("__a_"); 20 21 if (ValueObjectSP child = valobj.GetChildMemberWithName(g___a_, true)) 22 { 23 std::string summary; 24 if (child->GetSummaryAsCString(summary, options) && summary.size() > 0) 25 { 26 stream.Printf("%s", summary.c_str()); 27 return true; 28 } 29 } 30 31 return false; 32 } 33 34 namespace lldb_private { 35 namespace formatters { 36 class LibcxxStdAtomicSyntheticFrontEnd : public SyntheticChildrenFrontEnd 37 { 38 public: 39 LibcxxStdAtomicSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 40 41 ~LibcxxStdAtomicSyntheticFrontEnd() override = default; 42 43 size_t 44 CalculateNumChildren() override; 45 46 lldb::ValueObjectSP 47 GetChildAtIndex(size_t idx) override; 48 49 bool 50 Update() override; 51 52 bool 53 MightHaveChildren() override; 54 55 size_t 56 GetIndexOfChildWithName(const ConstString &name) override; 57 58 lldb::ValueObjectSP 59 GetSyntheticValue () override; 60 private: 61 ValueObject *m_real_child; 62 }; 63 } // namespace formatters 64 } // namespace lldb_private 65 66 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::LibcxxStdAtomicSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 67 SyntheticChildrenFrontEnd(*valobj_sp), 68 m_real_child(nullptr) 69 { 70 } 71 72 bool 73 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::Update() 74 { 75 static ConstString g___a_("__a_"); 76 77 m_real_child = m_backend.GetChildMemberWithName(g___a_, true).get(); 78 79 return false; 80 } 81 82 bool 83 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::MightHaveChildren() 84 { 85 return true; 86 } 87 88 size_t 89 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::CalculateNumChildren() 90 { 91 return m_real_child ? m_real_child->GetNumChildren() : 0; 92 } 93 94 lldb::ValueObjectSP 95 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetChildAtIndex(size_t idx) 96 { 97 return m_real_child ? m_real_child->GetChildAtIndex(idx, true) : nullptr; 98 } 99 100 size_t 101 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetIndexOfChildWithName(const ConstString &name) 102 { 103 return m_real_child ? m_real_child->GetIndexOfChildWithName(name) : UINT32_MAX; 104 } 105 106 lldb::ValueObjectSP 107 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetSyntheticValue () 108 { 109 if (m_real_child && m_real_child->CanProvideValue()) 110 return m_real_child->GetSP(); 111 return nullptr; 112 } 113 114 SyntheticChildrenFrontEnd* 115 lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) 116 { 117 if (valobj_sp) 118 return new LibcxxStdAtomicSyntheticFrontEnd(valobj_sp); 119 return nullptr; 120 } 121 122