1*80814287SRaphael Isemann //===-- LibStdcppTuple.cpp ------------------------------------------------===// 27f15dba1STamas Berghammer // 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 67f15dba1STamas Berghammer // 77f15dba1STamas Berghammer //===----------------------------------------------------------------------===// 87f15dba1STamas Berghammer 97f15dba1STamas Berghammer #include "LibStdcpp.h" 107f15dba1STamas Berghammer 117f15dba1STamas Berghammer #include "lldb/Core/ValueObject.h" 127f15dba1STamas Berghammer #include "lldb/DataFormatters/FormattersHelpers.h" 137f15dba1STamas Berghammer #include "lldb/DataFormatters/TypeSynthetic.h" 14bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h" 157f15dba1STamas Berghammer 16de2cc6e4STamas Berghammer #include <memory> 17de2cc6e4STamas Berghammer #include <vector> 18de2cc6e4STamas Berghammer 197f15dba1STamas Berghammer using namespace lldb; 207f15dba1STamas Berghammer using namespace lldb_private; 217f15dba1STamas Berghammer using namespace lldb_private::formatters; 227f15dba1STamas Berghammer 237f15dba1STamas Berghammer namespace { 247f15dba1STamas Berghammer 257f15dba1STamas Berghammer class LibStdcppTupleSyntheticFrontEnd : public SyntheticChildrenFrontEnd { 267f15dba1STamas Berghammer public: 277f15dba1STamas Berghammer explicit LibStdcppTupleSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); 287f15dba1STamas Berghammer 297f15dba1STamas Berghammer size_t CalculateNumChildren() override; 307f15dba1STamas Berghammer 317f15dba1STamas Berghammer lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; 327f15dba1STamas Berghammer 337f15dba1STamas Berghammer bool Update() override; 347f15dba1STamas Berghammer 357f15dba1STamas Berghammer bool MightHaveChildren() override; 367f15dba1STamas Berghammer 370e4c4821SAdrian Prantl size_t GetIndexOfChildWithName(ConstString name) override; 387f15dba1STamas Berghammer 397f15dba1STamas Berghammer private: 4089386daaSCameron Desrochers // The lifetime of a ValueObject and all its derivative ValueObjects 4189386daaSCameron Desrochers // (children, clones, etc.) is managed by a ClusterManager. These 4289386daaSCameron Desrochers // objects are only destroyed when every shared pointer to any of them 4389386daaSCameron Desrochers // is destroyed, so we must not store a shared pointer to any ValueObject 4489386daaSCameron Desrochers // derived from our backend ValueObject (since we're in the same cluster). 4589386daaSCameron Desrochers std::vector<ValueObject*> m_members; 467f15dba1STamas Berghammer }; 477f15dba1STamas Berghammer 487f15dba1STamas Berghammer } // end of anonymous namespace 497f15dba1STamas Berghammer LibStdcppTupleSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)507f15dba1STamas BerghammerLibStdcppTupleSyntheticFrontEnd::LibStdcppTupleSyntheticFrontEnd( 517f15dba1STamas Berghammer lldb::ValueObjectSP valobj_sp) 527f15dba1STamas Berghammer : SyntheticChildrenFrontEnd(*valobj_sp) { 537f15dba1STamas Berghammer Update(); 547f15dba1STamas Berghammer } 557f15dba1STamas Berghammer Update()567f15dba1STamas Berghammerbool LibStdcppTupleSyntheticFrontEnd::Update() { 577f15dba1STamas Berghammer m_members.clear(); 587f15dba1STamas Berghammer 597f15dba1STamas Berghammer ValueObjectSP valobj_backend_sp = m_backend.GetSP(); 607f15dba1STamas Berghammer if (!valobj_backend_sp) 617f15dba1STamas Berghammer return false; 627f15dba1STamas Berghammer 637f15dba1STamas Berghammer ValueObjectSP next_child_sp = valobj_backend_sp->GetNonSyntheticValue(); 647f15dba1STamas Berghammer while (next_child_sp != nullptr) { 657f15dba1STamas Berghammer ValueObjectSP current_child = next_child_sp; 667f15dba1STamas Berghammer next_child_sp = nullptr; 677f15dba1STamas Berghammer 687f15dba1STamas Berghammer size_t child_count = current_child->GetNumChildren(); 697f15dba1STamas Berghammer for (size_t i = 0; i < child_count; ++i) { 707f15dba1STamas Berghammer ValueObjectSP child_sp = current_child->GetChildAtIndex(i, true); 717f15dba1STamas Berghammer llvm::StringRef name_str = child_sp->GetName().GetStringRef(); 727f15dba1STamas Berghammer if (name_str.startswith("std::_Tuple_impl<")) { 737f15dba1STamas Berghammer next_child_sp = child_sp; 747f15dba1STamas Berghammer } else if (name_str.startswith("std::_Head_base<")) { 757f15dba1STamas Berghammer ValueObjectSP value_sp = 767f15dba1STamas Berghammer child_sp->GetChildMemberWithName(ConstString("_M_head_impl"), true); 777f15dba1STamas Berghammer if (value_sp) { 787f15dba1STamas Berghammer StreamString name; 797f15dba1STamas Berghammer name.Printf("[%zd]", m_members.size()); 8089386daaSCameron Desrochers m_members.push_back(value_sp->Clone(ConstString(name.GetString())).get()); 817f15dba1STamas Berghammer } 827f15dba1STamas Berghammer } 837f15dba1STamas Berghammer } 847f15dba1STamas Berghammer } 857f15dba1STamas Berghammer 867f15dba1STamas Berghammer return false; 877f15dba1STamas Berghammer } 887f15dba1STamas Berghammer MightHaveChildren()897f15dba1STamas Berghammerbool LibStdcppTupleSyntheticFrontEnd::MightHaveChildren() { return true; } 907f15dba1STamas Berghammer 917f15dba1STamas Berghammer lldb::ValueObjectSP GetChildAtIndex(size_t idx)927f15dba1STamas BerghammerLibStdcppTupleSyntheticFrontEnd::GetChildAtIndex(size_t idx) { 93745e57c5SCameron Desrochers if (idx < m_members.size() && m_members[idx]) 9489386daaSCameron Desrochers return m_members[idx]->GetSP(); 957f15dba1STamas Berghammer return lldb::ValueObjectSP(); 967f15dba1STamas Berghammer } 977f15dba1STamas Berghammer CalculateNumChildren()987f15dba1STamas Berghammersize_t LibStdcppTupleSyntheticFrontEnd::CalculateNumChildren() { 997f15dba1STamas Berghammer return m_members.size(); 1007f15dba1STamas Berghammer } 1017f15dba1STamas Berghammer GetIndexOfChildWithName(ConstString name)1027f15dba1STamas Berghammersize_t LibStdcppTupleSyntheticFrontEnd::GetIndexOfChildWithName( 1030e4c4821SAdrian Prantl ConstString name) { 1047f15dba1STamas Berghammer return ExtractIndexFromString(name.GetCString()); 1057f15dba1STamas Berghammer } 1067f15dba1STamas Berghammer 1077f15dba1STamas Berghammer SyntheticChildrenFrontEnd * LibStdcppTupleSyntheticFrontEndCreator(CXXSyntheticChildren *,lldb::ValueObjectSP valobj_sp)1087f15dba1STamas Berghammerlldb_private::formatters::LibStdcppTupleSyntheticFrontEndCreator( 1097f15dba1STamas Berghammer CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { 1107f15dba1STamas Berghammer return (valobj_sp ? new LibStdcppTupleSyntheticFrontEnd(valobj_sp) : nullptr); 1117f15dba1STamas Berghammer } 112