Path: blob/main/contrib/llvm-project/lldb/source/Plugins/Language/CPlusPlus/LibCxxValarray.cpp
39642 views
//===-- LibCxxValarray.cpp ------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "LibCxx.h"910#include "lldb/Core/ValueObject.h"11#include "lldb/DataFormatters/FormattersHelpers.h"12#include <optional>1314using namespace lldb;15using namespace lldb_private;16using namespace lldb_private::formatters;1718namespace lldb_private {19namespace formatters {20class LibcxxStdValarraySyntheticFrontEnd : public SyntheticChildrenFrontEnd {21public:22LibcxxStdValarraySyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);2324~LibcxxStdValarraySyntheticFrontEnd() override;2526llvm::Expected<uint32_t> CalculateNumChildren() override;2728lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;2930lldb::ChildCacheState Update() override;3132bool MightHaveChildren() override;3334size_t GetIndexOfChildWithName(ConstString name) override;3536private:37/// A non-owning pointer to valarray's __begin_ member.38ValueObject *m_start = nullptr;39/// A non-owning pointer to valarray's __end_ member.40ValueObject *m_finish = nullptr;41/// The type of valarray's template argument T.42CompilerType m_element_type;43/// The sizeof valarray's template argument T.44uint32_t m_element_size = 0;45};4647} // namespace formatters48} // namespace lldb_private4950lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd::51LibcxxStdValarraySyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)52: SyntheticChildrenFrontEnd(*valobj_sp), m_element_type() {53if (valobj_sp)54Update();55}5657lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd::58~LibcxxStdValarraySyntheticFrontEnd() {59// these need to stay around because they are child objects who will follow60// their parent's life cycle61// delete m_start;62// delete m_finish;63}6465llvm::Expected<uint32_t> lldb_private::formatters::66LibcxxStdValarraySyntheticFrontEnd::CalculateNumChildren() {67if (!m_start || !m_finish)68return 0;69uint64_t start_val = m_start->GetValueAsUnsigned(0);70uint64_t finish_val = m_finish->GetValueAsUnsigned(0);7172if (start_val == 0 || finish_val == 0)73return 0;7475if (start_val >= finish_val)76return 0;7778size_t num_children = (finish_val - start_val);79if (num_children % m_element_size)80return 0;81return num_children / m_element_size;82}8384lldb::ValueObjectSP85lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd::GetChildAtIndex(86uint32_t idx) {87if (!m_start || !m_finish)88return lldb::ValueObjectSP();8990uint64_t offset = idx * m_element_size;91offset = offset + m_start->GetValueAsUnsigned(0);92StreamString name;93name.Printf("[%" PRIu64 "]", (uint64_t)idx);94return CreateValueObjectFromAddress(name.GetString(), offset,95m_backend.GetExecutionContextRef(),96m_element_type);97}9899lldb::ChildCacheState100lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd::Update() {101m_start = m_finish = nullptr;102103CompilerType type = m_backend.GetCompilerType();104if (type.GetNumTemplateArguments() == 0)105return ChildCacheState::eRefetch;106107m_element_type = type.GetTypeTemplateArgument(0);108if (std::optional<uint64_t> size = m_element_type.GetByteSize(nullptr))109m_element_size = *size;110111if (m_element_size == 0)112return ChildCacheState::eRefetch;113114ValueObjectSP start = m_backend.GetChildMemberWithName("__begin_");115ValueObjectSP finish = m_backend.GetChildMemberWithName("__end_");116117if (!start || !finish)118return ChildCacheState::eRefetch;119120m_start = start.get();121m_finish = finish.get();122123return ChildCacheState::eRefetch;124}125126bool lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd::127MightHaveChildren() {128return true;129}130131size_t lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd::132GetIndexOfChildWithName(ConstString name) {133if (!m_start || !m_finish)134return std::numeric_limits<size_t>::max();135return ExtractIndexFromString(name.GetCString());136}137138lldb_private::SyntheticChildrenFrontEnd *139lldb_private::formatters::LibcxxStdValarraySyntheticFrontEndCreator(140CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {141if (!valobj_sp)142return nullptr;143return new LibcxxStdValarraySyntheticFrontEnd(valobj_sp);144}145146147