Try to fix members types

Signed-off-by: Juraj Oravec <jurajoravec@mailo.com>
This commit is contained in:
Juraj Oravec 2024-05-29 01:45:07 +02:00
parent e1f6b279f2
commit e0b5edca57
Signed by: SGOrava
GPG Key ID: 13660A3F1D9F093B

18
main.py
View File

@ -17,6 +17,14 @@ configuration = {
'print_debug_info': False, 'print_debug_info': False,
} }
supported_types = [
'DW_TAG_base_type',
'DW_TAG_structure_type',
'DW_TAG_array_type',
'DW_TAG_union_type',
'DW_TAG_enumeration_type'
]
def eprint(*args, **kwargs): def eprint(*args, **kwargs):
if configuration['print_debug_info']: if configuration['print_debug_info']:
@ -168,7 +176,7 @@ class Bear():
die_type_test = die_type die_type_test = die_type
while 'DW_AT_type' in die_type_test.attributes: while 'DW_AT_type' in die_type_test.attributes:
die_type_test = die_type_test.get_DIE_from_attribute('DW_AT_type') die_type_test = die_type_test.get_DIE_from_attribute('DW_AT_type')
if die_type_test.tag in ['DW_TAG_base_type', 'DW_TAG_structure_type', 'DW_TAG_array_type', 'DW_TAG_union_type']: if die_type_test.tag in supported_types:
die_type = die_type_test die_type = die_type_test
break break
@ -180,7 +188,7 @@ class Bear():
if real_type_name != '?' and real_type_name != entry['type']: if real_type_name != '?' and real_type_name != entry['type']:
entry['type'] = '{name} ({real})'.format(name=entry['type'], entry['type'] = '{name} ({real})'.format(name=entry['type'],
real=safe_DIE_name(die_type, '?')) real=safe_DIE_name(die_type, '?'))
elif die_type.tag == "DW_TAG_structure_type": elif die_type.tag == 'DW_TAG_structure_type':
load_children(die_type) load_children(die_type)
child_dies = [] child_dies = []
child_offset = 0 child_offset = 0
@ -188,6 +196,8 @@ class Bear():
for child_die in die_type._children: for child_die in die_type._children:
if 'DW_AT_type' in child_die.attributes: if 'DW_AT_type' in child_die.attributes:
typ_die = child_die.get_DIE_from_attribute('DW_AT_type') typ_die = child_die.get_DIE_from_attribute('DW_AT_type')
elif child_die.tag in supported_types:
typ_die = child_die
else: else:
eprint('Child DIE with no type information') eprint('Child DIE with no type information')
epprint(child_die) epprint(child_die)
@ -212,7 +222,7 @@ class Bear():
child_dies.append(child_entry) child_dies.append(child_entry)
entry['children'] = child_dies entry['children'] = child_dies
elif die_type.tag == "DW_TAG_array_type": elif die_type.tag == 'DW_TAG_array_type':
self.truly_resolve_type(entry, die_type.get_DIE_from_attribute('DW_AT_type')) self.truly_resolve_type(entry, die_type.get_DIE_from_attribute('DW_AT_type'))
load_children(die_type) load_children(die_type)
entry['number_of_elements'] = die_type._children[0].attributes['DW_AT_upper_bound'].value + 1 entry['number_of_elements'] = die_type._children[0].attributes['DW_AT_upper_bound'].value + 1
@ -222,6 +232,8 @@ class Bear():
for child_die in die_type._children: for child_die in die_type._children:
if 'DW_AT_type' in child_die.attributes: if 'DW_AT_type' in child_die.attributes:
typ_die = child_die.get_DIE_from_attribute('DW_AT_type') typ_die = child_die.get_DIE_from_attribute('DW_AT_type')
elif child_die.tag in supported_types:
typ_die = child_die
else: else:
eprint('Child DIE with no type information') eprint('Child DIE with no type information')
epprint(child_die) epprint(child_die)