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