From af841e3003c001e00935ac025080531fb023b9c3 Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Mon, 30 Jul 2018 17:25:03 +0300 Subject: [PATCH] [lldb][python] Synthetic children handling enhancements. --- llvmDebugInfoC/src/scripts/konan_lldb.py | 110 ++++++++++++++--------- 1 file changed, 67 insertions(+), 43 deletions(-) diff --git a/llvmDebugInfoC/src/scripts/konan_lldb.py b/llvmDebugInfoC/src/scripts/konan_lldb.py index 9f71348f853..843b617ccd9 100644 --- a/llvmDebugInfoC/src/scripts/konan_lldb.py +++ b/llvmDebugInfoC/src/scripts/konan_lldb.py @@ -54,6 +54,7 @@ def check_type_info(addr): result = evaluate("**(void ***){0} == ***(void****){0}".format(addr)) return result.IsValid() and result.GetValue() == "true" + # # Some kind of forward declaration. @@ -79,7 +80,7 @@ def kotlin_object_type_summary(lldb_val, internal_dict): def select_provider(lldb_val): return __FACTORY['string'](lldb_val) if is_string(lldb_val) else __FACTORY['array'](lldb_val) if is_array( - lldb_val) else __FACTORY['object'](lldb_val) + lldb_val) else __FACTORY['object'](lldb_val) class KonanHelperProvider(lldb.SBSyntheticValueProvider): @@ -92,17 +93,21 @@ class KonanHelperProvider(lldb.SBSyntheticValueProvider): return self._children_count = 0 self._children = [] - self._type_conversion = {0: lambda address, _: "{:#x}".format(address), - 1: lambda address, _: kotlin_object_type_summary(evaluate("(*(struct ObjHeader **){:#x})".format(address)), {}), - 2: lambda address, error: self.__read_memory(address, "= self._children_count: - return None - error = lldb.SBError() - type = self._read_type(index) - base = evaluate("(long){})".format(self._ptr)).unsigned - address = evaluate("(long)Konan_DebugGetFieldAddress({}, (int){})".format(self._ptr, index)).unsigned - child = self._valobj.CreateChildAtOffset(self._children[index], address - base, type) - child.SetSyntheticChildrenGenerated(True) - return child if error.Success() else None + return self._values[index] # TODO: fix cyclic structures stringification. def to_string(self): - error = lldb.SBError() - return dict([(self._children[i], self._read_value(i, error)) for i in range(0, self._children_count)]) + return dict([(self._children[i], self._deref_or_obj_summary(i)) for i in range(self._children_count)]) class KonanArraySyntheticProvider(KonanHelperProvider): @@ -220,12 +247,13 @@ class KonanArraySyntheticProvider(KonanHelperProvider): if self._ptr is None: return valobj.SetSyntheticChildrenGenerated(True) + self._values = [] self.update() def update(self): super(KonanArraySyntheticProvider, self).update() - self._children = [x for x in range(0, self.num_children())] - return True + self._children = [x for x in range(self.num_children())] + self._values = [self._read_value(i) for i in range(self._children_count)] def num_children(self): return self._children_count @@ -238,14 +266,10 @@ class KonanArraySyntheticProvider(KonanHelperProvider): return index if (0 <= index < self._children_count) else -1 def get_child_at_index(self, index): - if index < 0 or index >= self._children_count: - return None - error = lldb.SBError() - return self._read_value(index, error) if error.Success() else None + return self._read_value(index) def to_string(self): - error = lldb.SBError() - return [self._read_value(i, error) for i in range(0, self._children_count)] + return [self._deref_or_obj_summary(i) for i in range(self._children_count)] class KonanProxyTypeProvider: @@ -269,7 +293,7 @@ def __lldb_init_module(debugger, _): --no-value \ --expand \ --python-function konan_lldb.kotlin_object_type_summary \ - "ObjHeader *" \ + "struct ObjHeader *" \ --category Kotlin\ ') debugger.HandleCommand('\