|
@@ -40,11 +40,10 @@ def get_elf_globals(path):
|
|
|
# handle only variable types
|
|
|
if DIE.tag != 'DW_TAG_variable':
|
|
|
continue
|
|
|
- if 'DW_AT_name' not in DIE.attributes:
|
|
|
- continue
|
|
|
if 'DW_AT_location' not in DIE.attributes:
|
|
|
continue
|
|
|
- if 'DW_AT_type' not in DIE.attributes:
|
|
|
+ if 'DW_AT_name' not in DIE.attributes and \
|
|
|
+ 'DW_AT_abstract_origin' not in DIE.attributes:
|
|
|
continue
|
|
|
|
|
|
# handle locations encoded directly as DW_OP_addr (leaf globals)
|
|
@@ -57,7 +56,18 @@ def get_elf_globals(path):
|
|
|
continue
|
|
|
loc -= SRAM_OFFSET
|
|
|
|
|
|
- # variable name
|
|
|
+ # variable name/type
|
|
|
+ if 'DW_AT_name' not in DIE.attributes and \
|
|
|
+ 'DW_AT_abstract_origin' in DIE.attributes:
|
|
|
+ DIE = DIE.get_DIE_from_attribute('DW_AT_abstract_origin')
|
|
|
+ if 'DW_AT_location' in DIE.attributes:
|
|
|
+ # duplicate reference (handled directly), skip
|
|
|
+ continue
|
|
|
+ if 'DW_AT_name' not in DIE.attributes:
|
|
|
+ continue
|
|
|
+ if 'DW_AT_type' not in DIE.attributes:
|
|
|
+ continue
|
|
|
+
|
|
|
name = DIE.attributes['DW_AT_name'].value.decode('ascii')
|
|
|
|
|
|
# recurse on type to find the final storage definition
|