Skip to content

🍒 [lldb] upgrade GetIndexOfChildWithName to use llvm::Expected and ExtractIndexFromString to use std::optional #10642

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

Open
wants to merge 2 commits into
base: swift/release/6.2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lldb/include/lldb/DataFormatters/FormattersHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ void AddFilter(TypeCategoryImpl::SharedPointer category_sp,
llvm::StringRef type_name,
ScriptedSyntheticChildren::Flags flags, bool regex = false);

size_t ExtractIndexFromString(const char *item_name);
std::optional<size_t> ExtractIndexFromString(const char *item_name);

Address GetArrayAddressOrPointerValue(ValueObject &valobj);

Expand Down
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 @@ -32,7 +32,7 @@ class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd {

bool MightHaveChildren() 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 @@ -385,10 +385,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
7 changes: 4 additions & 3 deletions lldb/include/lldb/Symbol/CompilerType.h
Original file line number Diff line number Diff line change
Expand Up @@ -481,9 +481,10 @@ 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,
ExecutionContext *exe_ctx,
bool omit_empty_base_classes) const;

llvm::Expected<uint32_t>
GetIndexOfChildWithName(llvm::StringRef name, ExecutionContext *exe_ctx,
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
8 changes: 4 additions & 4 deletions lldb/include/lldb/Symbol/TypeSystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -409,10 +409,10 @@ class TypeSystem : public PluginInterface,

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

// 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
2 changes: 1 addition & 1 deletion lldb/include/lldb/ValueObject/ValueObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,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 @@ -688,13 +688,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 @@ -486,7 +487,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
13 changes: 6 additions & 7 deletions lldb/source/DataFormatters/FormattersHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -401,18 +401,17 @@ void lldb_private::formatters::AddFilter(
category_sp->AddTypeFilter(type_name, match_type, filter_sp);
}

size_t lldb_private::formatters::ExtractIndexFromString(const char *item_name) {
std::optional<size_t>
lldb_private::formatters::ExtractIndexFromString(const char *item_name) {
if (!item_name || !*item_name)
return UINT32_MAX;
return std::nullopt;
if (*item_name != '[')
return UINT32_MAX;
return std::nullopt;
item_name++;
char *endptr = nullptr;
unsigned long int idx = ::strtoul(item_name, &endptr, 0);
if (idx == 0 && endptr == item_name)
return UINT32_MAX;
if (idx == ULONG_MAX)
return UINT32_MAX;
if ((idx == 0 && endptr == item_name) || idx == ULONG_MAX)
return std::nullopt;
return idx;
}

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());
return m_interpreter->GetIndexOfChildWithName(m_wrapper_sp,
name.GetCString());
}
Expand Down
15 changes: 10 additions & 5 deletions lldb/source/DataFormatters/VectorType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,11 +271,16 @@ class VectorTypeSyntheticFrontEnd : public SyntheticChildrenFrontEnd {

bool MightHaveChildren() override { return true; }

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;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
auto optional_idx = ExtractIndexFromString(name.AsCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}
uint32_t idx = *optional_idx;
if (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 @@ -147,9 +147,10 @@ class BlockPointerSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
// maybe return false if the block pointer is, say, null
bool MightHaveChildren() override { return true; }

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(
Expand All @@ -175,8 +176,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 @@ -204,10 +204,12 @@ bool lldb_private::formatters::StdlibCoroutineHandleSyntheticFrontEnd::
return true;
}

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 @@ -216,7 +218,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 @@ -42,7 +42,7 @@ class StdlibCoroutineHandleSyntheticFrontEnd

bool MightHaveChildren() override;

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

private:
lldb::ValueObjectSP m_resume_ptr_sp;
Expand Down
9 changes: 7 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,13 @@ 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 {
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}
return *optional_idx;
}

bool MightHaveChildren() override { return true; }
Expand Down
9 changes: 7 additions & 2 deletions lldb/source/Plugins/Language/CPlusPlus/GenericOptional.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,13 @@ class GenericOptionalFrontend : public SyntheticChildrenFrontEnd {

GenericOptionalFrontend(ValueObject &valobj, StdLib stdlib);

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

bool MightHaveChildren() override { return true; }
Expand Down
Loading