//===-- MsvcStlAtomic.cpp -------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "MsvcStl.h" #include "lldb/DataFormatters/TypeSynthetic.h" using namespace lldb; namespace lldb_private { namespace formatters { class MsvcStlAtomicSyntheticFrontEnd : public SyntheticChildrenFrontEnd { public: MsvcStlAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); llvm::Expected CalculateNumChildren() override; lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override; lldb::ChildCacheState Update() override; llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: ValueObject *m_storage = nullptr; CompilerType m_element_type; }; } // namespace formatters } // namespace lldb_private lldb_private::formatters::MsvcStlAtomicSyntheticFrontEnd:: MsvcStlAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) : SyntheticChildrenFrontEnd(*valobj_sp), m_element_type() { if (valobj_sp) Update(); } llvm::Expected lldb_private::formatters:: MsvcStlAtomicSyntheticFrontEnd::CalculateNumChildren() { return m_storage ? 1 : 0; } lldb::ValueObjectSP lldb_private::formatters::MsvcStlAtomicSyntheticFrontEnd::GetChildAtIndex( uint32_t idx) { if (idx == 0) return m_storage->Cast(m_element_type)->Clone(ConstString("Value")); return nullptr; } lldb::ChildCacheState lldb_private::formatters::MsvcStlAtomicSyntheticFrontEnd::Update() { m_storage = nullptr; m_element_type.Clear(); ValueObjectSP storage_sp = m_backend.GetChildMemberWithName("_Storage"); if (!storage_sp) return lldb::ChildCacheState::eRefetch; m_element_type = m_backend.GetCompilerType().GetTypeTemplateArgument(0); if (!m_element_type) return lldb::ChildCacheState::eRefetch; m_storage = storage_sp.get(); return lldb::ChildCacheState::eRefetch; } llvm::Expected lldb_private::formatters:: MsvcStlAtomicSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { if (name == "Value") return 0; return llvm::createStringError("Type has no child named '%s'", name.AsCString()); } lldb_private::SyntheticChildrenFrontEnd * lldb_private::formatters::MsvcStlAtomicSyntheticFrontEndCreator( CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { return new MsvcStlAtomicSyntheticFrontEnd(valobj_sp); } bool lldb_private::formatters::MsvcStlAtomicSummaryProvider( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { auto synth_sp = valobj.GetSyntheticValue(); if (!synth_sp) return false; auto value_sp = synth_sp->GetChildAtIndex(0); std::string summary; if (value_sp->GetSummaryAsCString(summary, options) && !summary.empty()) { stream << summary; return true; } return false; }