Skip to content

Surface errors in GetNumChildren. #8376

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
merged 8 commits into from
Mar 13, 2024
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
17 changes: 12 additions & 5 deletions lldb/include/lldb/Core/ValueObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,7 @@ class ValueObject {
/// Returns a unique id for this ValueObject.
lldb::user_id_t GetID() const { return m_id.GetID(); }

virtual lldb::ValueObjectSP GetChildAtIndex(size_t idx,
virtual lldb::ValueObjectSP GetChildAtIndex(uint32_t idx,
bool can_create = true);

// The method always creates missing children in the path, if necessary.
Expand All @@ -485,7 +485,13 @@ class ValueObject {

virtual size_t GetIndexOfChildWithName(llvm::StringRef name);

size_t GetNumChildren(uint32_t max = UINT32_MAX);
llvm::Expected<uint32_t> GetNumChildren(uint32_t max = UINT32_MAX);
/// Like \c GetNumChildren but returns 0 on error. You probably
/// shouldn't be using this function. It exists primarily to ease the
/// transition to more pervasive error handling while not all APIs
/// have been updated.
uint32_t GetNumChildrenIgnoringErrors(uint32_t max = UINT32_MAX);
bool HasChildren() { return GetNumChildrenIgnoringErrors() > 0; }

const Value &GetValue() const { return m_value; }

Expand Down Expand Up @@ -805,7 +811,7 @@ class ValueObject {
return (m_children.find(idx) != m_children.end());
}

ValueObject *GetChildAtIndex(size_t idx) {
ValueObject *GetChildAtIndex(uint32_t idx) {
std::lock_guard<std::recursive_mutex> guard(m_mutex);
const auto iter = m_children.find(idx);
return ((iter == m_children.end()) ? nullptr : iter->second);
Expand Down Expand Up @@ -972,9 +978,10 @@ class ValueObject {
int32_t synthetic_index);

/// Should only be called by ValueObject::GetNumChildren().
virtual size_t CalculateNumChildren(uint32_t max = UINT32_MAX) = 0;
virtual llvm::Expected<uint32_t>
CalculateNumChildren(uint32_t max = UINT32_MAX) = 0;

void SetNumChildren(size_t num_children);
void SetNumChildren(uint32_t num_children);

void SetValueDidChange(bool value_changed) {
m_flags.m_value_did_change = value_changed;
Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/Core/ValueObjectCast.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class ValueObjectCast : public ValueObject {

std::optional<uint64_t> GetByteSize() override;

size_t CalculateNumChildren(uint32_t max) override;
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;

lldb::ValueType GetValueType() const override;

Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/Core/ValueObjectChild.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class ValueObjectChild : public ValueObject {

lldb::ValueType GetValueType() const override;

size_t CalculateNumChildren(uint32_t max) override;
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;

ConstString GetTypeName() override;

Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/Core/ValueObjectConstResult.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class ValueObjectConstResult : public ValueObject {

lldb::ValueType GetValueType() const override;

size_t CalculateNumChildren(uint32_t max) override;
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;

ConstString GetTypeName() override;

Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/Core/ValueObjectDynamicValue.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class ValueObjectDynamicValue : public ValueObject {

ConstString GetDisplayTypeName() override;

size_t CalculateNumChildren(uint32_t max) override;
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;

lldb::ValueType GetValueType() const override;

Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/Core/ValueObjectMemory.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class ValueObjectMemory : public ValueObject {

ConstString GetDisplayTypeName() override;

size_t CalculateNumChildren(uint32_t max) override;
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;

lldb::ValueType GetValueType() const override;

Expand Down
4 changes: 2 additions & 2 deletions lldb/include/lldb/Core/ValueObjectRegister.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class ValueObjectRegisterSet : public ValueObject {

ConstString GetQualifiedTypeName() override;

size_t CalculateNumChildren(uint32_t max) override;
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;

ValueObject *CreateChildAtIndex(size_t idx, bool synthetic_array_member,
int32_t synthetic_index) override;
Expand Down Expand Up @@ -95,7 +95,7 @@ class ValueObjectRegister : public ValueObject {

ConstString GetTypeName() override;

size_t CalculateNumChildren(uint32_t max) override;
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;

bool SetValueFromCString(const char *value_str, Status &error) override;

Expand Down
4 changes: 2 additions & 2 deletions lldb/include/lldb/Core/ValueObjectSyntheticFilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,11 @@ class ValueObjectSynthetic : public ValueObject {

bool MightHaveChildren() override;

size_t CalculateNumChildren(uint32_t max) override;
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;

lldb::ValueType GetValueType() const override;

lldb::ValueObjectSP GetChildAtIndex(size_t idx,
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx,
bool can_create = true) override;

lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name,
Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/Core/ValueObjectVTable.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class ValueObjectVTable : public ValueObject {

std::optional<uint64_t> GetByteSize() override;

size_t CalculateNumChildren(uint32_t max) override;
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;

ValueObject *CreateChildAtIndex(size_t idx, bool synthetic_array_member,
int32_t synthetic_index) override;
Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/Core/ValueObjectVariable.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class ValueObjectVariable : public ValueObject {

ConstString GetDisplayTypeName() override;

size_t CalculateNumChildren(uint32_t max) override;
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;

lldb::ValueType GetValueType() const override;

Expand Down
28 changes: 17 additions & 11 deletions lldb/include/lldb/DataFormatters/TypeSynthetic.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,18 @@ class SyntheticChildrenFrontEnd {

virtual ~SyntheticChildrenFrontEnd() = default;

virtual size_t CalculateNumChildren() = 0;
virtual llvm::Expected<uint32_t> CalculateNumChildren() = 0;

virtual size_t CalculateNumChildren(uint32_t max) {
virtual llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) {
auto count = CalculateNumChildren();
return count <= max ? count : max;
if (!count)
return count;
return *count <= max ? *count : max;
}

virtual lldb::ValueObjectSP GetChildAtIndex(size_t idx) = 0;
uint32_t CalculateNumChildrenIgnoringErrors(uint32_t max = UINT32_MAX);

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

virtual size_t GetIndexOfChildWithName(ConstString name) = 0;

Expand Down Expand Up @@ -109,9 +113,9 @@ class SyntheticValueProviderFrontEnd : public SyntheticChildrenFrontEnd {

~SyntheticValueProviderFrontEnd() override = default;

size_t CalculateNumChildren() override { return 0; }
llvm::Expected<uint32_t> CalculateNumChildren() override { return 0; }

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

size_t GetIndexOfChildWithName(ConstString name) override {
return UINT32_MAX;
Expand Down Expand Up @@ -322,9 +326,11 @@ class TypeFilterImpl : public SyntheticChildren {

~FrontEnd() override = default;

size_t CalculateNumChildren() override { return filter->GetCount(); }
llvm::Expected<uint32_t> CalculateNumChildren() override {
return filter->GetCount();
}

lldb::ValueObjectSP GetChildAtIndex(size_t idx) override {
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override {
if (idx >= filter->GetCount())
return lldb::ValueObjectSP();
return m_backend.GetSyntheticExpressionPathChild(
Expand Down Expand Up @@ -426,11 +432,11 @@ class ScriptedSyntheticChildren : public SyntheticChildren {

bool IsValid();

size_t CalculateNumChildren() override;
llvm::Expected<uint32_t> CalculateNumChildren() override;

size_t CalculateNumChildren(uint32_t max) override;
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;

lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;

lldb::ChildCacheState Update() override;

Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/DataFormatters/ValueObjectPrinter.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ class ValueObjectPrinter {
void PrintChild(lldb::ValueObjectSP child_sp,
const DumpValueObjectOptions::PointerDepth &curr_ptr_depth);

uint32_t GetMaxNumChildrenToPrint(bool &print_dotdotdot);
llvm::Expected<uint32_t> GetMaxNumChildrenToPrint(bool &print_dotdotdot);

void
PrintChildren(bool value_printed, bool summary_printed,
Expand Down
4 changes: 2 additions & 2 deletions lldb/include/lldb/DataFormatters/VectorIterator.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
VectorIteratorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp,
llvm::ArrayRef<ConstString> item_names);

size_t CalculateNumChildren() override;
llvm::Expected<uint32_t> CalculateNumChildren() override;

lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;

lldb::ChildCacheState Update() override;

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 @@ -345,8 +345,9 @@ class CompilerType {

std::optional<size_t> GetTypeBitAlign(ExecutionContextScope *exe_scope) const;

uint32_t GetNumChildren(bool omit_empty_base_classes,
const ExecutionContext *exe_ctx) const;
llvm::Expected<uint32_t>
GetNumChildren(bool omit_empty_base_classes,
const ExecutionContext *exe_ctx) const;

lldb::BasicType GetBasicTypeEnumeration() const;

Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/Symbol/Type.h
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ class Type : public std::enable_shared_from_this<Type>, public UserID {

std::optional<uint64_t> GetByteSize(ExecutionContextScope *exe_scope);

uint32_t GetNumChildren(bool omit_empty_base_classes);
llvm::Expected<uint32_t> GetNumChildren(bool omit_empty_base_classes);

bool IsAggregateType();

Expand Down
7 changes: 4 additions & 3 deletions lldb/include/lldb/Symbol/TypeSystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -323,9 +323,10 @@ class TypeSystem : public PluginInterface,

virtual lldb::Format GetFormat(lldb::opaque_compiler_type_t type) = 0;

virtual uint32_t GetNumChildren(lldb::opaque_compiler_type_t type,
bool omit_empty_base_classes,
const ExecutionContext *exe_ctx) = 0;
virtual llvm::Expected<uint32_t>
GetNumChildren(lldb::opaque_compiler_type_t type,
bool omit_empty_base_classes,
const ExecutionContext *exe_ctx) = 0;

virtual CompilerType GetBuiltinTypeByName(ConstString name);

Expand Down
3 changes: 2 additions & 1 deletion lldb/include/lldb/Target/StackFrameRecognizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,8 @@ class ValueObjectRecognizerSynthesizedValue : public ValueObject {
m_value = m_parent->GetValue();
return true;
}
size_t CalculateNumChildren(uint32_t max = UINT32_MAX) override {
llvm::Expected<uint32_t>
CalculateNumChildren(uint32_t max = UINT32_MAX) override {
return m_parent->GetNumChildren(max);
}
CompilerType GetCompilerTypeImpl() override {
Expand Down
14 changes: 14 additions & 0 deletions lldb/include/lldb/Utility/Log.h
Original file line number Diff line number Diff line change
Expand Up @@ -373,4 +373,18 @@ template <typename Cat> Log *GetLog(Cat mask) {
::llvm::consumeError(::std::move(error_private)); \
} while (0)

// Write message to the verbose log, if error is set. In the log
// message refer to the error with {0}. Error is cleared regardless of
// whether logging is enabled.
#define LLDB_LOG_ERRORV(log, error, ...) \
do { \
::lldb_private::Log *log_private = (log); \
::llvm::Error error_private = (error); \
if (log_private && log_private->GetVerbose() && error_private) { \
log_private->FormatError(::std::move(error_private), __FILE__, __func__, \
__VA_ARGS__); \
} else \
::llvm::consumeError(::std::move(error_private)); \
} while (0)

#endif // LLDB_UTILITY_LOG_H
2 changes: 1 addition & 1 deletion lldb/source/API/SBValue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -947,7 +947,7 @@ uint32_t SBValue::GetNumChildren(uint32_t max) {
ValueLocker locker;
lldb::ValueObjectSP value_sp(GetSP(locker));
if (value_sp)
num_children = value_sp->GetNumChildren(max);
num_children = value_sp->GetNumChildrenIgnoringErrors(max);

return num_children;
}
Expand Down
2 changes: 1 addition & 1 deletion lldb/source/Core/FormatEntity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -926,7 +926,7 @@ static bool DumpValue(Stream &s, const SymbolContext *sc,
s.PutChar('[');

if (index_higher < 0)
index_higher = valobj->GetNumChildren() - 1;
index_higher = valobj->GetNumChildrenIgnoringErrors() - 1;

uint32_t max_num_children =
target->GetTargetSP()->GetMaximumNumberOfChildrenToDisplay();
Expand Down
2 changes: 1 addition & 1 deletion lldb/source/Core/IOHandlerCursesGUI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4520,7 +4520,7 @@ struct Row {
calculated_children = true;
ValueObjectSP valobj = value.GetSP();
if (valobj) {
const size_t num_children = valobj->GetNumChildren();
const uint32_t num_children = valobj->GetNumChildrenIgnoringErrors();
for (size_t i = 0; i < num_children; ++i) {
children.push_back(Row(valobj->GetChildAtIndex(i), this));
}
Expand Down
Loading