180814287SRaphael Isemann //===-- LibStdcpp.cpp -----------------------------------------------------===//
233e97e63SEnrico Granata //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
633e97e63SEnrico Granata //
733e97e63SEnrico Granata //===----------------------------------------------------------------------===//
833e97e63SEnrico Granata
933e97e63SEnrico Granata #include "LibStdcpp.h"
1033e97e63SEnrico Granata
118be30215SAlex Langford #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
1233e97e63SEnrico Granata #include "lldb/Core/ValueObject.h"
1333e97e63SEnrico Granata #include "lldb/Core/ValueObjectConstResult.h"
1482ffb8e9STodd Fiala #include "lldb/DataFormatters/StringPrinter.h"
1533e97e63SEnrico Granata #include "lldb/DataFormatters/VectorIterator.h"
1633e97e63SEnrico Granata #include "lldb/Target/Target.h"
17666cc0b2SZachary Turner #include "lldb/Utility/DataBufferHeap.h"
1801c3243fSZachary Turner #include "lldb/Utility/Endian.h"
1997206d57SZachary Turner #include "lldb/Utility/Status.h"
20bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
2133e97e63SEnrico Granata
2233e97e63SEnrico Granata using namespace lldb;
2333e97e63SEnrico Granata using namespace lldb_private;
2433e97e63SEnrico Granata using namespace lldb_private::formatters;
2533e97e63SEnrico Granata
26b9c1b51eSKate Stone namespace {
279c6c8e99STamas Berghammer
28b9c1b51eSKate Stone class LibstdcppMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
299c6c8e99STamas Berghammer /*
30b9c1b51eSKate Stone (std::_Rb_tree_iterator<std::pair<const int, std::basic_string<char,
31b9c1b51eSKate Stone std::char_traits<char>, std::allocator<char> > > >) ibeg = {
329c6c8e99STamas Berghammer (_Base_ptr) _M_node = 0x0000000100103910 {
339c6c8e99STamas Berghammer (std::_Rb_tree_color) _M_color = _S_black
349c6c8e99STamas Berghammer (std::_Rb_tree_node_base::_Base_ptr) _M_parent = 0x00000001001038c0
359c6c8e99STamas Berghammer (std::_Rb_tree_node_base::_Base_ptr) _M_left = 0x0000000000000000
369c6c8e99STamas Berghammer (std::_Rb_tree_node_base::_Base_ptr) _M_right = 0x0000000000000000
379c6c8e99STamas Berghammer }
389c6c8e99STamas Berghammer }
399c6c8e99STamas Berghammer */
4033e97e63SEnrico Granata
419c6c8e99STamas Berghammer public:
429c6c8e99STamas Berghammer explicit LibstdcppMapIteratorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
43bbd16815SEugene Zelenko
44b9c1b51eSKate Stone size_t CalculateNumChildren() override;
4533e97e63SEnrico Granata
46b9c1b51eSKate Stone lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
4733e97e63SEnrico Granata
48b9c1b51eSKate Stone bool Update() override;
4933e97e63SEnrico Granata
50b9c1b51eSKate Stone bool MightHaveChildren() override;
5133e97e63SEnrico Granata
520e4c4821SAdrian Prantl size_t GetIndexOfChildWithName(ConstString name) override;
5333e97e63SEnrico Granata
5433e97e63SEnrico Granata private:
5533e97e63SEnrico Granata ExecutionContextRef m_exe_ctx_ref;
56*28c878aeSShafik Yaghmour lldb::addr_t m_pair_address = 0;
5733e97e63SEnrico Granata CompilerType m_pair_type;
5833e97e63SEnrico Granata lldb::ValueObjectSP m_pair_sp;
5933e97e63SEnrico Granata };
6033e97e63SEnrico Granata
61e7dd3972SPavel Labath class LibStdcppSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
62e7dd3972SPavel Labath public:
63e7dd3972SPavel Labath explicit LibStdcppSharedPtrSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
64e7dd3972SPavel Labath
65e7dd3972SPavel Labath size_t CalculateNumChildren() override;
66e7dd3972SPavel Labath
67e7dd3972SPavel Labath lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
68e7dd3972SPavel Labath
69e7dd3972SPavel Labath bool Update() override;
70e7dd3972SPavel Labath
71e7dd3972SPavel Labath bool MightHaveChildren() override;
72e7dd3972SPavel Labath
730e4c4821SAdrian Prantl size_t GetIndexOfChildWithName(ConstString name) override;
74e7dd3972SPavel Labath };
75e7dd3972SPavel Labath
769c6c8e99STamas Berghammer } // end of anonymous namespace
7733e97e63SEnrico Granata
LibstdcppMapIteratorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)78b9c1b51eSKate Stone LibstdcppMapIteratorSyntheticFrontEnd::LibstdcppMapIteratorSyntheticFrontEnd(
79b9c1b51eSKate Stone lldb::ValueObjectSP valobj_sp)
80*28c878aeSShafik Yaghmour : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_pair_type(),
81*28c878aeSShafik Yaghmour m_pair_sp() {
8233e97e63SEnrico Granata if (valobj_sp)
8333e97e63SEnrico Granata Update();
8433e97e63SEnrico Granata }
8533e97e63SEnrico Granata
Update()86b9c1b51eSKate Stone bool LibstdcppMapIteratorSyntheticFrontEnd::Update() {
8733e97e63SEnrico Granata ValueObjectSP valobj_sp = m_backend.GetSP();
8833e97e63SEnrico Granata if (!valobj_sp)
8933e97e63SEnrico Granata return false;
9033e97e63SEnrico Granata
9133e97e63SEnrico Granata TargetSP target_sp(valobj_sp->GetTargetSP());
9233e97e63SEnrico Granata
9333e97e63SEnrico Granata if (!target_sp)
9433e97e63SEnrico Granata return false;
9533e97e63SEnrico Granata
9633e97e63SEnrico Granata bool is_64bit = (target_sp->GetArchitecture().GetAddressByteSize() == 8);
9733e97e63SEnrico Granata
9833e97e63SEnrico Granata if (!valobj_sp)
9933e97e63SEnrico Granata return false;
10033e97e63SEnrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
10133e97e63SEnrico Granata
102b9c1b51eSKate Stone ValueObjectSP _M_node_sp(
103b9c1b51eSKate Stone valobj_sp->GetChildMemberWithName(ConstString("_M_node"), true));
10433e97e63SEnrico Granata if (!_M_node_sp)
10533e97e63SEnrico Granata return false;
10633e97e63SEnrico Granata
10733e97e63SEnrico Granata m_pair_address = _M_node_sp->GetValueAsUnsigned(0);
10833e97e63SEnrico Granata if (m_pair_address == 0)
10933e97e63SEnrico Granata return false;
11033e97e63SEnrico Granata
11133e97e63SEnrico Granata m_pair_address += (is_64bit ? 32 : 16);
11233e97e63SEnrico Granata
11333e97e63SEnrico Granata CompilerType my_type(valobj_sp->GetCompilerType());
114b9c1b51eSKate Stone if (my_type.GetNumTemplateArguments() >= 1) {
115769b21eaSPavel Labath CompilerType pair_type = my_type.GetTypeTemplateArgument(0);
116769b21eaSPavel Labath if (!pair_type)
11733e97e63SEnrico Granata return false;
11833e97e63SEnrico Granata m_pair_type = pair_type;
119b9c1b51eSKate Stone } else
12033e97e63SEnrico Granata return false;
12133e97e63SEnrico Granata
12233e97e63SEnrico Granata return true;
12333e97e63SEnrico Granata }
12433e97e63SEnrico Granata
CalculateNumChildren()125b9c1b51eSKate Stone size_t LibstdcppMapIteratorSyntheticFrontEnd::CalculateNumChildren() {
12633e97e63SEnrico Granata return 2;
12733e97e63SEnrico Granata }
12833e97e63SEnrico Granata
12933e97e63SEnrico Granata lldb::ValueObjectSP
GetChildAtIndex(size_t idx)130b9c1b51eSKate Stone LibstdcppMapIteratorSyntheticFrontEnd::GetChildAtIndex(size_t idx) {
131b9c1b51eSKate Stone if (m_pair_address != 0 && m_pair_type) {
13233e97e63SEnrico Granata if (!m_pair_sp)
133b9c1b51eSKate Stone m_pair_sp = CreateValueObjectFromAddress("pair", m_pair_address,
134b9c1b51eSKate Stone m_exe_ctx_ref, m_pair_type);
13533e97e63SEnrico Granata if (m_pair_sp)
13633e97e63SEnrico Granata return m_pair_sp->GetChildAtIndex(idx, true);
13733e97e63SEnrico Granata }
13833e97e63SEnrico Granata return lldb::ValueObjectSP();
13933e97e63SEnrico Granata }
14033e97e63SEnrico Granata
MightHaveChildren()141b9c1b51eSKate Stone bool LibstdcppMapIteratorSyntheticFrontEnd::MightHaveChildren() { return true; }
14233e97e63SEnrico Granata
GetIndexOfChildWithName(ConstString name)143b9c1b51eSKate Stone size_t LibstdcppMapIteratorSyntheticFrontEnd::GetIndexOfChildWithName(
1440e4c4821SAdrian Prantl ConstString name) {
14505cfdb0eSRaphael Isemann if (name == "first")
14633e97e63SEnrico Granata return 0;
14705cfdb0eSRaphael Isemann if (name == "second")
14833e97e63SEnrico Granata return 1;
14933e97e63SEnrico Granata return UINT32_MAX;
15033e97e63SEnrico Granata }
15133e97e63SEnrico Granata
15233e97e63SEnrico Granata SyntheticChildrenFrontEnd *
LibstdcppMapIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *,lldb::ValueObjectSP valobj_sp)153b9c1b51eSKate Stone lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator(
154b9c1b51eSKate Stone CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {
155b9c1b51eSKate Stone return (valobj_sp ? new LibstdcppMapIteratorSyntheticFrontEnd(valobj_sp)
156b9c1b51eSKate Stone : nullptr);
15733e97e63SEnrico Granata }
15833e97e63SEnrico Granata
15933e97e63SEnrico Granata /*
16033e97e63SEnrico Granata (lldb) fr var ibeg --ptr-depth 1
161b9c1b51eSKate Stone (__gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > >)
162b9c1b51eSKate Stone ibeg = {
16333e97e63SEnrico Granata _M_current = 0x00000001001037a0 {
16433e97e63SEnrico Granata *_M_current = 1
16533e97e63SEnrico Granata }
16633e97e63SEnrico Granata }
16733e97e63SEnrico Granata */
16833e97e63SEnrico Granata
16933e97e63SEnrico Granata SyntheticChildrenFrontEnd *
LibStdcppVectorIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *,lldb::ValueObjectSP valobj_sp)170b9c1b51eSKate Stone lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator(
171b9c1b51eSKate Stone CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {
17233e97e63SEnrico Granata static ConstString g_item_name;
17333e97e63SEnrico Granata if (!g_item_name)
17433e97e63SEnrico Granata g_item_name.SetCString("_M_current");
175b9c1b51eSKate Stone return (valobj_sp
176b9c1b51eSKate Stone ? new VectorIteratorSyntheticFrontEnd(valobj_sp, g_item_name)
177b9c1b51eSKate Stone : nullptr);
17833e97e63SEnrico Granata }
17933e97e63SEnrico Granata
180b9c1b51eSKate Stone lldb_private::formatters::VectorIteratorSyntheticFrontEnd::
VectorIteratorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp,ConstString item_name)181b9c1b51eSKate Stone VectorIteratorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp,
182b9c1b51eSKate Stone ConstString item_name)
183b9c1b51eSKate Stone : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(),
184b9c1b51eSKate Stone m_item_name(item_name), m_item_sp() {
18533e97e63SEnrico Granata if (valobj_sp)
18633e97e63SEnrico Granata Update();
18733e97e63SEnrico Granata }
18833e97e63SEnrico Granata
Update()189b9c1b51eSKate Stone bool VectorIteratorSyntheticFrontEnd::Update() {
19033e97e63SEnrico Granata m_item_sp.reset();
19133e97e63SEnrico Granata
19233e97e63SEnrico Granata ValueObjectSP valobj_sp = m_backend.GetSP();
19333e97e63SEnrico Granata if (!valobj_sp)
19433e97e63SEnrico Granata return false;
19533e97e63SEnrico Granata
19633e97e63SEnrico Granata if (!valobj_sp)
19733e97e63SEnrico Granata return false;
19833e97e63SEnrico Granata
19933e97e63SEnrico Granata ValueObjectSP item_ptr(valobj_sp->GetChildMemberWithName(m_item_name, true));
20033e97e63SEnrico Granata if (!item_ptr)
20133e97e63SEnrico Granata return false;
20233e97e63SEnrico Granata if (item_ptr->GetValueAsUnsigned(0) == 0)
20333e97e63SEnrico Granata return false;
20497206d57SZachary Turner Status err;
20533e97e63SEnrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
206b9c1b51eSKate Stone m_item_sp = CreateValueObjectFromAddress(
207b9c1b51eSKate Stone "item", item_ptr->GetValueAsUnsigned(0), m_exe_ctx_ref,
208b9c1b51eSKate Stone item_ptr->GetCompilerType().GetPointeeType());
20933e97e63SEnrico Granata if (err.Fail())
21033e97e63SEnrico Granata m_item_sp.reset();
21133e97e63SEnrico Granata return false;
21233e97e63SEnrico Granata }
21333e97e63SEnrico Granata
CalculateNumChildren()214b9c1b51eSKate Stone size_t VectorIteratorSyntheticFrontEnd::CalculateNumChildren() { return 1; }
21533e97e63SEnrico Granata
21633e97e63SEnrico Granata lldb::ValueObjectSP
GetChildAtIndex(size_t idx)217b9c1b51eSKate Stone VectorIteratorSyntheticFrontEnd::GetChildAtIndex(size_t idx) {
21833e97e63SEnrico Granata if (idx == 0)
21933e97e63SEnrico Granata return m_item_sp;
22033e97e63SEnrico Granata return lldb::ValueObjectSP();
22133e97e63SEnrico Granata }
22233e97e63SEnrico Granata
MightHaveChildren()223b9c1b51eSKate Stone bool VectorIteratorSyntheticFrontEnd::MightHaveChildren() { return true; }
22433e97e63SEnrico Granata
GetIndexOfChildWithName(ConstString name)225b9c1b51eSKate Stone size_t VectorIteratorSyntheticFrontEnd::GetIndexOfChildWithName(
2260e4c4821SAdrian Prantl ConstString name) {
22705cfdb0eSRaphael Isemann if (name == "item")
22833e97e63SEnrico Granata return 0;
22933e97e63SEnrico Granata return UINT32_MAX;
23033e97e63SEnrico Granata }
23133e97e63SEnrico Granata
LibStdcppStringSummaryProvider(ValueObject & valobj,Stream & stream,const TypeSummaryOptions & options)232b9c1b51eSKate Stone bool lldb_private::formatters::LibStdcppStringSummaryProvider(
233b9c1b51eSKate Stone ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
23482ffb8e9STodd Fiala const bool scalar_is_load_addr = true;
23582ffb8e9STodd Fiala AddressType addr_type;
236b9c1b51eSKate Stone lldb::addr_t addr_of_string =
237b9c1b51eSKate Stone valobj.GetAddressOf(scalar_is_load_addr, &addr_type);
238b9c1b51eSKate Stone if (addr_of_string != LLDB_INVALID_ADDRESS) {
239b9c1b51eSKate Stone switch (addr_type) {
240b9c1b51eSKate Stone case eAddressTypeLoad: {
24182ffb8e9STodd Fiala ProcessSP process_sp(valobj.GetProcessSP());
24282ffb8e9STodd Fiala if (!process_sp)
24382ffb8e9STodd Fiala return false;
24482ffb8e9STodd Fiala
24582ffb8e9STodd Fiala StringPrinter::ReadStringAndDumpToStreamOptions options(valobj);
24697206d57SZachary Turner Status error;
247b9c1b51eSKate Stone lldb::addr_t addr_of_data =
248b9c1b51eSKate Stone process_sp->ReadPointerFromMemory(addr_of_string, error);
249b9c1b51eSKate Stone if (error.Fail() || addr_of_data == 0 ||
250b9c1b51eSKate Stone addr_of_data == LLDB_INVALID_ADDRESS)
25182ffb8e9STodd Fiala return false;
25282ffb8e9STodd Fiala options.SetLocation(addr_of_data);
2534c56f734SPavel Labath options.SetTargetSP(valobj.GetTargetSP());
25482ffb8e9STodd Fiala options.SetStream(&stream);
25582ffb8e9STodd Fiala options.SetNeedsZeroTermination(false);
25682ffb8e9STodd Fiala options.SetBinaryZeroIsTerminator(true);
257b9c1b51eSKate Stone lldb::addr_t size_of_data = process_sp->ReadPointerFromMemory(
258b9c1b51eSKate Stone addr_of_string + process_sp->GetAddressByteSize(), error);
25982ffb8e9STodd Fiala if (error.Fail())
26082ffb8e9STodd Fiala return false;
26182ffb8e9STodd Fiala options.SetSourceSize(size_of_data);
2627b244258SRaphael Isemann options.SetHasSourceSize(true);
26382ffb8e9STodd Fiala
264b9c1b51eSKate Stone if (!StringPrinter::ReadStringAndDumpToStream<
265b9c1b51eSKate Stone StringPrinter::StringElementType::UTF8>(options)) {
26682ffb8e9STodd Fiala stream.Printf("Summary Unavailable");
26782ffb8e9STodd Fiala return true;
268b9c1b51eSKate Stone } else
26982ffb8e9STodd Fiala return true;
270b9c1b51eSKate Stone } break;
27182ffb8e9STodd Fiala case eAddressTypeHost:
27282ffb8e9STodd Fiala break;
27382ffb8e9STodd Fiala case eAddressTypeInvalid:
27482ffb8e9STodd Fiala case eAddressTypeFile:
27582ffb8e9STodd Fiala break;
27682ffb8e9STodd Fiala }
27782ffb8e9STodd Fiala }
27882ffb8e9STodd Fiala return false;
27982ffb8e9STodd Fiala }
28082ffb8e9STodd Fiala
LibStdcppWStringSummaryProvider(ValueObject & valobj,Stream & stream,const TypeSummaryOptions & options)281b9c1b51eSKate Stone bool lldb_private::formatters::LibStdcppWStringSummaryProvider(
282b9c1b51eSKate Stone ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
28382ffb8e9STodd Fiala const bool scalar_is_load_addr = true;
28482ffb8e9STodd Fiala AddressType addr_type;
285b9c1b51eSKate Stone lldb::addr_t addr_of_string =
286b9c1b51eSKate Stone valobj.GetAddressOf(scalar_is_load_addr, &addr_type);
287b9c1b51eSKate Stone if (addr_of_string != LLDB_INVALID_ADDRESS) {
288b9c1b51eSKate Stone switch (addr_type) {
289b9c1b51eSKate Stone case eAddressTypeLoad: {
29082ffb8e9STodd Fiala ProcessSP process_sp(valobj.GetProcessSP());
29182ffb8e9STodd Fiala if (!process_sp)
29282ffb8e9STodd Fiala return false;
29382ffb8e9STodd Fiala
294b9c1b51eSKate Stone CompilerType wchar_compiler_type =
295b9c1b51eSKate Stone valobj.GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeWChar);
29682ffb8e9STodd Fiala
29782ffb8e9STodd Fiala if (!wchar_compiler_type)
29882ffb8e9STodd Fiala return false;
29982ffb8e9STodd Fiala
300d963a7c3SAdrian Prantl // Safe to pass nullptr for exe_scope here.
301d6a9bbf6SAdrian Prantl llvm::Optional<uint64_t> size = wchar_compiler_type.GetBitSize(nullptr);
302d963a7c3SAdrian Prantl if (!size)
303d963a7c3SAdrian Prantl return false;
304d963a7c3SAdrian Prantl const uint32_t wchar_size = *size;
30582ffb8e9STodd Fiala
30682ffb8e9STodd Fiala StringPrinter::ReadStringAndDumpToStreamOptions options(valobj);
30797206d57SZachary Turner Status error;
308b9c1b51eSKate Stone lldb::addr_t addr_of_data =
309b9c1b51eSKate Stone process_sp->ReadPointerFromMemory(addr_of_string, error);
310b9c1b51eSKate Stone if (error.Fail() || addr_of_data == 0 ||
311b9c1b51eSKate Stone addr_of_data == LLDB_INVALID_ADDRESS)
31282ffb8e9STodd Fiala return false;
31382ffb8e9STodd Fiala options.SetLocation(addr_of_data);
3144c56f734SPavel Labath options.SetTargetSP(valobj.GetTargetSP());
31582ffb8e9STodd Fiala options.SetStream(&stream);
31682ffb8e9STodd Fiala options.SetNeedsZeroTermination(false);
31782ffb8e9STodd Fiala options.SetBinaryZeroIsTerminator(false);
318b9c1b51eSKate Stone lldb::addr_t size_of_data = process_sp->ReadPointerFromMemory(
319b9c1b51eSKate Stone addr_of_string + process_sp->GetAddressByteSize(), error);
32082ffb8e9STodd Fiala if (error.Fail())
32182ffb8e9STodd Fiala return false;
32282ffb8e9STodd Fiala options.SetSourceSize(size_of_data);
3237b244258SRaphael Isemann options.SetHasSourceSize(true);
32482ffb8e9STodd Fiala options.SetPrefixToken("L");
32582ffb8e9STodd Fiala
326b9c1b51eSKate Stone switch (wchar_size) {
32782ffb8e9STodd Fiala case 8:
328b9c1b51eSKate Stone return StringPrinter::ReadStringAndDumpToStream<
329b9c1b51eSKate Stone StringPrinter::StringElementType::UTF8>(options);
33082ffb8e9STodd Fiala case 16:
331b9c1b51eSKate Stone return StringPrinter::ReadStringAndDumpToStream<
332b9c1b51eSKate Stone StringPrinter::StringElementType::UTF16>(options);
33382ffb8e9STodd Fiala case 32:
334b9c1b51eSKate Stone return StringPrinter::ReadStringAndDumpToStream<
335b9c1b51eSKate Stone StringPrinter::StringElementType::UTF32>(options);
33682ffb8e9STodd Fiala default:
33782ffb8e9STodd Fiala stream.Printf("size for wchar_t is not valid");
33882ffb8e9STodd Fiala return true;
33982ffb8e9STodd Fiala }
34082ffb8e9STodd Fiala return true;
341b9c1b51eSKate Stone } break;
34282ffb8e9STodd Fiala case eAddressTypeHost:
34382ffb8e9STodd Fiala break;
34482ffb8e9STodd Fiala case eAddressTypeInvalid:
34582ffb8e9STodd Fiala case eAddressTypeFile:
34682ffb8e9STodd Fiala break;
34782ffb8e9STodd Fiala }
34882ffb8e9STodd Fiala }
34982ffb8e9STodd Fiala return false;
35082ffb8e9STodd Fiala }
351e7dd3972SPavel Labath
LibStdcppSharedPtrSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)352e7dd3972SPavel Labath LibStdcppSharedPtrSyntheticFrontEnd::LibStdcppSharedPtrSyntheticFrontEnd(
353e7dd3972SPavel Labath lldb::ValueObjectSP valobj_sp)
354e7dd3972SPavel Labath : SyntheticChildrenFrontEnd(*valobj_sp) {
355e7dd3972SPavel Labath if (valobj_sp)
356e7dd3972SPavel Labath Update();
357e7dd3972SPavel Labath }
358e7dd3972SPavel Labath
CalculateNumChildren()359e7dd3972SPavel Labath size_t LibStdcppSharedPtrSyntheticFrontEnd::CalculateNumChildren() { return 1; }
360e7dd3972SPavel Labath
361e7dd3972SPavel Labath lldb::ValueObjectSP
GetChildAtIndex(size_t idx)362e7dd3972SPavel Labath LibStdcppSharedPtrSyntheticFrontEnd::GetChildAtIndex(size_t idx) {
363e7dd3972SPavel Labath ValueObjectSP valobj_sp = m_backend.GetSP();
364e7dd3972SPavel Labath if (!valobj_sp)
365e7dd3972SPavel Labath return lldb::ValueObjectSP();
366e7dd3972SPavel Labath
367e7dd3972SPavel Labath if (idx == 0)
368e7dd3972SPavel Labath return valobj_sp->GetChildMemberWithName(ConstString("_M_ptr"), true);
369e7dd3972SPavel Labath else
370e7dd3972SPavel Labath return lldb::ValueObjectSP();
371e7dd3972SPavel Labath }
372e7dd3972SPavel Labath
Update()373e7dd3972SPavel Labath bool LibStdcppSharedPtrSyntheticFrontEnd::Update() { return false; }
374e7dd3972SPavel Labath
MightHaveChildren()375e7dd3972SPavel Labath bool LibStdcppSharedPtrSyntheticFrontEnd::MightHaveChildren() { return true; }
376e7dd3972SPavel Labath
GetIndexOfChildWithName(ConstString name)377e7dd3972SPavel Labath size_t LibStdcppSharedPtrSyntheticFrontEnd::GetIndexOfChildWithName(
3780e4c4821SAdrian Prantl ConstString name) {
37905cfdb0eSRaphael Isemann if (name == "_M_ptr")
380e7dd3972SPavel Labath return 0;
381e7dd3972SPavel Labath return UINT32_MAX;
382e7dd3972SPavel Labath }
383e7dd3972SPavel Labath
384e7dd3972SPavel Labath SyntheticChildrenFrontEnd *
LibStdcppSharedPtrSyntheticFrontEndCreator(CXXSyntheticChildren *,lldb::ValueObjectSP valobj_sp)385e7dd3972SPavel Labath lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator(
386e7dd3972SPavel Labath CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {
387e7dd3972SPavel Labath return (valobj_sp ? new LibStdcppSharedPtrSyntheticFrontEnd(valobj_sp)
388e7dd3972SPavel Labath : nullptr);
389e7dd3972SPavel Labath }
390e7dd3972SPavel Labath
LibStdcppSmartPointerSummaryProvider(ValueObject & valobj,Stream & stream,const TypeSummaryOptions & options)391e7dd3972SPavel Labath bool lldb_private::formatters::LibStdcppSmartPointerSummaryProvider(
392e7dd3972SPavel Labath ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
393e7dd3972SPavel Labath ValueObjectSP valobj_sp(valobj.GetNonSyntheticValue());
394e7dd3972SPavel Labath if (!valobj_sp)
395e7dd3972SPavel Labath return false;
396e7dd3972SPavel Labath
397e7dd3972SPavel Labath ValueObjectSP ptr_sp(
398e7dd3972SPavel Labath valobj_sp->GetChildMemberWithName(ConstString("_M_ptr"), true));
399e7dd3972SPavel Labath if (!ptr_sp)
400e7dd3972SPavel Labath return false;
401e7dd3972SPavel Labath
402e7dd3972SPavel Labath ValueObjectSP usecount_sp(valobj_sp->GetChildAtNamePath(
403e7dd3972SPavel Labath {ConstString("_M_refcount"), ConstString("_M_pi"),
404e7dd3972SPavel Labath ConstString("_M_use_count")}));
405e7dd3972SPavel Labath if (!usecount_sp)
406e7dd3972SPavel Labath return false;
407e7dd3972SPavel Labath
408e7dd3972SPavel Labath if (ptr_sp->GetValueAsUnsigned(0) == 0 ||
409e7dd3972SPavel Labath usecount_sp->GetValueAsUnsigned(0) == 0) {
410e7dd3972SPavel Labath stream.Printf("nullptr");
411e7dd3972SPavel Labath return true;
412e7dd3972SPavel Labath }
413e7dd3972SPavel Labath
41497206d57SZachary Turner Status error;
415e7dd3972SPavel Labath ValueObjectSP pointee_sp = ptr_sp->Dereference(error);
416e7dd3972SPavel Labath if (pointee_sp && error.Success()) {
417e7dd3972SPavel Labath if (pointee_sp->DumpPrintableRepresentation(
418e7dd3972SPavel Labath stream, ValueObject::eValueObjectRepresentationStyleSummary,
419e7dd3972SPavel Labath lldb::eFormatInvalid,
42065d86e4fSEnrico Granata ValueObject::PrintableRepresentationSpecialCases::eDisable,
42165d86e4fSEnrico Granata false)) {
422e7dd3972SPavel Labath return true;
423e7dd3972SPavel Labath }
424e7dd3972SPavel Labath }
425e7dd3972SPavel Labath
426e7dd3972SPavel Labath stream.Printf("ptr = 0x%" PRIx64, ptr_sp->GetValueAsUnsigned(0));
427e7dd3972SPavel Labath return true;
428e7dd3972SPavel Labath }
429