1 //===-- LibCxxAtomic.cpp ------------------------------------------*- C++ 2 //-*-===// 3 // 4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 // See https://llvm.org/LICENSE.txt for license information. 6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 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 lldb_private::formatters::LibCxxAtomicSummaryProvider( 17 ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { 18 static ConstString g___a_("__a_"); 19 20 if (ValueObjectSP child = valobj.GetChildMemberWithName(g___a_, true)) { 21 std::string summary; 22 if (child->GetSummaryAsCString(summary, options) && summary.size() > 0) { 23 stream.Printf("%s", summary.c_str()); 24 return true; 25 } 26 } 27 28 return false; 29 } 30 31 namespace lldb_private { 32 namespace formatters { 33 class LibcxxStdAtomicSyntheticFrontEnd : public SyntheticChildrenFrontEnd { 34 public: 35 LibcxxStdAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); 36 37 ~LibcxxStdAtomicSyntheticFrontEnd() override = default; 38 39 size_t CalculateNumChildren() override; 40 41 lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; 42 43 bool Update() override; 44 45 bool MightHaveChildren() override; 46 47 size_t GetIndexOfChildWithName(const ConstString &name) override; 48 49 lldb::ValueObjectSP GetSyntheticValue() override; 50 51 private: 52 ValueObject *m_real_child; 53 }; 54 } // namespace formatters 55 } // namespace lldb_private 56 57 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: 58 LibcxxStdAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) 59 : SyntheticChildrenFrontEnd(*valobj_sp), m_real_child(nullptr) {} 60 61 bool lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::Update() { 62 static ConstString g___a_("__a_"); 63 64 m_real_child = m_backend.GetChildMemberWithName(g___a_, true).get(); 65 66 return false; 67 } 68 69 bool lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: 70 MightHaveChildren() { 71 return true; 72 } 73 74 size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: 75 CalculateNumChildren() { 76 return m_real_child ? m_real_child->GetNumChildren() : 0; 77 } 78 79 lldb::ValueObjectSP 80 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetChildAtIndex( 81 size_t idx) { 82 return m_real_child ? m_real_child->GetChildAtIndex(idx, true) : nullptr; 83 } 84 85 size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: 86 GetIndexOfChildWithName(const ConstString &name) { 87 return m_real_child ? m_real_child->GetIndexOfChildWithName(name) 88 : UINT32_MAX; 89 } 90 91 lldb::ValueObjectSP lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: 92 GetSyntheticValue() { 93 if (m_real_child && m_real_child->CanProvideValue()) 94 return m_real_child->GetSP(); 95 return nullptr; 96 } 97 98 SyntheticChildrenFrontEnd * 99 lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator( 100 CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { 101 if (valobj_sp) 102 return new LibcxxStdAtomicSyntheticFrontEnd(valobj_sp); 103 return nullptr; 104 } 105