111 lines · cpp
1//===-- MsvcStlAtomic.cpp -------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "MsvcStl.h"10 11#include "lldb/DataFormatters/TypeSynthetic.h"12 13using namespace lldb;14 15namespace lldb_private {16namespace formatters {17 18class MsvcStlAtomicSyntheticFrontEnd : public SyntheticChildrenFrontEnd {19public:20 MsvcStlAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);21 22 llvm::Expected<uint32_t> CalculateNumChildren() override;23 24 lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;25 26 lldb::ChildCacheState Update() override;27 28 llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;29 30private:31 ValueObject *m_storage = nullptr;32 CompilerType m_element_type;33};34 35} // namespace formatters36} // namespace lldb_private37 38lldb_private::formatters::MsvcStlAtomicSyntheticFrontEnd::39 MsvcStlAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)40 : SyntheticChildrenFrontEnd(*valobj_sp), m_element_type() {41 if (valobj_sp)42 Update();43}44 45llvm::Expected<uint32_t> lldb_private::formatters::46 MsvcStlAtomicSyntheticFrontEnd::CalculateNumChildren() {47 return m_storage ? 1 : 0;48}49 50lldb::ValueObjectSP51lldb_private::formatters::MsvcStlAtomicSyntheticFrontEnd::GetChildAtIndex(52 uint32_t idx) {53 if (idx == 0 && m_storage && m_element_type.IsValid())54 return m_storage->Cast(m_element_type)->Clone(ConstString("Value"));55 return nullptr;56}57 58lldb::ChildCacheState59lldb_private::formatters::MsvcStlAtomicSyntheticFrontEnd::Update() {60 m_storage = nullptr;61 m_element_type.Clear();62 63 ValueObjectSP storage_sp = m_backend.GetChildMemberWithName("_Storage");64 if (!storage_sp)65 return lldb::ChildCacheState::eRefetch;66 67 m_element_type = m_backend.GetCompilerType().GetTypeTemplateArgument(0);68 if (!m_element_type)69 return lldb::ChildCacheState::eRefetch;70 71 m_storage = storage_sp.get();72 return lldb::ChildCacheState::eRefetch;73}74 75llvm::Expected<size_t> lldb_private::formatters::76 MsvcStlAtomicSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) {77 if (name == "Value")78 return 0;79 return llvm::createStringError("Type has no child named '%s'",80 name.AsCString());81}82 83lldb_private::SyntheticChildrenFrontEnd *84lldb_private::formatters::MsvcStlAtomicSyntheticFrontEndCreator(85 CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {86 if (valobj_sp && IsMsvcStlAtomic(*valobj_sp))87 return new MsvcStlAtomicSyntheticFrontEnd(valobj_sp);88 return nullptr;89}90 91bool lldb_private::formatters::MsvcStlAtomicSummaryProvider(92 ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {93 auto synth_sp = valobj.GetSyntheticValue();94 if (!synth_sp)95 return false;96 97 auto value_sp = synth_sp->GetChildAtIndex(0);98 std::string summary;99 if (value_sp->GetSummaryAsCString(summary, options) && !summary.empty()) {100 stream << summary;101 return true;102 }103 return false;104}105 106bool lldb_private::formatters::IsMsvcStlAtomic(ValueObject &valobj) {107 if (auto valobj_sp = valobj.GetNonSyntheticValue())108 return valobj_sp->GetChildMemberWithName("_Storage") != nullptr;109 return false;110}111