Skip to content

Commit b3d1302

Browse files
[lldb] Upgrade GetIndexOfChildWithName to use llvm::Expected (#136693)
This patch replaces the use of `UINT32_MAX` as the error return value of `GetIndexOfChildWithName` with `llvm::Expected`. # Tasks to do in another PR 1. Replace `CalculateNumChildrenIgnoringErrors` with `CalculateNumChildren`. See [this comment](#136693 (comment)). 2. Update `lldb_private::formatters::ExtractIndexFromString` to use `llvm::Expected`. See [this comment](#136693 (comment)). 3. Create a new class which carries both user and internal errors. See [this comment](#136693 (comment)).
1 parent 92195f6 commit b3d1302

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+408
-232
lines changed

lldb/include/lldb/DataFormatters/TypeSynthetic.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class SyntheticChildrenFrontEnd {
5151

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

54-
virtual size_t GetIndexOfChildWithName(ConstString name) = 0;
54+
virtual llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) = 0;
5555

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

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

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

124125
lldb::ChildCacheState Update() override {
@@ -343,7 +344,7 @@ class TypeFilterImpl : public SyntheticChildren {
343344

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

346-
size_t GetIndexOfChildWithName(ConstString name) override;
347+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
347348

348349
typedef std::shared_ptr<SyntheticChildrenFrontEnd> SharedPointer;
349350

@@ -442,7 +443,7 @@ class ScriptedSyntheticChildren : public SyntheticChildren {
442443

443444
bool MightHaveChildren() override;
444445

445-
size_t GetIndexOfChildWithName(ConstString name) override;
446+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
446447

447448
lldb::ValueObjectSP GetSyntheticValue() override;
448449

lldb/include/lldb/DataFormatters/VectorIterator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
3030

3131
lldb::ChildCacheState Update() override;
3232

33-
size_t GetIndexOfChildWithName(ConstString name) override;
33+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
3434

3535
private:
3636
ExecutionContextRef m_exe_ctx_ref;

lldb/include/lldb/Interpreter/ScriptInterpreter.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,10 +368,10 @@ class ScriptInterpreter : public PluginInterface {
368368
return lldb::ValueObjectSP();
369369
}
370370

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

377377
virtual bool

lldb/include/lldb/Symbol/CompilerType.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -444,8 +444,9 @@ class CompilerType {
444444

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

450451
/// Lookup a child member given a name. This function will match member names
451452
/// only and will descend into "clang_type" children in search for the first

lldb/include/lldb/Symbol/TypeSystem.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -373,9 +373,12 @@ class TypeSystem : public PluginInterface,
373373
bool &child_is_base_class, bool &child_is_deref_of_parent,
374374
ValueObject *valobj, uint64_t &language_flags) = 0;
375375

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

380383
virtual size_t GetIndexOfChildMemberWithName(
381384
lldb::opaque_compiler_type_t type, llvm::StringRef name,

lldb/include/lldb/ValueObject/ValueObject.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ class ValueObject {
498498
virtual lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name,
499499
bool can_create = true);
500500

501-
virtual size_t GetIndexOfChildWithName(llvm::StringRef name);
501+
virtual llvm::Expected<size_t> GetIndexOfChildWithName(llvm::StringRef name);
502502

503503
llvm::Expected<uint32_t> GetNumChildren(uint32_t max = UINT32_MAX);
504504
/// Like \c GetNumChildren but returns 0 on error. You probably

lldb/include/lldb/ValueObject/ValueObjectRegister.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class ValueObjectRegisterSet : public ValueObject {
5252
lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name,
5353
bool can_create = true) override;
5454

55-
size_t GetIndexOfChildWithName(llvm::StringRef name) override;
55+
llvm::Expected<size_t> GetIndexOfChildWithName(llvm::StringRef name) override;
5656

5757
protected:
5858
bool UpdateValue() override;

lldb/include/lldb/ValueObject/ValueObjectSyntheticFilter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class ValueObjectSynthetic : public ValueObject {
5757
lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name,
5858
bool can_create = true) override;
5959

60-
size_t GetIndexOfChildWithName(llvm::StringRef name) override;
60+
llvm::Expected<size_t> GetIndexOfChildWithName(llvm::StringRef name) override;
6161

6262
lldb::ValueObjectSP
6363
GetDynamicValue(lldb::DynamicValueType valueType) override;

lldb/source/API/SBValue.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -704,13 +704,15 @@ SBValue SBValue::GetChildAtIndex(uint32_t idx,
704704
uint32_t SBValue::GetIndexOfChildWithName(const char *name) {
705705
LLDB_INSTRUMENT_VA(this, name);
706706

707-
uint32_t idx = UINT32_MAX;
708707
ValueLocker locker;
709708
lldb::ValueObjectSP value_sp(GetSP(locker));
710709
if (value_sp) {
711-
idx = value_sp->GetIndexOfChildWithName(name);
710+
if (auto idx_or_err = value_sp->GetIndexOfChildWithName(name))
711+
return *idx_or_err;
712+
else
713+
llvm::consumeError(idx_or_err.takeError());
712714
}
713-
return idx;
715+
return UINT32_MAX;
714716
}
715717

716718
SBValue SBValue::GetChildMemberWithName(const char *name) {

lldb/source/DataFormatters/FormatterBytecode.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "FormatterBytecode.h"
1010
#include "lldb/Utility/LLDBLog.h"
1111
#include "lldb/ValueObject/ValueObject.h"
12+
#include "lldb/ValueObject/ValueObjectConstResult.h"
1213
#include "llvm/ADT/StringExtras.h"
1314
#include "llvm/Support/DataExtractor.h"
1415
#include "llvm/Support/Format.h"
@@ -489,7 +490,10 @@ llvm::Error Interpret(std::vector<ControlStackElement> &control,
489490
TYPE_CHECK(Object, String);
490491
auto name = data.Pop<std::string>();
491492
POP_VALOBJ(valobj);
492-
data.Push((uint64_t)valobj->GetIndexOfChildWithName(name));
493+
if (auto index_or_err = valobj->GetIndexOfChildWithName(name))
494+
data.Push((uint64_t)*index_or_err);
495+
else
496+
return index_or_err.takeError();
493497
break;
494498
}
495499
case sel_get_type: {

lldb/source/DataFormatters/TypeSynthetic.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ bool TypeFilterImpl::SetExpressionPathAtIndex(size_t i,
4949
return true;
5050
}
5151

52-
size_t
52+
llvm::Expected<size_t>
5353
TypeFilterImpl::FrontEnd::GetIndexOfChildWithName(ConstString name) {
5454
const char *name_cstr = name.GetCString();
5555
if (name_cstr) {
@@ -67,7 +67,8 @@ TypeFilterImpl::FrontEnd::GetIndexOfChildWithName(ConstString name) {
6767
}
6868
}
6969
}
70-
return UINT32_MAX;
70+
return llvm::createStringError("Type has no child named '%s'",
71+
name.AsCString());
7172
}
7273

7374
std::string TypeFilterImpl::GetDescription() {
@@ -218,10 +219,11 @@ bool ScriptedSyntheticChildren::FrontEnd::MightHaveChildren() {
218219
return m_interpreter->MightHaveChildrenSynthProviderInstance(m_wrapper_sp);
219220
}
220221

221-
size_t ScriptedSyntheticChildren::FrontEnd::GetIndexOfChildWithName(
222-
ConstString name) {
222+
llvm::Expected<size_t>
223+
ScriptedSyntheticChildren::FrontEnd::GetIndexOfChildWithName(ConstString name) {
223224
if (!m_wrapper_sp || m_interpreter == nullptr)
224-
return UINT32_MAX;
225+
return llvm::createStringError("Type has no child named '%s'",
226+
name.AsCString());
225227
return m_interpreter->GetIndexOfChildWithName(m_wrapper_sp,
226228
name.GetCString());
227229
}

lldb/source/DataFormatters/VectorType.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -269,11 +269,13 @@ class VectorTypeSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
269269
return lldb::ChildCacheState::eRefetch;
270270
}
271271

272-
size_t GetIndexOfChildWithName(ConstString name) override {
272+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
273273
const char *item_name = name.GetCString();
274274
uint32_t idx = ExtractIndexFromString(item_name);
275-
if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors())
276-
return UINT32_MAX;
275+
if (idx == UINT32_MAX ||
276+
(idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
277+
return llvm::createStringError("Type has no child named '%s'",
278+
name.AsCString());
277279
return idx;
278280
}
279281

lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,10 @@ class BlockPointerSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
144144
return lldb::ChildCacheState::eRefetch;
145145
}
146146

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

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

173174
static const ConstString s_FuncPtr_name("__FuncPtr");
174175

175-
lldb::ValueObjectSP child_sp = synthetic_children->GetChildAtIndex(
176-
synthetic_children->GetIndexOfChildWithName(s_FuncPtr_name));
176+
auto index_or_err =
177+
synthetic_children->GetIndexOfChildWithName(s_FuncPtr_name);
178+
179+
if (!index_or_err) {
180+
LLDB_LOG_ERROR(GetLog(LLDBLog::DataFormatters), index_or_err.takeError(),
181+
"{0}");
182+
return false;
183+
}
184+
185+
lldb::ValueObjectSP child_sp =
186+
synthetic_children->GetChildAtIndex(*index_or_err);
177187

178188
if (!child_sp) {
179189
return false;

lldb/source/Plugins/Language/CPlusPlus/Coroutines.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,10 +199,12 @@ lldb_private::formatters::StdlibCoroutineHandleSyntheticFrontEnd::Update() {
199199
return lldb::ChildCacheState::eRefetch;
200200
}
201201

202-
size_t StdlibCoroutineHandleSyntheticFrontEnd::GetIndexOfChildWithName(
202+
llvm::Expected<size_t>
203+
StdlibCoroutineHandleSyntheticFrontEnd::GetIndexOfChildWithName(
203204
ConstString name) {
204205
if (!m_resume_ptr_sp || !m_destroy_ptr_sp)
205-
return UINT32_MAX;
206+
return llvm::createStringError("Type has no child named '%s'",
207+
name.AsCString());
206208

207209
if (name == ConstString("resume"))
208210
return 0;
@@ -211,7 +213,8 @@ size_t StdlibCoroutineHandleSyntheticFrontEnd::GetIndexOfChildWithName(
211213
if (name == ConstString("promise_ptr") && m_promise_ptr_sp)
212214
return 2;
213215

214-
return UINT32_MAX;
216+
return llvm::createStringError("Type has no child named '%s'",
217+
name.AsCString());
215218
}
216219

217220
SyntheticChildrenFrontEnd *

lldb/source/Plugins/Language/CPlusPlus/Coroutines.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class StdlibCoroutineHandleSyntheticFrontEnd
4040

4141
lldb::ChildCacheState Update() override;
4242

43-
size_t GetIndexOfChildWithName(ConstString name) override;
43+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
4444

4545
private:
4646
lldb::ValueObjectSP m_resume_ptr_sp;

lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,12 @@ class GenericBitsetFrontEnd : public SyntheticChildrenFrontEnd {
2828

2929
GenericBitsetFrontEnd(ValueObject &valobj, StdLib stdlib);
3030

31-
size_t GetIndexOfChildWithName(ConstString name) override {
32-
return formatters::ExtractIndexFromString(name.GetCString());
31+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
32+
size_t idx = formatters::ExtractIndexFromString(name.GetCString());
33+
if (idx == UINT32_MAX)
34+
return llvm::createStringError("Type has no child named '%s'",
35+
name.AsCString());
36+
return idx;
3337
}
3438

3539
lldb::ChildCacheState Update() override;

lldb/source/Plugins/Language/CPlusPlus/GenericOptional.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,14 @@ class GenericOptionalFrontend : public SyntheticChildrenFrontEnd {
3636

3737
GenericOptionalFrontend(ValueObject &valobj, StdLib stdlib);
3838

39-
size_t GetIndexOfChildWithName(ConstString name) override {
39+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
4040
if (name == "$$dereference$$")
4141
return 0;
42-
return formatters::ExtractIndexFromString(name.GetCString());
42+
size_t idx = formatters::ExtractIndexFromString(name.GetCString());
43+
if (idx == UINT32_MAX)
44+
return llvm::createStringError("Type has no child named '%s'",
45+
name.AsCString());
46+
return idx;
4347
}
4448

4549
llvm::Expected<uint32_t> CalculateNumChildren() override {

lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -309,13 +309,15 @@ lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::Update() {
309309
return lldb::ChildCacheState::eRefetch;
310310
}
311311

312-
size_t lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::
312+
llvm::Expected<size_t>
313+
lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::
313314
GetIndexOfChildWithName(ConstString name) {
314315
if (name == "__ptr_")
315316
return 0;
316317
if (name == "$$dereference$$")
317318
return 1;
318-
return UINT32_MAX;
319+
return llvm::createStringError("Type has no child named '%s'",
320+
name.AsCString());
319321
}
320322

321323
lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::
@@ -407,15 +409,17 @@ lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd::Update() {
407409
return lldb::ChildCacheState::eRefetch;
408410
}
409411

410-
size_t lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd::
412+
llvm::Expected<size_t>
413+
lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd::
411414
GetIndexOfChildWithName(ConstString name) {
412415
if (name == "pointer")
413416
return 0;
414417
if (name == "deleter")
415418
return 1;
416419
if (name == "$$dereference$$")
417420
return 2;
418-
return UINT32_MAX;
421+
return llvm::createStringError("Type has no child named '%s'",
422+
name.AsCString());
419423
}
420424

421425
bool lldb_private::formatters::LibcxxContainerSummaryProvider(
@@ -456,9 +460,15 @@ ExtractLibcxxStringInfo(ValueObject &valobj) {
456460
if (!l)
457461
return {};
458462

459-
StringLayout layout = l->GetIndexOfChildWithName("__data_") == 0
460-
? StringLayout::DSC
461-
: StringLayout::CSD;
463+
auto index_or_err = l->GetIndexOfChildWithName("__data_");
464+
if (!index_or_err) {
465+
LLDB_LOG_ERROR(GetLog(LLDBLog::DataFormatters), index_or_err.takeError(),
466+
"{0}");
467+
return {};
468+
}
469+
470+
StringLayout layout =
471+
*index_or_err == 0 ? StringLayout::DSC : StringLayout::CSD;
462472

463473
bool short_mode = false; // this means the string is in short-mode and the
464474
// data is stored inline

lldb/source/Plugins/Language/CPlusPlus/LibCxx.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class LibcxxSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
102102

103103
lldb::ChildCacheState Update() override;
104104

105-
size_t GetIndexOfChildWithName(ConstString name) override;
105+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
106106

107107
~LibcxxSharedPtrSyntheticFrontEnd() override;
108108

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

121121
lldb::ChildCacheState Update() override;
122122

123-
size_t GetIndexOfChildWithName(ConstString name) override;
123+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
124124

125125
~LibcxxUniquePtrSyntheticFrontEnd() override;
126126

0 commit comments

Comments
 (0)