/** * @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; }