diff options
author | Dave Brolley <brolley@redhat.com> | 2009-07-02 11:53:49 -0400 |
---|---|---|
committer | Dave Brolley <brolley@redhat.com> | 2009-07-02 11:53:49 -0400 |
commit | 22b631a3708bcd731bb99db6a3c78cbf2063c18e (patch) | |
tree | ccd13076e64a39c87b5035640ccc9a07e7f4daa8 /dwflpp.cxx | |
parent | 22e3ee0face9f1b470fa7089dc662adf75bba5bc (diff) | |
parent | 1c6b77e564d4d849f1994d56d662ceb018a112d4 (diff) | |
download | systemtap-steved-22b631a3708bcd731bb99db6a3c78cbf2063c18e.tar.gz systemtap-steved-22b631a3708bcd731bb99db6a3c78cbf2063c18e.tar.xz systemtap-steved-22b631a3708bcd731bb99db6a3c78cbf2063c18e.zip |
Merge branch 'master' of git://sources.redhat.com/git/systemtap
Diffstat (limited to 'dwflpp.cxx')
-rw-r--r-- | dwflpp.cxx | 19 |
1 files changed, 15 insertions, 4 deletions
@@ -563,29 +563,40 @@ dwflpp::iterate_over_functions (int (* callback)(Dwarf_Die * func, base_query * dwarf_getfuncs (cu, cu_function_caching_callback, v, 0); if (sess.verbose > 4) clog << "function cache " << key << " size " << v->size() << endl; + mod_info->update_symtab(v); } cu_function_cache_t::iterator it = v->find(function); if (it != v->end()) { - Dwarf_Die die = it->second; + Dwarf_Die& die = it->second; if (sess.verbose > 4) clog << "function cache " << key << " hit " << function << endl; return (*callback)(& die, q); } else if (name_has_wildcard (function)) { + // track addresses we've already seen + set<Dwarf_Addr> alias_dupes; + for (it = v->begin(); it != v->end(); it++) { - if (pending_interrupts) return DWARF_CB_ABORT; - string func_name = it->first; - Dwarf_Die die = it->second; + if (pending_interrupts) return DWARF_CB_ABORT; + const string& func_name = it->first; + Dwarf_Die& die = it->second; if (function_name_matches_pattern (func_name, function)) { if (sess.verbose > 4) clog << "function cache " << key << " match " << func_name << " vs " << function << endl; + // make sure that this function address hasn't + // already been matched under an aliased name + Dwarf_Addr addr; + if (dwarf_entrypc(&die, &addr) == 0 && + !alias_dupes.insert(addr).second) + continue; + rc = (*callback)(& die, q); if (rc != DWARF_CB_OK) break; } |