tint: Fix gdb and lldb pretty printers for recently updated Hashset and Hashmap

Change-Id: If9aae44b6e58d3ba3be3463306f626ce8c23d4d0
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/108723
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@chromium.org>
Reviewed-by: Ben Clayton <bclayton@chromium.org>
This commit is contained in:
Antonio Maiorano 2022-11-07 14:00:53 +00:00 committed by Dawn LUCI CQ
parent ca98b1b1b9
commit c027f33cfd
2 changed files with 44 additions and 69 deletions

View File

@ -165,11 +165,11 @@ pp_set.add_printer(
'UtilsVector', '^tint::utils::VectorRef<.*>$', UtilsVectorRefPrinter) 'UtilsVector', '^tint::utils::VectorRef<.*>$', UtilsVectorRefPrinter)
class UtilsHashsetPrinter(Printer): class UtilsHashmapBasePrinter(Printer):
'''Printer for Hashset<T, N, HASH, EQUAL>''' '''Base Printer for HashmapBase-derived types'''
def __init__(self, val): def __init__(self, val):
super(UtilsHashsetPrinter, self).__init__(val) super(UtilsHashmapBasePrinter, self).__init__(val)
self.slice = UtilsVectorPrinter(self.val['slots_']).slice_printer() self.slice = UtilsVectorPrinter(self.val['slots_']).slice_printer()
self.try_read_std_optional_func = self.try_read_std_optional self.try_read_std_optional_func = self.try_read_std_optional
@ -185,26 +185,32 @@ class UtilsHashsetPrinter(Printer):
for slot in range(0, self.slice.length()): for slot in range(0, self.slice.length()):
v = self.slice.value_at(slot) v = self.slice.value_at(slot)
if v['hash'] != 0: if v['hash'] != 0:
value = v['value'] entry = v['entry']
# value is a std::optional, let's try to extract its value for display # entry is a std::optional, let's try to extract its value for display
kvp = self.try_read_std_optional_func(slot, value) kvp = self.try_read_std_optional_func(slot, entry)
if kvp is None: if kvp is None:
# If we failed, just output the slot and value as is, which will use # If we failed, just output the slot and entry as is, which will use
# the default visualizer for each. # the default visualizer for each.
kvp = slot, value kvp = slot, entry
yield str(kvp[0]), kvp[1] yield str(kvp[0]), kvp[1]
def display_hint(self): def display_hint(self):
return 'array' return 'array'
def try_read_std_optional(self, slot, value): def try_read_std_optional(self, slot, entry):
return None
class UtilsHashsetPrinter(UtilsHashmapBasePrinter):
'''Printer for Hashset<T, N, HASH, EQUAL>'''
def try_read_std_optional(self, slot, entry):
try: try:
# libstdc++ # libstdc++
v = value['_M_payload']['_M_payload']['_M_value'] v = entry['_M_payload']['_M_payload']['_M_value']
return slot, v return slot, v
# return str(kvp['key']), kvp['value']
except: except:
return None return None
@ -213,33 +219,16 @@ pp_set.add_printer(
'UtilsHashset', '^tint::utils::Hashset<.*>$', UtilsHashsetPrinter) 'UtilsHashset', '^tint::utils::Hashset<.*>$', UtilsHashsetPrinter)
class UtilsHashmapPrinter(Printer): class UtilsHashmapPrinter(UtilsHashmapBasePrinter):
'''Printer for Hashmap<K, V, N, HASH, EQUAL>''' '''Printer for Hashmap<K, V, N, HASH, EQUAL>'''
def __init__(self, val): def try_read_std_optional(self, slot, entry):
super(UtilsHashmapPrinter, self).__init__(val)
self.hash_set = UtilsHashsetPrinter(self.val['set_'])
# Replace the lookup function so we can extract the key and value out of the std::optionals in the Hashset
self.hash_set.try_read_std_optional_func = self.try_read_std_optional
def to_string(self):
return self.hash_set.to_string()
def children(self):
return self.hash_set.children()
def display_hint(self):
return 'array'
def try_read_std_optional(self, slot, value):
try: try:
# libstdc++ # libstdc++
kvp = value['_M_payload']['_M_payload']['_M_value'] kvp = entry['_M_payload']['_M_payload']['_M_value']
return str(kvp['key']), kvp['value'] return str(kvp['key']), kvp['value']
except: except:
pass return None
# Failed, fall back on hash_set
return self.hash_set.try_read_std_optional(slot, value)
pp_set.add_printer( pp_set.add_printer(

View File

@ -297,8 +297,8 @@ class UtilsVectorRefPrinter(Printer):
return self.slice_printer.get_child_at_index(index) return self.slice_printer.get_child_at_index(index)
class UtilsHashsetPrinter(Printer): class UtilsHashmapBasePrinter(Printer):
'''Printer for Hashset<T, N, HASH, EQUAL>''' '''Base Printer for HashmapBase-derived types'''
def initialize(self): def initialize(self):
self.slice = UtilsVectorPrinter( self.slice = UtilsVectorPrinter(
@ -326,26 +326,33 @@ class UtilsHashsetPrinter(Printer):
def get_child_at_index(self, index): def get_child_at_index(self, index):
slot = self.valid_slots[index] slot = self.valid_slots[index]
v = self.slice.value_at(slot) v = self.slice.value_at(slot)
value = member(v, 'value') entry = member(v, 'entry')
# value is a std::optional, let's try to extract its value for display # entry is a std::optional, let's try to extract its value for display
kvp = self.try_read_std_optional_func(slot, value) kvp = self.try_read_std_optional_func(slot, entry)
if kvp is None: if kvp is None:
# If we failed, just output the slot and value as is, which will use # If we failed, just output the slot and entry as is, which will use
# the default printer for std::optional. # the default printer for std::optional.
kvp = slot, value kvp = slot, entry
return kvp[1].CreateChildAtOffset('[{}]'.format(kvp[0]), 0, kvp[1].GetType()) return kvp[1].CreateChildAtOffset('[{}]'.format(kvp[0]), 0, kvp[1].GetType())
def try_read_std_optional(self, slot, value): def try_read_std_optional(self, slot, entry):
return None
class UtilsHashsetPrinter(UtilsHashmapBasePrinter):
'''Printer for Hashset<T, N, HASH, EQUAL>'''
def try_read_std_optional(self, slot, entry):
try: try:
# libc++ # libc++
v = value.EvaluateExpression('__val_') v = entry.EvaluateExpression('__val_')
if v.name is not None: if v.name is not None:
return slot, v return slot, v
# libstdc++ # libstdc++
v = value.EvaluateExpression('_M_payload._M_payload._M_value') v = entry.EvaluateExpression('_M_payload._M_payload._M_value')
if v.name is not None: if v.name is not None:
return slot, v return slot, v
return None return None
@ -353,45 +360,24 @@ class UtilsHashsetPrinter(Printer):
return None return None
class UtilsHashmapPrinter(Printer): class UtilsHashmapPrinter(UtilsHashsetPrinter):
'''Printer for Hashmap<K, V, N, HASH, EQUAL>''' '''Printer for Hashmap<K, V, N, HASH, EQUAL>'''
def initialize(self): def try_read_std_optional(self, slot, entry):
self.hash_set = UtilsHashsetPrinter(self.member('set_'))
# Replace the lookup function so we can extract the key and value out of the std::optionals in the Hashset
self.hash_set.try_read_std_optional_func = self.try_read_std_optional
def update(self):
self.hash_set.update()
def get_summary(self):
return self.hash_set.get_summary()
def num_children(self):
return self.hash_set.num_children()
def has_children(self):
return self.hash_set.has_children()
def get_child_at_index(self, index):
return self.hash_set.get_child_at_index(index)
def try_read_std_optional(self, slot, value):
try: try:
# libc++ # libc++
val = value.EvaluateExpression('__val_') val = entry.EvaluateExpression('__val_')
k = val.EvaluateExpression('key') k = val.EvaluateExpression('key')
v = val.EvaluateExpression('value') v = val.EvaluateExpression('value')
if k.name is not None and v.name is not None: if k.name is not None and v.name is not None:
return k.GetValue(), v return k.GetValue(), v
# libstdc++ # libstdc++
val = value.EvaluateExpression('_M_payload._M_payload._M_value') val = entry.EvaluateExpression('_M_payload._M_payload._M_value')
k = val.EvaluateExpression('key') k = val.EvaluateExpression('key')
v = val.EvaluateExpression('value') v = val.EvaluateExpression('value')
if k.name is not None and v.name is not None: if k.name is not None and v.name is not None:
return k.GetValue(), v return k.GetValue(), v
return None
except: except:
pass return None
# Failed, fall back on hash_set
return self.hash_set.try_read_std_optional(slot, value)