125 lines
2.6 KiB
C++
125 lines
2.6 KiB
C++
/**
|
|
* @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;
|
|
}
|