]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp
MFV r349454:
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / Language / CPlusPlus / LibCxxAtomic.cpp
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
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::
59     LibcxxStdAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
60     : SyntheticChildrenFrontEnd(*valobj_sp), m_real_child(nullptr) {}
61
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::
71     MightHaveChildren() {
72   return true;
73 }
74
75 size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::
76     CalculateNumChildren() {
77   return m_real_child ? m_real_child->GetNumChildren() : 0;
78 }
79
80 lldb::ValueObjectSP
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::
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::
93     GetSyntheticValue() {
94   if (m_real_child && m_real_child->CanProvideValue())
95     return m_real_child->GetSP();
96   return nullptr;
97 }
98
99 SyntheticChildrenFrontEnd *
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 }