Skip to content

Commit 398f3b3

Browse files
authored
[lldb] Add synthetic formatter for llvm::Expected (#118758)
Adds a synthetic formatter for `llvm::Expected<T>`. The synthetic value will have a single child, either `value` or `error`.
1 parent 74d29c6 commit 398f3b3

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

llvm/utils/lldbDataFormatters.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,12 @@ def __lldb_init_module(debugger, internal_dict):
9393
'-x "^llvm::DenseMap<.+>$"'
9494
)
9595

96+
debugger.HandleCommand(
97+
"type synthetic add -w llvm "
98+
f"-l {__name__}.ExpectedSynthetic "
99+
'-x "^llvm::Expected<.+>$"'
100+
)
101+
96102

97103
# Pretty printer for llvm::SmallVector/llvm::SmallVectorImpl
98104
class SmallVectorSynthProvider:
@@ -432,3 +438,43 @@ def update(self):
432438
for indexes in key_buckets.values():
433439
if len(indexes) == 1:
434440
self.child_buckets.append(indexes[0])
441+
442+
443+
class ExpectedSynthetic:
444+
# The llvm::Expected<T> value.
445+
expected: lldb.SBValue
446+
# The stored success value or error value.
447+
stored_value: lldb.SBValue
448+
449+
def __init__(self, valobj: lldb.SBValue, _) -> None:
450+
self.expected = valobj
451+
452+
def update(self) -> None:
453+
has_error = self.expected.GetChildMemberWithName("HasError").unsigned
454+
if not has_error:
455+
name = "value"
456+
member = "TStorage"
457+
else:
458+
name = "error"
459+
member = "ErrorStorage"
460+
# Anonymous union.
461+
union = self.expected.child[0]
462+
storage = union.GetChildMemberWithName(member)
463+
stored_type = storage.type.template_args[0]
464+
self.stored_value = storage.Cast(stored_type).Clone(name)
465+
466+
def num_children(self) -> int:
467+
return 1
468+
469+
def get_child_index(self, name: str) -> int:
470+
if name == self.stored_value.name:
471+
return 0
472+
# Allow dereferencing for values, not errors.
473+
if name == "$$dereference$$" and self.stored_value.name == "value":
474+
return 0
475+
return -1
476+
477+
def get_child_at_index(self, idx: int) -> lldb.SBValue:
478+
if idx == 0:
479+
return self.stored_value
480+
return lldb.SBValue()

0 commit comments

Comments
 (0)