blob: dea52e2f30b6bf1cd0420bf9a70a26dbaf37fed3 [file] [log] [blame]
Kate Stoneb9c1b512016-09-06 20:57:50 +00001//===-- LibCxxAtomic.cpp ------------------------------------------*- C++
2//-*-===//
Enrico Granata75995b52016-02-12 22:18:24 +00003//
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"
Enrico Granata75995b52016-02-12 22:18:24 +000012
13using namespace lldb;
14using namespace lldb_private;
15using namespace lldb_private::formatters;
16
Kate Stoneb9c1b512016-09-06 20:57:50 +000017bool 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;
Enrico Granata75995b52016-02-12 22:18:24 +000026 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000027 }
28
29 return false;
Enrico Granata75995b52016-02-12 22:18:24 +000030}
31
32namespace lldb_private {
Kate Stoneb9c1b512016-09-06 20:57:50 +000033namespace formatters {
34class LibcxxStdAtomicSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
35public:
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
52private:
53 ValueObject *m_real_child;
54};
55} // namespace formatters
Enrico Granata75995b52016-02-12 22:18:24 +000056} // namespace lldb_private
57
Kate Stoneb9c1b512016-09-06 20:57:50 +000058lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::
59 LibcxxStdAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
60 : SyntheticChildrenFrontEnd(*valobj_sp), m_real_child(nullptr) {}
61
62bool 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;
Enrico Granata75995b52016-02-12 22:18:24 +000068}
69
Kate Stoneb9c1b512016-09-06 20:57:50 +000070bool lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::
71 MightHaveChildren() {
72 return true;
Enrico Granata75995b52016-02-12 22:18:24 +000073}
74
Kate Stoneb9c1b512016-09-06 20:57:50 +000075size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::
76 CalculateNumChildren() {
77 return m_real_child ? m_real_child->GetNumChildren() : 0;
Enrico Granata75995b52016-02-12 22:18:24 +000078}
79
80lldb::ValueObjectSP
Kate Stoneb9c1b512016-09-06 20:57:50 +000081lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetChildAtIndex(
82 size_t idx) {
83 return m_real_child ? m_real_child->GetChildAtIndex(idx, true) : nullptr;
Enrico Granata75995b52016-02-12 22:18:24 +000084}
85
Kate Stoneb9c1b512016-09-06 20:57:50 +000086size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::
87 GetIndexOfChildWithName(const ConstString &name) {
88 return m_real_child ? m_real_child->GetIndexOfChildWithName(name)
89 : UINT32_MAX;
Enrico Granata75995b52016-02-12 22:18:24 +000090}
91
Kate Stoneb9c1b512016-09-06 20:57:50 +000092lldb::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;
Enrico Granata75995b52016-02-12 22:18:24 +000097}
98
Kate Stoneb9c1b512016-09-06 20:57:50 +000099SyntheticChildrenFrontEnd *
100lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator(
101 CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {
102 if (valobj_sp)
103 return new LibcxxStdAtomicSyntheticFrontEnd(valobj_sp);
104 return nullptr;
Enrico Granata75995b52016-02-12 22:18:24 +0000105}