Path: blob/main/contrib/llvm-project/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp
39644 views
//===-- LibCxxAtomic.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 "LibCxxAtomic.h"9#include "lldb/DataFormatters/FormattersHelpers.h"1011using namespace lldb;12using namespace lldb_private;13using namespace lldb_private::formatters;1415//16// We are supporting two versions of libc++ std::atomic17//18// Given std::atomic<int> i;19//20// The previous version of std::atomic was laid out like this21//22// (lldb) frame var -L -R i23// 0x00007ffeefbff9a0: (std::__1::atomic<int>) i = {24// 0x00007ffeefbff9a0: std::__1::__atomic_base<int, true> = {25// 0x00007ffeefbff9a0: std::__1::__atomic_base<int, false> = {26// 0x00007ffeefbff9a0: __a_ = 527// }28// }29// }30//31// In this case we need to obtain __a_ and the current version is laid out as so32//33// (lldb) frame var -L -R i34// 0x00007ffeefbff9b0: (std::__1::atomic<int>) i = {35// 0x00007ffeefbff9b0: std::__1::__atomic_base<int, true> = {36// 0x00007ffeefbff9b0: std::__1::__atomic_base<int, false> = {37// 0x00007ffeefbff9b0: __a_ = {38// 0x00007ffeefbff9b0: std::__1::__cxx_atomic_base_impl<int> = {39// 0x00007ffeefbff9b0: __a_value = 540// }41// }42// }43// }44//}45//46// In this case we need to obtain __a_value47//48// The below method covers both cases and returns the relevant member as a49// ValueObjectSP50//51ValueObjectSP52lldb_private::formatters::GetLibCxxAtomicValue(ValueObject &valobj) {53ValueObjectSP non_sythetic = valobj.GetNonSyntheticValue();54if (!non_sythetic)55return {};5657ValueObjectSP member__a_ = non_sythetic->GetChildMemberWithName("__a_");58if (!member__a_)59return {};6061ValueObjectSP member__a_value =62member__a_->GetChildMemberWithName("__a_value");63if (!member__a_value)64return member__a_;6566return member__a_value;67}6869bool lldb_private::formatters::LibCxxAtomicSummaryProvider(70ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {7172if (ValueObjectSP atomic_value = GetLibCxxAtomicValue(valobj)) {73std::string summary;74if (atomic_value->GetSummaryAsCString(summary, options) &&75summary.size() > 0) {76stream.Printf("%s", summary.c_str());77return true;78}79}8081return false;82}8384namespace lldb_private {85namespace formatters {86class LibcxxStdAtomicSyntheticFrontEnd : public SyntheticChildrenFrontEnd {87public:88LibcxxStdAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);8990~LibcxxStdAtomicSyntheticFrontEnd() override = default;9192llvm::Expected<uint32_t> CalculateNumChildren() override;9394lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;9596lldb::ChildCacheState Update() override;9798bool MightHaveChildren() override;99100size_t GetIndexOfChildWithName(ConstString name) override;101102private:103ValueObject *m_real_child = nullptr;104};105} // namespace formatters106} // namespace lldb_private107108lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::109LibcxxStdAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)110: SyntheticChildrenFrontEnd(*valobj_sp) {}111112lldb::ChildCacheState113lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::Update() {114ValueObjectSP atomic_value = GetLibCxxAtomicValue(m_backend);115if (atomic_value)116m_real_child = GetLibCxxAtomicValue(m_backend).get();117118return lldb::ChildCacheState::eRefetch;119}120121bool lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::122MightHaveChildren() {123return true;124}125126llvm::Expected<uint32_t> lldb_private::formatters::127LibcxxStdAtomicSyntheticFrontEnd::CalculateNumChildren() {128return m_real_child ? 1 : 0;129}130131lldb::ValueObjectSP132lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetChildAtIndex(133uint32_t idx) {134if (idx == 0)135return m_real_child->GetSP()->Clone(ConstString("Value"));136return nullptr;137}138139size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::140GetIndexOfChildWithName(ConstString name) {141return name == "Value" ? 0 : UINT32_MAX;142}143144SyntheticChildrenFrontEnd *145lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator(146CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {147if (valobj_sp)148return new LibcxxStdAtomicSyntheticFrontEnd(valobj_sp);149return nullptr;150}151152153