[llvm] 408456f - [llvm][utils] Support dereferencing llvm::Optional lldb formatter

Dave Lee via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 26 07:43:40 PST 2021


Author: Dave Lee
Date: 2021-02-26T07:43:33-08:00
New Revision: 408456f53eccd9b2280840aff8fa99f865024544

URL: https://github.com/llvm/llvm-project/commit/408456f53eccd9b2280840aff8fa99f865024544
DIFF: https://github.com/llvm/llvm-project/commit/408456f53eccd9b2280840aff8fa99f865024544.diff

LOG: [llvm][utils] Support dereferencing llvm::Optional lldb formatter

Add deref support to `llvm::Optional` in `lldbDataFormatters.py`.

This creates a synthetic provider that adds dereference support, but otherwise proxies all access to the underlying value.

With this change, an optional value can be displayed by running `v *someOptional`, and its contents can be accessed with the arrow `operator->`, for example `v someOpt->HasThing`. This matches expressions usable from expression evaluation.

See also D97165 and D97524.

Differential Revision: https://reviews.llvm.org/D97525

Added: 
    

Modified: 
    llvm/utils/lldbDataFormatters.py

Removed: 
    


################################################################################
diff  --git a/llvm/utils/lldbDataFormatters.py b/llvm/utils/lldbDataFormatters.py
index b5daa09bdeec..b95bf84ab108 100644
--- a/llvm/utils/lldbDataFormatters.py
+++ b/llvm/utils/lldbDataFormatters.py
@@ -4,6 +4,8 @@
 Load into LLDB with 'command script import /path/to/lldbDataFormatters.py'
 """
 
+import lldb
+
 def __lldb_init_module(debugger, internal_dict):
     debugger.HandleCommand('type category define -e llvm -l c++')
     debugger.HandleCommand('type synthetic add -w llvm '
@@ -15,6 +17,9 @@ def __lldb_init_module(debugger, internal_dict):
     debugger.HandleCommand('type synthetic add -w llvm '
                            '-l lldbDataFormatters.ArrayRefSynthProvider '
                            '-x "^llvm::ArrayRef<.+>$"')
+    debugger.HandleCommand('type synthetic add -w llvm '
+                           '-l lldbDataFormatters.OptionalSynthProvider '
+                           '-x "^llvm::Optional<.+>$"')
     debugger.HandleCommand('type summary add -w llvm '
                            '-F lldbDataFormatters.OptionalSummaryProvider '
                            '-x "^llvm::Optional<.+>$"')
@@ -97,7 +102,7 @@ def update(self):
         self.type_size = self.data_type.GetByteSize()
         assert self.type_size != 0
 
-def OptionalSummaryProvider(valobj, internal_dict):
+def GetOptionalValue(valobj):
     storage = valobj.GetChildMemberWithName('Storage')
     if not storage:
         storage = valobj
@@ -108,11 +113,32 @@ def OptionalSummaryProvider(valobj, internal_dict):
         return '<could not read llvm::Optional>'
 
     if hasVal == 0:
-        return 'None'
+        return None
 
     underlying_type = storage.GetType().GetTemplateArgumentType(0)
     storage = storage.GetChildMemberWithName('value')
-    return str(storage.Cast(underlying_type))
+    return storage.Cast(underlying_type)
+
+def OptionalSummaryProvider(valobj, internal_dict):
+    return GetOptionalValue(valobj).summary
+
+class OptionalSynthProvider:
+    """Provides deref support to llvm::Optional<T>"""
+    def __init__(self, valobj, internal_dict):
+        self.valobj = valobj
+
+    def num_children(self):
+        return self.valobj.num_children
+
+    def get_child_index(self, name):
+        if name == '$$dereference$$':
+            return self.valobj.num_children + 1
+        return self.valobj.GetIndexOfChildWithName(name)
+
+    def get_child_at_index(self, index):
+        if index < self.valobj.num_children:
+            return self.valobj.GetChildAtIndex(index)
+        return GetOptionalValue(self.valobj) or lldb.SBValue()
 
 def SmallStringSummaryProvider(valobj, internal_dict):
     num_elements = valobj.GetNumChildren()


        


More information about the llvm-commits mailing list