Skip to content

[lldb] Upgrade GetIndexOfChildWithName to use llvm::Expected #136693

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions lldb/include/lldb/DataFormatters/TypeSynthetic.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class SyntheticChildrenFrontEnd {

virtual lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) = 0;

virtual size_t GetIndexOfChildWithName(ConstString name) = 0;
virtual llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) = 0;

/// This function is assumed to always succeed and if it fails, the front-end
/// should know to deal with it in the correct way (most probably, by refusing
Expand Down Expand Up @@ -117,8 +117,9 @@ class SyntheticValueProviderFrontEnd : public SyntheticChildrenFrontEnd {

lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override { return nullptr; }

size_t GetIndexOfChildWithName(ConstString name) override {
return UINT32_MAX;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}

lldb::ChildCacheState Update() override {
Expand Down Expand Up @@ -343,7 +344,7 @@ class TypeFilterImpl : public SyntheticChildren {

bool MightHaveChildren() override { return filter->GetCount() > 0; }

size_t GetIndexOfChildWithName(ConstString name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;

typedef std::shared_ptr<SyntheticChildrenFrontEnd> SharedPointer;

Expand Down Expand Up @@ -442,7 +443,7 @@ class ScriptedSyntheticChildren : public SyntheticChildren {

bool MightHaveChildren() override;

size_t GetIndexOfChildWithName(ConstString name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;

lldb::ValueObjectSP GetSyntheticValue() override;

Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/DataFormatters/VectorIterator.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd {

lldb::ChildCacheState Update() override;

size_t GetIndexOfChildWithName(ConstString name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;

private:
ExecutionContextRef m_exe_ctx_ref;
Expand Down
4 changes: 2 additions & 2 deletions lldb/include/lldb/Interpreter/ScriptInterpreter.h
Original file line number Diff line number Diff line change
Expand Up @@ -368,10 +368,10 @@ class ScriptInterpreter : public PluginInterface {
return lldb::ValueObjectSP();
}

virtual int
virtual llvm::Expected<int>
GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor,
const char *child_name) {
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'", child_name);
}

virtual bool
Expand Down
5 changes: 3 additions & 2 deletions lldb/include/lldb/Symbol/CompilerType.h
Original file line number Diff line number Diff line change
Expand Up @@ -444,8 +444,9 @@ class CompilerType {

/// Lookup a child given a name. This function will match base class names and
/// member member names in "clang_type" only, not descendants.
uint32_t GetIndexOfChildWithName(llvm::StringRef name,
bool omit_empty_base_classes) const;
llvm::Expected<uint32_t>
GetIndexOfChildWithName(llvm::StringRef name,
bool omit_empty_base_classes) const;

/// Lookup a child member given a name. This function will match member names
/// only and will descend into "clang_type" children in search for the first
Expand Down
9 changes: 6 additions & 3 deletions lldb/include/lldb/Symbol/TypeSystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -373,9 +373,12 @@ class TypeSystem : public PluginInterface,
bool &child_is_base_class, bool &child_is_deref_of_parent,
ValueObject *valobj, uint64_t &language_flags) = 0;

virtual uint32_t GetIndexOfChildWithName(lldb::opaque_compiler_type_t type,
llvm::StringRef name,
bool omit_empty_base_classes) = 0;
// Lookup a child given a name. This function will match base class names and
// member member names in "clang_type" only, not descendants.
virtual llvm::Expected<uint32_t>
GetIndexOfChildWithName(lldb::opaque_compiler_type_t type,
llvm::StringRef name,
bool omit_empty_base_classes) = 0;

virtual size_t GetIndexOfChildMemberWithName(
lldb::opaque_compiler_type_t type, llvm::StringRef name,
Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/ValueObject/ValueObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,7 @@ class ValueObject {
virtual lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name,
bool can_create = true);

virtual size_t GetIndexOfChildWithName(llvm::StringRef name);
virtual llvm::Expected<size_t> GetIndexOfChildWithName(llvm::StringRef name);

llvm::Expected<uint32_t> GetNumChildren(uint32_t max = UINT32_MAX);
/// Like \c GetNumChildren but returns 0 on error. You probably
Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/ValueObject/ValueObjectRegister.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class ValueObjectRegisterSet : public ValueObject {
lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name,
bool can_create = true) override;

size_t GetIndexOfChildWithName(llvm::StringRef name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(llvm::StringRef name) override;

protected:
bool UpdateValue() override;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class ValueObjectSynthetic : public ValueObject {
lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name,
bool can_create = true) override;

size_t GetIndexOfChildWithName(llvm::StringRef name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(llvm::StringRef name) override;

lldb::ValueObjectSP
GetDynamicValue(lldb::DynamicValueType valueType) override;
Expand Down
8 changes: 5 additions & 3 deletions lldb/source/API/SBValue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -704,13 +704,15 @@ SBValue SBValue::GetChildAtIndex(uint32_t idx,
uint32_t SBValue::GetIndexOfChildWithName(const char *name) {
LLDB_INSTRUMENT_VA(this, name);

uint32_t idx = UINT32_MAX;
ValueLocker locker;
lldb::ValueObjectSP value_sp(GetSP(locker));
if (value_sp) {
idx = value_sp->GetIndexOfChildWithName(name);
if (auto idx_or_err = value_sp->GetIndexOfChildWithName(name))
return *idx_or_err;
else
llvm::consumeError(idx_or_err.takeError());
}
return idx;
return UINT32_MAX;
}

SBValue SBValue::GetChildMemberWithName(const char *name) {
Expand Down
6 changes: 5 additions & 1 deletion lldb/source/DataFormatters/FormatterBytecode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "FormatterBytecode.h"
#include "lldb/Utility/LLDBLog.h"
#include "lldb/ValueObject/ValueObject.h"
#include "lldb/ValueObject/ValueObjectConstResult.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/DataExtractor.h"
#include "llvm/Support/Format.h"
Expand Down Expand Up @@ -489,7 +490,10 @@ llvm::Error Interpret(std::vector<ControlStackElement> &control,
TYPE_CHECK(Object, String);
auto name = data.Pop<std::string>();
POP_VALOBJ(valobj);
data.Push((uint64_t)valobj->GetIndexOfChildWithName(name));
if (auto index_or_err = valobj->GetIndexOfChildWithName(name))
data.Push((uint64_t)*index_or_err);
else
return index_or_err.takeError();
break;
}
case sel_get_type: {
Expand Down
12 changes: 7 additions & 5 deletions lldb/source/DataFormatters/TypeSynthetic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ bool TypeFilterImpl::SetExpressionPathAtIndex(size_t i,
return true;
}

size_t
llvm::Expected<size_t>
TypeFilterImpl::FrontEnd::GetIndexOfChildWithName(ConstString name) {
const char *name_cstr = name.GetCString();
if (name_cstr) {
Expand All @@ -67,7 +67,8 @@ TypeFilterImpl::FrontEnd::GetIndexOfChildWithName(ConstString name) {
}
}
}
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}

std::string TypeFilterImpl::GetDescription() {
Expand Down Expand Up @@ -218,10 +219,11 @@ bool ScriptedSyntheticChildren::FrontEnd::MightHaveChildren() {
return m_interpreter->MightHaveChildrenSynthProviderInstance(m_wrapper_sp);
}

size_t ScriptedSyntheticChildren::FrontEnd::GetIndexOfChildWithName(
ConstString name) {
llvm::Expected<size_t>
ScriptedSyntheticChildren::FrontEnd::GetIndexOfChildWithName(ConstString name) {
if (!m_wrapper_sp || m_interpreter == nullptr)
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we be more descriptive with where the error came from? E.g., "ScriptedSyntheticChildren::FrontEnd cannot find index of child '%s'"? Same with the other places in this PR

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I ended up editing the message everywhere it was used, adding 'classname' at the beginning of each.

return m_interpreter->GetIndexOfChildWithName(m_wrapper_sp,
name.GetCString());
}
Expand Down
8 changes: 5 additions & 3 deletions lldb/source/DataFormatters/VectorType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -269,11 +269,13 @@ class VectorTypeSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
return lldb::ChildCacheState::eRefetch;
}

size_t GetIndexOfChildWithName(ConstString name) override {
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
const char *item_name = name.GetCString();
uint32_t idx = ExtractIndexFromString(item_name);
if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors())
return UINT32_MAX;
if (idx == UINT32_MAX ||
(idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
return idx;
}

Expand Down
18 changes: 14 additions & 4 deletions lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,10 @@ class BlockPointerSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
return lldb::ChildCacheState::eRefetch;
}

size_t GetIndexOfChildWithName(ConstString name) override {
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
if (!m_block_struct_type.IsValid())
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());

const bool omit_empty_base_classes = false;
return m_block_struct_type.GetIndexOfChildWithName(name.AsCString(),
Expand All @@ -172,8 +173,17 @@ bool lldb_private::formatters::BlockPointerSummaryProvider(

static const ConstString s_FuncPtr_name("__FuncPtr");

lldb::ValueObjectSP child_sp = synthetic_children->GetChildAtIndex(
synthetic_children->GetIndexOfChildWithName(s_FuncPtr_name));
auto index_or_err =
synthetic_children->GetIndexOfChildWithName(s_FuncPtr_name);

if (!index_or_err) {
LLDB_LOG_ERROR(GetLog(LLDBLog::DataFormatters), index_or_err.takeError(),
"{0}");
return false;
}

lldb::ValueObjectSP child_sp =
synthetic_children->GetChildAtIndex(*index_or_err);

if (!child_sp) {
return false;
Expand Down
9 changes: 6 additions & 3 deletions lldb/source/Plugins/Language/CPlusPlus/Coroutines.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,10 +199,12 @@ lldb_private::formatters::StdlibCoroutineHandleSyntheticFrontEnd::Update() {
return lldb::ChildCacheState::eRefetch;
}

size_t StdlibCoroutineHandleSyntheticFrontEnd::GetIndexOfChildWithName(
llvm::Expected<size_t>
StdlibCoroutineHandleSyntheticFrontEnd::GetIndexOfChildWithName(
ConstString name) {
if (!m_resume_ptr_sp || !m_destroy_ptr_sp)
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());

if (name == ConstString("resume"))
return 0;
Expand All @@ -211,7 +213,8 @@ size_t StdlibCoroutineHandleSyntheticFrontEnd::GetIndexOfChildWithName(
if (name == ConstString("promise_ptr") && m_promise_ptr_sp)
return 2;

return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}

SyntheticChildrenFrontEnd *
Expand Down
2 changes: 1 addition & 1 deletion lldb/source/Plugins/Language/CPlusPlus/Coroutines.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class StdlibCoroutineHandleSyntheticFrontEnd

lldb::ChildCacheState Update() override;

size_t GetIndexOfChildWithName(ConstString name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;

private:
lldb::ValueObjectSP m_resume_ptr_sp;
Expand Down
8 changes: 6 additions & 2 deletions lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,12 @@ class GenericBitsetFrontEnd : public SyntheticChildrenFrontEnd {

GenericBitsetFrontEnd(ValueObject &valobj, StdLib stdlib);

size_t GetIndexOfChildWithName(ConstString name) override {
return formatters::ExtractIndexFromString(name.GetCString());
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
size_t idx = formatters::ExtractIndexFromString(name.GetCString());
if (idx == UINT32_MAX)
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
return idx;
}

lldb::ChildCacheState Update() override;
Expand Down
8 changes: 6 additions & 2 deletions lldb/source/Plugins/Language/CPlusPlus/GenericOptional.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,14 @@ class GenericOptionalFrontend : public SyntheticChildrenFrontEnd {

GenericOptionalFrontend(ValueObject &valobj, StdLib stdlib);

size_t GetIndexOfChildWithName(ConstString name) override {
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
if (name == "$$dereference$$")
return 0;
return formatters::ExtractIndexFromString(name.GetCString());
size_t idx = formatters::ExtractIndexFromString(name.GetCString());
if (idx == UINT32_MAX)
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
return idx;
}

llvm::Expected<uint32_t> CalculateNumChildren() override {
Expand Down
24 changes: 17 additions & 7 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -309,13 +309,15 @@ lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::Update() {
return lldb::ChildCacheState::eRefetch;
}

size_t lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::
llvm::Expected<size_t>
lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::
GetIndexOfChildWithName(ConstString name) {
if (name == "__ptr_")
return 0;
if (name == "$$dereference$$")
return 1;
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}

lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::
Expand Down Expand Up @@ -407,15 +409,17 @@ lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd::Update() {
return lldb::ChildCacheState::eRefetch;
}

size_t lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd::
llvm::Expected<size_t>
lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd::
GetIndexOfChildWithName(ConstString name) {
if (name == "pointer")
return 0;
if (name == "deleter")
return 1;
if (name == "$$dereference$$")
return 2;
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}

bool lldb_private::formatters::LibcxxContainerSummaryProvider(
Expand Down Expand Up @@ -456,9 +460,15 @@ ExtractLibcxxStringInfo(ValueObject &valobj) {
if (!l)
return {};

StringLayout layout = l->GetIndexOfChildWithName("__data_") == 0
? StringLayout::DSC
: StringLayout::CSD;
auto index_or_err = l->GetIndexOfChildWithName("__data_");
if (!index_or_err) {
LLDB_LOG_ERROR(GetLog(LLDBLog::DataFormatters), index_or_err.takeError(),
"{0}");
return {};
}

StringLayout layout =
*index_or_err == 0 ? StringLayout::DSC : StringLayout::CSD;

bool short_mode = false; // this means the string is in short-mode and the
// data is stored inline
Expand Down
4 changes: 2 additions & 2 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxx.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ class LibcxxSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd {

lldb::ChildCacheState Update() override;

size_t GetIndexOfChildWithName(ConstString name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;

~LibcxxSharedPtrSyntheticFrontEnd() override;

Expand All @@ -120,7 +120,7 @@ class LibcxxUniquePtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd {

lldb::ChildCacheState Update() override;

size_t GetIndexOfChildWithName(ConstString name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;

~LibcxxUniquePtrSyntheticFrontEnd() override;

Expand Down
Loading
Loading