brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 020ba10 Raw
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