Browse Source

elf_mem_map: add declaration position in --map

Yuri D'Elia 2 years ago
parent
commit
7bdee552ce
1 changed files with 20 additions and 7 deletions
  1. 20 7
      tools/elf_mem_map

+ 20 - 7
tools/elf_mem_map

@@ -10,7 +10,7 @@ EEPROM_OFFSET = 0x810000
 FILL_BYTE = b'\0'
 
 
-Entry = namedtuple('Entry', ['name', 'loc', 'size'])
+Entry = namedtuple('Entry', ['name', 'loc', 'size', 'declpos'])
 Member = namedtuple('Member', ['name', 'off', 'size'])
 
 
@@ -160,6 +160,8 @@ def get_elf_globals(path, expand_structs, struct_gaps=True):
 
     grefs = []
     for CU in dwarfinfo.iter_CUs():
+        file_entries = dwarfinfo.line_program_for_CU(CU).header["file_entry"]
+
         for DIE in CU.iter_DIEs():
             # handle only variable types
             if DIE.tag != 'DW_TAG_variable':
@@ -196,6 +198,16 @@ def get_elf_globals(path, expand_structs, struct_gaps=True):
                 continue
             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)
             array_dim = get_array_dims(DIE)
 
@@ -208,17 +220,18 @@ def get_elf_globals(path, expand_structs, struct_gaps=True):
                 else:
                     for member in members:
                         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:
                 # likely string, remove one dimension
                 byte_size *= array_dim.pop()
             if len(array_dim) == 0 or (len(array_dim) == 1 and array_dim[0] == 1):
                 # 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:
                 # likely string, avoid expansion
-                grefs.append(Entry(name + '[]', loc, array_dim[0]))
+                grefs.append(Entry(name + '[]', loc, array_dim[0], declpos))
             else:
                 # expand array entries
                 array_pos = loc
@@ -229,7 +242,7 @@ def get_elf_globals(path, expand_structs, struct_gaps=True):
                     for d in range(len(array_dim)):
                         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
                     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):
-    print('OFFSET\tSIZE\tNAME')
+    print('OFFSET\tSIZE\tNAME\tDECLPOS')
     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():