diff options
Diffstat (limited to 'tapsets.cxx')
-rw-r--r-- | tapsets.cxx | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/tapsets.cxx b/tapsets.cxx index 8d0e0ab2..9884860a 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -548,6 +548,9 @@ struct dwarf_query : public base_query Dwarf_Die *scope_die, Dwarf_Addr addr); + // Track addresses we've already seen in a given module + set<Dwarf_Addr> alias_dupes; + // Extracted parameters. string function_val; @@ -854,6 +857,9 @@ dwarf_query::handle_query_module() // prebuild the symbol table to resolve aliases dw.mod_info->get_symtab(this); + // reset the dupe-checking for each new module + alias_dupes.clear(); + if (dw.mod_info->dwarf_status == info_present) query_module_dwarf(); @@ -1272,6 +1278,14 @@ query_dwarf_func (Dwarf_Die * func, base_query * bq) { q->dw.focus_on_function (func); + // make sure that this function address hasn't + // already been matched under an aliased name + Dwarf_Addr addr; + if (!q->dw.func_is_inline() && + dwarf_entrypc(func, &addr) == 0 && + !q->alias_dupes.insert(addr).second) + return DWARF_CB_OK; + if (q->dw.func_is_inline () && (! q->has_call) && (! q->has_return) && (q->has_statement_str || q->has_function_str)) |