https://github.com/kastiglione created https://github.com/llvm/llvm-project/pull/182155
This changes how "self" is constructed, where "self" is the data placed on the stack before calls to `num_children`, `get_child_at_index`, etc. First, the return value of `init` is saved to its own member, `m_init_results`. Likewise, the return value of `update` is saved to a separate member, `m_update_results`. Calls to both `init` and `update` recieve only the value object on their stack. This is done to simplify implementations of `update`. It makes them more "pure", in that the argument is always a single value (the value object). Previously `update` was called with the value of "self", which was shared between `init` and `update`, and was mutated by `update`. Lastly, the results of `init` and `update` are concatenated to being the value of "self" when calling other methods. >From 42d68784f790cff9e223f84b60a5da7ee5877830 Mon Sep 17 00:00:00 2001 From: Dave Lee <[email protected]> Date: Wed, 18 Feb 2026 13:42:38 -0800 Subject: [PATCH] [lldb] Update the calling convention of BytecodeSyntheticChildren This changes how "self" is constructed, where "self" is the data placed on the stack before calls to `num_children`, `get_child_at_index`, etc. First, the return value of `init` is saved to its own member, `m_init_results`. Likewise, the return value of `update` is saved to a separate member, `m_update_results`. Calls to both `init` and `update` recieve only the value object on their stack. This is done to simplify implementations of `update`. It makes them more "pure", in that the argument is always a single value (the value object). Previously `update` was called with the value of "self", which was shared between `init` and `update`, and was mutated by `update`. Lastly, the results of `init` and `update` are concatenated to being the value of "self" when calling other methods. --- .../lldb/DataFormatters/TypeSynthetic.h | 10 ++++++- lldb/source/DataFormatters/TypeSynthetic.cpp | 30 ++++++++++++------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/lldb/include/lldb/DataFormatters/TypeSynthetic.h b/lldb/include/lldb/DataFormatters/TypeSynthetic.h index fbf1d060a92b2..ae51ab400ba3d 100644 --- a/lldb/include/lldb/DataFormatters/TypeSynthetic.h +++ b/lldb/include/lldb/DataFormatters/TypeSynthetic.h @@ -502,9 +502,17 @@ class BytecodeSyntheticChildren : public SyntheticChildren { lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override; llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; + private: + /// The data stack representing "self". The value of "self" is the results + /// of `init` combined with the results of `update`. Together, these values + /// are placed on the stack when calling `num_children`, + /// `get_child_at_index`, etc. + FormatterBytecode::DataStack GetSelf(); + private: const SyntheticBytecodeImplementation &m_impl; - FormatterBytecode::DataStack m_self; + FormatterBytecode::DataStack m_init_results; + FormatterBytecode::DataStack m_update_results; }; public: diff --git a/lldb/source/DataFormatters/TypeSynthetic.cpp b/lldb/source/DataFormatters/TypeSynthetic.cpp index 10655cdca6f05..6e5721f357c6a 100644 --- a/lldb/source/DataFormatters/TypeSynthetic.cpp +++ b/lldb/source/DataFormatters/TypeSynthetic.cpp @@ -20,8 +20,10 @@ #include "lldb/Symbol/CompilerType.h" #include "lldb/Target/Target.h" #include "lldb/Utility/StreamString.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/Support/Error.h" #include <cstdint> +#include <iterator> using namespace lldb; using namespace lldb_private; @@ -258,13 +260,11 @@ std::string ScriptedSyntheticChildren::GetDescription() { BytecodeSyntheticChildren::FrontEnd::FrontEnd( ValueObject &backend, SyntheticBytecodeImplementation &impl) : SyntheticChildrenFrontEnd(backend), m_impl(impl) { - FormatterBytecode::DataStack data(backend.GetSP()); - if (!m_impl.init) { - m_self = std::move(data); + if (!m_impl.init) return; - } FormatterBytecode::ControlStack control = {m_impl.init->getBuffer()}; + FormatterBytecode::DataStack data = {backend.GetSP()}; llvm::Error error = FormatterBytecode::Interpret(control, data, FormatterBytecode::sig_init); if (error) { @@ -274,7 +274,7 @@ BytecodeSyntheticChildren::FrontEnd::FrontEnd( } if (data.size() > 0) - m_self = std::move(data); + m_init_results = std::move(data); } lldb::ChildCacheState BytecodeSyntheticChildren::FrontEnd::Update() { @@ -282,7 +282,7 @@ lldb::ChildCacheState BytecodeSyntheticChildren::FrontEnd::Update() { return ChildCacheState::eRefetch; FormatterBytecode::ControlStack control = {m_impl.update->getBuffer()}; - FormatterBytecode::DataStack data = m_self; + FormatterBytecode::DataStack data = {m_backend.GetSP()}; llvm::Error error = FormatterBytecode::Interpret( control, data, FormatterBytecode::sig_update); if (error) { @@ -292,7 +292,7 @@ lldb::ChildCacheState BytecodeSyntheticChildren::FrontEnd::Update() { } if (data.size() > 0) - m_self = std::move(data); + m_update_results = std::move(data); return ChildCacheState::eRefetch; } @@ -303,7 +303,7 @@ BytecodeSyntheticChildren::FrontEnd::CalculateNumChildren() { return 0; FormatterBytecode::ControlStack control = {m_impl.num_children->getBuffer()}; - FormatterBytecode::DataStack data = m_self; + FormatterBytecode::DataStack data = GetSelf(); llvm::Error error = FormatterBytecode::Interpret( control, data, FormatterBytecode::sig_get_num_children); if (error) @@ -335,7 +335,7 @@ BytecodeSyntheticChildren::FrontEnd::GetChildAtIndex(uint32_t idx) { FormatterBytecode::ControlStack control = { m_impl.get_child_at_index->getBuffer()}; - FormatterBytecode::DataStack data = m_self; + FormatterBytecode::DataStack data = GetSelf(); data.emplace_back((uint64_t)idx); llvm::Error error = FormatterBytecode::Interpret( control, data, FormatterBytecode::sig_get_child_at_index); @@ -365,7 +365,7 @@ BytecodeSyntheticChildren::FrontEnd::GetIndexOfChildWithName(ConstString name) { FormatterBytecode::ControlStack control = { m_impl.get_child_index->getBuffer()}; - FormatterBytecode::DataStack data = m_self; + FormatterBytecode::DataStack data = GetSelf(); data.emplace_back(name.GetString()); llvm::Error error = FormatterBytecode::Interpret( control, data, FormatterBytecode::sig_get_child_index); @@ -391,6 +391,16 @@ BytecodeSyntheticChildren::FrontEnd::GetIndexOfChildWithName(ConstString name) { return llvm::createStringError("@get_child_index returned invalid value"); } +FormatterBytecode::DataStack BytecodeSyntheticChildren::FrontEnd::GetSelf() { + FormatterBytecode::DataStack self; + llvm::copy(m_init_results, std::back_inserter(self)); + llvm::copy(m_update_results, std::back_inserter(self)); + if (self.empty()) + // As a fallback, "self" is just the valobj. + self.emplace_back(m_backend.GetSP()); + return self; +} + std::string BytecodeSyntheticChildren::GetDescription() { StreamString sstr; sstr.Printf("%s%s%s Bytecode synthetic", Cascades() ? "" : " (not cascading)", _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
