summaryrefslogtreecommitdiff
path: root/scripts/gendwarfksyms/dwarf.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/gendwarfksyms/dwarf.c')
-rw-r--r--scripts/gendwarfksyms/dwarf.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/scripts/gendwarfksyms/dwarf.c b/scripts/gendwarfksyms/dwarf.c
index a9966a23167a..bdf899d60707 100644
--- a/scripts/gendwarfksyms/dwarf.c
+++ b/scripts/gendwarfksyms/dwarf.c
@@ -740,12 +740,33 @@ static int process_type(struct state *state, struct die *parent, Dwarf_Die *die)
/*
* Exported symbol processing
*/
+static struct die *get_symbol_cache(struct state *state, Dwarf_Die *die)
+{
+ struct die *cache;
+
+ cache = die_map_get(die, DIE_SYMBOL);
+
+ if (cache->state != DIE_INCOMPLETE)
+ return NULL; /* We already processed a symbol for this DIE */
+
+ cache->tag = dwarf_tag(die);
+ return cache;
+}
+
static void process_symbol(struct state *state, Dwarf_Die *die,
die_callback_t process_func)
{
+ struct die *cache;
+
+ symbol_set_die(state->sym, die);
+
+ cache = get_symbol_cache(state, die);
+ if (!cache)
+ return;
+
debug("%s", state->sym->name);
- check(process_func(state, NULL, die));
- state->sym->state = SYMBOL_MAPPED;
+ check(process_func(state, cache, die));
+ cache->state = DIE_SYMBOL;
if (dump_dies)
fputs("\n", stderr);
}