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