diff options
Diffstat (limited to 'src/etc/lldb_providers.py')
| -rw-r--r-- | src/etc/lldb_providers.py | 186 |
1 files changed, 131 insertions, 55 deletions
diff --git a/src/etc/lldb_providers.py b/src/etc/lldb_providers.py index a42ce111ebc..c24ec8ab310 100644 --- a/src/etc/lldb_providers.py +++ b/src/etc/lldb_providers.py @@ -1,7 +1,12 @@ import sys -from lldb import SBData, SBError, eBasicTypeLong, eBasicTypeUnsignedLong, \ - eBasicTypeUnsignedChar +from lldb import ( + SBData, + SBError, + eBasicTypeLong, + eBasicTypeUnsignedLong, + eBasicTypeUnsignedChar, +) # from lldb.formatters import Logger @@ -50,13 +55,17 @@ class ValueBuilder: def from_int(self, name, value): # type: (str, int) -> SBValue type = self.valobj.GetType().GetBasicType(eBasicTypeLong) - data = SBData.CreateDataFromSInt64Array(self.endianness, self.pointer_size, [value]) + data = SBData.CreateDataFromSInt64Array( + self.endianness, self.pointer_size, [value] + ) return self.valobj.CreateValueFromData(name, data, type) def from_uint(self, name, value): # type: (str, int) -> SBValue type = self.valobj.GetType().GetBasicType(eBasicTypeUnsignedLong) - data = SBData.CreateDataFromUInt64Array(self.endianness, self.pointer_size, [value]) + data = SBData.CreateDataFromUInt64Array( + self.endianness, self.pointer_size, [value] + ) return self.valobj.CreateValueFromData(name, data, type) @@ -127,13 +136,17 @@ class EmptySyntheticProvider: def SizeSummaryProvider(valobj, dict): # type: (SBValue, dict) -> str - return 'size=' + str(valobj.GetNumChildren()) + return "size=" + str(valobj.GetNumChildren()) def vec_to_string(vec): length = vec.GetNumChildren() chars = [vec.GetChildAtIndex(i).GetValueAsUnsigned() for i in range(length)] - return bytes(chars).decode(errors='replace') if PY3 else "".join(chr(char) for char in chars) + return ( + bytes(chars).decode(errors="replace") + if PY3 + else "".join(chr(char) for char in chars) + ) def StdStringSummaryProvider(valobj, dict): @@ -172,7 +185,7 @@ def StdStrSummaryProvider(valobj, dict): error = SBError() process = data_ptr.GetProcess() data = process.ReadMemory(start, length, error) - data = data.decode(encoding='UTF-8') if PY3 else data + data = data.decode(encoding="UTF-8") if PY3 else data return '"%s"' % data @@ -199,9 +212,9 @@ def StdPathSummaryProvider(valobj, dict): data = process.ReadMemory(start, length, error) if PY3: try: - data = data.decode(encoding='UTF-8') + data = data.decode(encoding="UTF-8") except UnicodeDecodeError: - return '%r' % data + return "%r" % data return '"%s"' % data @@ -250,8 +263,10 @@ class StructSyntheticProvider: # type: () -> bool return True + class ClangEncodedEnumProvider: """Pretty-printer for 'clang-encoded' enums support implemented in LLDB""" + DISCRIMINANT_MEMBER_NAME = "$discr$" VALUE_MEMBER_NAME = "value" @@ -260,7 +275,7 @@ class ClangEncodedEnumProvider: self.update() def has_children(self): - return True + return True def num_children(self): if self.is_default: @@ -276,25 +291,32 @@ class ClangEncodedEnumProvider: def get_child_at_index(self, index): if index == 0: - return self.variant.GetChildMemberWithName(ClangEncodedEnumProvider.VALUE_MEMBER_NAME) + return self.variant.GetChildMemberWithName( + ClangEncodedEnumProvider.VALUE_MEMBER_NAME + ) if index == 1: return self.variant.GetChildMemberWithName( - ClangEncodedEnumProvider.DISCRIMINANT_MEMBER_NAME) - + ClangEncodedEnumProvider.DISCRIMINANT_MEMBER_NAME + ) def update(self): all_variants = self.valobj.GetChildAtIndex(0) index = self._getCurrentVariantIndex(all_variants) self.variant = all_variants.GetChildAtIndex(index) - self.is_default = self.variant.GetIndexOfChildWithName( - ClangEncodedEnumProvider.DISCRIMINANT_MEMBER_NAME) == -1 + self.is_default = ( + self.variant.GetIndexOfChildWithName( + ClangEncodedEnumProvider.DISCRIMINANT_MEMBER_NAME + ) + == -1 + ) def _getCurrentVariantIndex(self, all_variants): default_index = 0 for i in range(all_variants.GetNumChildren()): variant = all_variants.GetChildAtIndex(i) discr = variant.GetChildMemberWithName( - ClangEncodedEnumProvider.DISCRIMINANT_MEMBER_NAME) + ClangEncodedEnumProvider.DISCRIMINANT_MEMBER_NAME + ) if discr.IsValid(): discr_unsigned_value = discr.GetValueAsUnsigned() if variant.GetName() == f"$variant${discr_unsigned_value}": @@ -303,6 +325,7 @@ class ClangEncodedEnumProvider: default_index = i return default_index + class TupleSyntheticProvider: """Pretty-printer for tuples and tuple enum variants""" @@ -336,7 +359,9 @@ class TupleSyntheticProvider: else: field = self.type.GetFieldAtIndex(index) element = self.valobj.GetChildMemberWithName(field.name) - return self.valobj.CreateValueFromData(str(index), element.GetData(), element.GetType()) + return self.valobj.CreateValueFromData( + str(index), element.GetData(), element.GetType() + ) def update(self): # type: () -> None @@ -373,7 +398,7 @@ class StdVecSyntheticProvider: def get_child_index(self, name): # type: (str) -> int - index = name.lstrip('[').rstrip(']') + index = name.lstrip("[").rstrip("]") if index.isdigit(): return int(index) else: @@ -383,15 +408,21 @@ class StdVecSyntheticProvider: # type: (int) -> SBValue start = self.data_ptr.GetValueAsUnsigned() address = start + index * self.element_type_size - element = self.data_ptr.CreateValueFromAddress("[%s]" % index, address, self.element_type) + element = self.data_ptr.CreateValueFromAddress( + "[%s]" % index, address, self.element_type + ) return element def update(self): # type: () -> None self.length = self.valobj.GetChildMemberWithName("len").GetValueAsUnsigned() - self.buf = self.valobj.GetChildMemberWithName("buf").GetChildMemberWithName("inner") + self.buf = self.valobj.GetChildMemberWithName("buf").GetChildMemberWithName( + "inner" + ) - self.data_ptr = unwrap_unique_or_non_null(self.buf.GetChildMemberWithName("ptr")) + self.data_ptr = unwrap_unique_or_non_null( + self.buf.GetChildMemberWithName("ptr") + ) self.element_type = self.valobj.GetType().GetTemplateArgumentType(0) self.element_type_size = self.element_type.GetByteSize() @@ -412,7 +443,7 @@ class StdSliceSyntheticProvider: def get_child_index(self, name): # type: (str) -> int - index = name.lstrip('[').rstrip(']') + index = name.lstrip("[").rstrip("]") if index.isdigit(): return int(index) else: @@ -422,7 +453,9 @@ class StdSliceSyntheticProvider: # type: (int) -> SBValue start = self.data_ptr.GetValueAsUnsigned() address = start + index * self.element_type_size - element = self.data_ptr.CreateValueFromAddress("[%s]" % index, address, self.element_type) + element = self.data_ptr.CreateValueFromAddress( + "[%s]" % index, address, self.element_type + ) return element def update(self): @@ -457,7 +490,7 @@ class StdVecDequeSyntheticProvider: def get_child_index(self, name): # type: (str) -> int - index = name.lstrip('[').rstrip(']') + index = name.lstrip("[").rstrip("]") if index.isdigit() and int(index) < self.size: return int(index) else: @@ -467,20 +500,26 @@ class StdVecDequeSyntheticProvider: # type: (int) -> SBValue start = self.data_ptr.GetValueAsUnsigned() address = start + ((index + self.head) % self.cap) * self.element_type_size - element = self.data_ptr.CreateValueFromAddress("[%s]" % index, address, self.element_type) + element = self.data_ptr.CreateValueFromAddress( + "[%s]" % index, address, self.element_type + ) return element def update(self): # type: () -> None self.head = self.valobj.GetChildMemberWithName("head").GetValueAsUnsigned() self.size = self.valobj.GetChildMemberWithName("len").GetValueAsUnsigned() - self.buf = self.valobj.GetChildMemberWithName("buf").GetChildMemberWithName("inner") + self.buf = self.valobj.GetChildMemberWithName("buf").GetChildMemberWithName( + "inner" + ) cap = self.buf.GetChildMemberWithName("cap") if cap.GetType().num_fields == 1: cap = cap.GetChildAtIndex(0) self.cap = cap.GetValueAsUnsigned() - self.data_ptr = unwrap_unique_or_non_null(self.buf.GetChildMemberWithName("ptr")) + self.data_ptr = unwrap_unique_or_non_null( + self.buf.GetChildMemberWithName("ptr") + ) self.element_type = self.valobj.GetType().GetTemplateArgumentType(0) self.element_type_size = self.element_type.GetByteSize() @@ -510,7 +549,7 @@ class StdOldHashMapSyntheticProvider: def get_child_index(self, name): # type: (str) -> int - index = name.lstrip('[').rstrip(']') + index = name.lstrip("[").rstrip("]") if index.isdigit(): return int(index) else: @@ -525,8 +564,14 @@ class StdOldHashMapSyntheticProvider: hashes = self.hash_uint_size * self.capacity align = self.pair_type_size # See `libcore/alloc.rs:padding_needed_for` - len_rounded_up = (((((hashes + align) % self.modulo - 1) % self.modulo) & ~( - (align - 1) % self.modulo)) % self.modulo - hashes) % self.modulo + len_rounded_up = ( + ( + (((hashes + align) % self.modulo - 1) % self.modulo) + & ~((align - 1) % self.modulo) + ) + % self.modulo + - hashes + ) % self.modulo # len_rounded_up = ((hashes + align - 1) & ~(align - 1)) - hashes pairs_offset = hashes + len_rounded_up @@ -535,12 +580,16 @@ class StdOldHashMapSyntheticProvider: table_index = self.valid_indices[index] idx = table_index & self.capacity_mask address = pairs_start + idx * self.pair_type_size - element = self.data_ptr.CreateValueFromAddress("[%s]" % index, address, self.pair_type) + element = self.data_ptr.CreateValueFromAddress( + "[%s]" % index, address, self.pair_type + ) if self.show_values: return element else: key = element.GetChildAtIndex(0) - return self.valobj.CreateValueFromData("[%s]" % index, key.GetData(), key.GetType()) + return self.valobj.CreateValueFromData( + "[%s]" % index, key.GetData(), key.GetType() + ) def update(self): # type: () -> None @@ -551,10 +600,12 @@ class StdOldHashMapSyntheticProvider: self.hashes = self.table.GetChildMemberWithName("hashes") self.hash_uint_type = self.hashes.GetType() self.hash_uint_size = self.hashes.GetType().GetByteSize() - self.modulo = 2 ** self.hash_uint_size + self.modulo = 2**self.hash_uint_size self.data_ptr = self.hashes.GetChildAtIndex(0).GetChildAtIndex(0) - self.capacity_mask = self.table.GetChildMemberWithName("capacity_mask").GetValueAsUnsigned() + self.capacity_mask = self.table.GetChildMemberWithName( + "capacity_mask" + ).GetValueAsUnsigned() self.capacity = (self.capacity_mask + 1) % self.modulo marker = self.table.GetChildMemberWithName("marker").GetType() # type: SBType @@ -564,8 +615,9 @@ class StdOldHashMapSyntheticProvider: self.valid_indices = [] for idx in range(self.capacity): address = self.data_ptr.GetValueAsUnsigned() + idx * self.hash_uint_size - hash_uint = self.data_ptr.CreateValueFromAddress("[%s]" % idx, address, - self.hash_uint_type) + hash_uint = self.data_ptr.CreateValueFromAddress( + "[%s]" % idx, address, self.hash_uint_type + ) hash_ptr = hash_uint.GetChildAtIndex(0).GetChildAtIndex(0) if hash_ptr.GetValueAsUnsigned() != 0: self.valid_indices.append(idx) @@ -592,7 +644,7 @@ class StdHashMapSyntheticProvider: def get_child_index(self, name): # type: (str) -> int - index = name.lstrip('[').rstrip(']') + index = name.lstrip("[").rstrip("]") if index.isdigit(): return int(index) else: @@ -605,19 +657,25 @@ class StdHashMapSyntheticProvider: if self.new_layout: idx = -(idx + 1) address = pairs_start + idx * self.pair_type_size - element = self.data_ptr.CreateValueFromAddress("[%s]" % index, address, self.pair_type) + element = self.data_ptr.CreateValueFromAddress( + "[%s]" % index, address, self.pair_type + ) if self.show_values: return element else: key = element.GetChildAtIndex(0) - return self.valobj.CreateValueFromData("[%s]" % index, key.GetData(), key.GetType()) + return self.valobj.CreateValueFromData( + "[%s]" % index, key.GetData(), key.GetType() + ) def update(self): # type: () -> None table = self.table() inner_table = table.GetChildMemberWithName("table") - capacity = inner_table.GetChildMemberWithName("bucket_mask").GetValueAsUnsigned() + 1 + capacity = ( + inner_table.GetChildMemberWithName("bucket_mask").GetValueAsUnsigned() + 1 + ) ctrl = inner_table.GetChildMemberWithName("ctrl").GetChildAtIndex(0) self.size = inner_table.GetChildMemberWithName("items").GetValueAsUnsigned() @@ -630,16 +688,21 @@ class StdHashMapSyntheticProvider: if self.new_layout: self.data_ptr = ctrl.Cast(self.pair_type.GetPointerType()) else: - self.data_ptr = inner_table.GetChildMemberWithName("data").GetChildAtIndex(0) + self.data_ptr = inner_table.GetChildMemberWithName("data").GetChildAtIndex( + 0 + ) u8_type = self.valobj.GetTarget().GetBasicType(eBasicTypeUnsignedChar) - u8_type_size = self.valobj.GetTarget().GetBasicType(eBasicTypeUnsignedChar).GetByteSize() + u8_type_size = ( + self.valobj.GetTarget().GetBasicType(eBasicTypeUnsignedChar).GetByteSize() + ) self.valid_indices = [] for idx in range(capacity): address = ctrl.GetValueAsUnsigned() + idx * u8_type_size - value = ctrl.CreateValueFromAddress("ctrl[%s]" % idx, address, - u8_type).GetValueAsUnsigned() + value = ctrl.CreateValueFromAddress( + "ctrl[%s]" % idx, address, u8_type + ).GetValueAsUnsigned() is_present = value & 128 == 0 if is_present: self.valid_indices.append(idx) @@ -691,10 +754,16 @@ class StdRcSyntheticProvider: self.value = self.ptr.GetChildMemberWithName("data" if is_atomic else "value") - self.strong = self.ptr.GetChildMemberWithName("strong").GetChildAtIndex( - 0).GetChildMemberWithName("value") - self.weak = self.ptr.GetChildMemberWithName("weak").GetChildAtIndex( - 0).GetChildMemberWithName("value") + self.strong = ( + self.ptr.GetChildMemberWithName("strong") + .GetChildAtIndex(0) + .GetChildMemberWithName("value") + ) + self.weak = ( + self.ptr.GetChildMemberWithName("weak") + .GetChildAtIndex(0) + .GetChildMemberWithName("value") + ) self.value_builder = ValueBuilder(valobj) @@ -772,7 +841,9 @@ class StdCellSyntheticProvider: def StdRefSummaryProvider(valobj, dict): # type: (SBValue, dict) -> str borrow = valobj.GetChildMemberWithName("borrow").GetValueAsSigned() - return "borrow={}".format(borrow) if borrow >= 0 else "borrow_mut={}".format(-borrow) + return ( + "borrow={}".format(borrow) if borrow >= 0 else "borrow_mut={}".format(-borrow) + ) class StdRefSyntheticProvider: @@ -785,11 +856,16 @@ class StdRefSyntheticProvider: borrow = valobj.GetChildMemberWithName("borrow") value = valobj.GetChildMemberWithName("value") if is_cell: - self.borrow = borrow.GetChildMemberWithName("value").GetChildMemberWithName("value") + self.borrow = borrow.GetChildMemberWithName("value").GetChildMemberWithName( + "value" + ) self.value = value.GetChildMemberWithName("value") else: - self.borrow = borrow.GetChildMemberWithName("borrow").GetChildMemberWithName( - "value").GetChildMemberWithName("value") + self.borrow = ( + borrow.GetChildMemberWithName("borrow") + .GetChildMemberWithName("value") + .GetChildMemberWithName("value") + ) self.value = value.Dereference() self.value_builder = ValueBuilder(valobj) @@ -832,7 +908,7 @@ def StdNonZeroNumberSummaryProvider(valobj, _dict): # FIXME: Avoid printing as character literal, # see https://github.com/llvm/llvm-project/issues/65076. - if inner_inner.GetTypeName() in ['char', 'unsigned char']: - return str(inner_inner.GetValueAsSigned()) + if inner_inner.GetTypeName() in ["char", "unsigned char"]: + return str(inner_inner.GetValueAsSigned()) else: - return inner_inner.GetValue() + return inner_inner.GetValue() |
