]> granicus.if.org Git - llvm/commitdiff
[utils] Fix the llvm::Optional data formatter
authorVedant Kumar <vsk@apple.com>
Mon, 23 Jul 2018 21:59:06 +0000 (21:59 +0000)
committerVedant Kumar <vsk@apple.com>
Mon, 23 Jul 2018 21:59:06 +0000 (21:59 +0000)
The llvm::Optional data formatter needs to look through the `Storage`
container if it's present.

Before:

   220    if (Op && Op->getOp() != dwarf::DW_OP_LLVM_fragment)
-> 221      HasComplexExpression = true;
   222
   223    // If the register can only be described by a complex expression (i.e.,
   224    // multiple subregisters) it doesn't safely compose with another complex
Target 0: (llc) stopped.
(lldb) p Op
(llvm::Optional<llvm::DIExpression::ExprOperand>) $0 = None

After:

(lldb) p Op
(llvm::Optional<llvm::DIExpression::ExprOperand>) $0 =
(llvm::DIExpression::ExprOperand) storage = {
  Op = 0x000000010603d460
}

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337752 91177308-0d34-0410-b5e6-96231b3b80d8

utils/lldbDataFormatters.py

index 687729f61eddd32dca59a6534c2b5113b402171c..db1e22af792e599bf22dfb8d650b96e8b6266357 100644 (file)
@@ -91,8 +91,18 @@ class ArrayRefSynthProvider:
         assert self.type_size != 0
 
 def OptionalSummaryProvider(valobj, internal_dict):
-    if not valobj.GetChildMemberWithName('hasVal').GetValueAsUnsigned(0):
+    storage = valobj.GetChildMemberWithName('Storage')
+    if not storage:
+        storage = valobj
+
+    failure = 2
+    hasVal = storage.GetChildMemberWithName('hasVal').GetValueAsUnsigned(failure)
+    if hasVal == failure:
+        return '<could not read llvm::Optional>'
+
+    if hasVal == 0:
         return 'None'
-    underlying_type = valobj.GetType().GetTemplateArgumentType(0)
-    storage = valobj.GetChildMemberWithName('storage')
+
+    underlying_type = storage.GetType().GetTemplateArgumentType(0)
+    storage = storage.GetChildMemberWithName('storage')
     return str(storage.Cast(underlying_type))