elf_mem_map: add declaration position in --map
This commit is contained in:
parent
d1720cba51
commit
7bdee552ce
1 changed files with 20 additions and 7 deletions
|
@ -10,7 +10,7 @@ EEPROM_OFFSET = 0x810000
|
||||||
FILL_BYTE = b'\0'
|
FILL_BYTE = b'\0'
|
||||||
|
|
||||||
|
|
||||||
Entry = namedtuple('Entry', ['name', 'loc', 'size'])
|
Entry = namedtuple('Entry', ['name', 'loc', 'size', 'declpos'])
|
||||||
Member = namedtuple('Member', ['name', 'off', 'size'])
|
Member = namedtuple('Member', ['name', 'off', 'size'])
|
||||||
|
|
||||||
|
|
||||||
|
@ -160,6 +160,8 @@ def get_elf_globals(path, expand_structs, struct_gaps=True):
|
||||||
|
|
||||||
grefs = []
|
grefs = []
|
||||||
for CU in dwarfinfo.iter_CUs():
|
for CU in dwarfinfo.iter_CUs():
|
||||||
|
file_entries = dwarfinfo.line_program_for_CU(CU).header["file_entry"]
|
||||||
|
|
||||||
for DIE in CU.iter_DIEs():
|
for DIE in CU.iter_DIEs():
|
||||||
# handle only variable types
|
# handle only variable types
|
||||||
if DIE.tag != 'DW_TAG_variable':
|
if DIE.tag != 'DW_TAG_variable':
|
||||||
|
@ -196,6 +198,16 @@ def get_elf_globals(path, expand_structs, struct_gaps=True):
|
||||||
continue
|
continue
|
||||||
byte_size = size[1]
|
byte_size = size[1]
|
||||||
|
|
||||||
|
# location of main definition
|
||||||
|
declpos = ''
|
||||||
|
if 'DW_AT_decl_file' in DIE.attributes and \
|
||||||
|
'DW_AT_decl_line' in DIE.attributes:
|
||||||
|
line = DIE.attributes['DW_AT_decl_line'].value
|
||||||
|
fname = DIE.attributes['DW_AT_decl_file'].value
|
||||||
|
if fname and fname - 1 < len(file_entries):
|
||||||
|
fname = file_entries[fname-1].name.decode('ascii')
|
||||||
|
declpos = '{}:{}'.format(fname, line)
|
||||||
|
|
||||||
# fetch array dimensions (if known)
|
# fetch array dimensions (if known)
|
||||||
array_dim = get_array_dims(DIE)
|
array_dim = get_array_dims(DIE)
|
||||||
|
|
||||||
|
@ -208,17 +220,18 @@ def get_elf_globals(path, expand_structs, struct_gaps=True):
|
||||||
else:
|
else:
|
||||||
for member in members:
|
for member in members:
|
||||||
grefs.append(Entry(entry.name + '.' + member.name,
|
grefs.append(Entry(entry.name + '.' + member.name,
|
||||||
entry.loc + member.off, member.size))
|
entry.loc + member.off, member.size,
|
||||||
|
entry.declpos))
|
||||||
|
|
||||||
if byte_size == 1 and len(array_dim) > 1:
|
if byte_size == 1 and len(array_dim) > 1:
|
||||||
# likely string, remove one dimension
|
# likely string, remove one dimension
|
||||||
byte_size *= array_dim.pop()
|
byte_size *= array_dim.pop()
|
||||||
if len(array_dim) == 0 or (len(array_dim) == 1 and array_dim[0] == 1):
|
if len(array_dim) == 0 or (len(array_dim) == 1 and array_dim[0] == 1):
|
||||||
# plain entry
|
# plain entry
|
||||||
expand_members(Entry(name, loc, byte_size), members)
|
expand_members(Entry(name, loc, byte_size, declpos), members)
|
||||||
elif len(array_dim) == 1 and byte_size == 1:
|
elif len(array_dim) == 1 and byte_size == 1:
|
||||||
# likely string, avoid expansion
|
# likely string, avoid expansion
|
||||||
grefs.append(Entry(name + '[]', loc, array_dim[0]))
|
grefs.append(Entry(name + '[]', loc, array_dim[0], declpos))
|
||||||
else:
|
else:
|
||||||
# expand array entries
|
# expand array entries
|
||||||
array_pos = loc
|
array_pos = loc
|
||||||
|
@ -229,7 +242,7 @@ def get_elf_globals(path, expand_structs, struct_gaps=True):
|
||||||
for d in range(len(array_dim)):
|
for d in range(len(array_dim)):
|
||||||
sfx += '[{}]'.format(str(array_loc[d]).rjust(len(str(array_dim[d]-1)), '0'))
|
sfx += '[{}]'.format(str(array_loc[d]).rjust(len(str(array_dim[d]-1)), '0'))
|
||||||
|
|
||||||
expand_members(Entry(name + sfx, array_pos, byte_size), members)
|
expand_members(Entry(name + sfx, array_pos, byte_size, declpos), members)
|
||||||
|
|
||||||
# advance
|
# advance
|
||||||
if array_inc(array_loc, array_dim):
|
if array_inc(array_loc, array_dim):
|
||||||
|
@ -316,9 +329,9 @@ def annotate_refs(grefs, addr, data, width, gaps=True, overlaps=True):
|
||||||
|
|
||||||
|
|
||||||
def print_map(grefs):
|
def print_map(grefs):
|
||||||
print('OFFSET\tSIZE\tNAME')
|
print('OFFSET\tSIZE\tNAME\tDECLPOS')
|
||||||
for entry in grefs:
|
for entry in grefs:
|
||||||
print('{:x}\t{}\t{}'.format(entry.loc, entry.size, entry.name))
|
print('{:x}\t{}\t{}\t{}'.format(entry.loc, entry.size, entry.name, entry.declpos))
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
Loading…
Reference in a new issue