| /** |
| * @file symbol_container.cpp |
| * Internal container for symbols |
| * |
| * @remark Copyright 2002 OProfile authors |
| * @remark Read the file COPYING |
| * |
| * @author Philippe Elie |
| * @author John Levon |
| */ |
| |
| #include <string> |
| #include <algorithm> |
| #include <set> |
| #include <vector> |
| |
| #include "symbol_container.h" |
| |
| using namespace std; |
| |
| symbol_container::size_type symbol_container::size() const |
| { |
| return symbols.size(); |
| } |
| |
| |
| symbol_entry const * symbol_container::insert(symbol_entry const & symb) |
| { |
| pair<symbols_t::iterator, bool> p = symbols.insert(symb); |
| if (!p.second) { |
| // safe: count is not used by sorting criteria |
| symbol_entry * symbol = const_cast<symbol_entry*>(&*p.first); |
| symbol->sample.counts += symb.sample.counts; |
| } |
| |
| return &*p.first; |
| } |
| |
| |
| symbol_collection const |
| symbol_container::find(debug_name_id filename, size_t linenr) const |
| { |
| build_by_loc(); |
| |
| symbol_entry symbol; |
| symbol.sample.file_loc.filename = filename; |
| symbol.sample.file_loc.linenr = linenr; |
| |
| symbol_collection result; |
| |
| typedef symbols_by_loc_t::const_iterator it; |
| pair<it, it> p_it = symbols_by_loc.equal_range(&symbol); |
| for ( ; p_it.first != p_it.second; ++p_it.first) |
| result.push_back(*p_it.first); |
| |
| return result; |
| } |
| |
| |
| symbol_collection const |
| symbol_container::find(debug_name_id filename) const |
| { |
| build_by_loc(); |
| |
| symbol_entry symbol; |
| symbol.sample.file_loc.filename = filename; |
| symbol.sample.file_loc.linenr = 0; |
| |
| typedef symbols_by_loc_t::const_iterator it; |
| it first = symbols_by_loc.lower_bound(&symbol); |
| symbol.sample.file_loc.linenr = (unsigned int)size_t(-1); |
| it last = symbols_by_loc.upper_bound(&symbol); |
| |
| symbol_collection result; |
| for ( ; first != last ; ++first) |
| result.push_back(*first); |
| |
| return result; |
| } |
| |
| |
| void symbol_container::build_by_loc() const |
| { |
| if (!symbols_by_loc.empty()) |
| return; |
| |
| symbols_t::const_iterator cit = symbols.begin(); |
| symbols_t::const_iterator end = symbols.end(); |
| for (; cit != end; ++cit) |
| symbols_by_loc.insert(&*cit); |
| } |
| |
| |
| symbol_entry const * symbol_container::find_by_vma(string const & image_name, |
| bfd_vma vma) const |
| { |
| // FIXME: this is too inefficient probably |
| symbols_t::const_iterator it; |
| for (it = symbols.begin(); it != symbols.end(); ++it) { |
| if (it->sample.vma == vma && |
| image_names.name(it->image_name) == image_name) |
| return &*it; |
| } |
| |
| return 0; |
| } |
| |
| |
| symbol_container::symbols_t::iterator symbol_container::begin() |
| { |
| return symbols.begin(); |
| } |
| |
| |
| symbol_container::symbols_t::iterator symbol_container::end() |
| { |
| return symbols.end(); |
| } |
| |
| symbol_entry const * symbol_container::find(symbol_entry const & symbol) const |
| { |
| symbols_t::const_iterator it = symbols.find(symbol); |
| return it == symbols.end() ? 0 : &*it; |
| } |