18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file symbol_container.cpp
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Internal container for symbols
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <string>
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <algorithm>
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <set>
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <vector>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "symbol_container.h"
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddusing namespace std;
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_container::size_type symbol_container::size() const
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return symbols.size();
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_entry const * symbol_container::insert(symbol_entry const & symb)
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pair<symbols_t::iterator, bool> p = symbols.insert(symb);
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!p.second) {
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// safe: count is not used by sorting criteria
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		symbol_entry * symbol = const_cast<symbol_entry*>(&*p.first);
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		symbol->sample.counts += symb.sample.counts;
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return &*p.first;
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_collection const
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_container::find(debug_name_id filename, size_t linenr) const
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	build_by_loc();
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol_entry symbol;
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol.sample.file_loc.filename = filename;
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol.sample.file_loc.linenr = linenr;
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol_collection result;
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	typedef symbols_by_loc_t::const_iterator it;
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pair<it, it> p_it = symbols_by_loc.equal_range(&symbol);
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for ( ; p_it.first != p_it.second; ++p_it.first)
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		result.push_back(*p_it.first);
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return result;
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_collection const
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_container::find(debug_name_id filename) const
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	build_by_loc();
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol_entry symbol;
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol.sample.file_loc.filename = filename;
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol.sample.file_loc.linenr = 0;
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	typedef symbols_by_loc_t::const_iterator it;
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	it first = symbols_by_loc.lower_bound(&symbol);
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol.sample.file_loc.linenr = (unsigned int)size_t(-1);
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	it last  = symbols_by_loc.upper_bound(&symbol);
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol_collection result;
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for ( ; first != last ; ++first)
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		result.push_back(*first);
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return result;
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid symbol_container::build_by_loc() const
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!symbols_by_loc.empty())
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbols_t::const_iterator cit = symbols.begin();
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbols_t::const_iterator end = symbols.end();
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (; cit != end; ++cit)
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		symbols_by_loc.insert(&*cit);
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_entry const * symbol_container::find_by_vma(string const & image_name,
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd						   bfd_vma vma) const
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// FIXME: this is too inefficient probably
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbols_t::const_iterator it;
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (it = symbols.begin(); it != symbols.end(); ++it) {
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (it->sample.vma == vma &&
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		    image_names.name(it->image_name) == image_name)
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return &*it;
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return 0;
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_container::symbols_t::iterator symbol_container::begin()
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return symbols.begin();
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_container::symbols_t::iterator symbol_container::end()
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return symbols.end();
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_entry const * symbol_container::find(symbol_entry const & symbol) const
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbols_t::const_iterator it = symbols.find(symbol);
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return it == symbols.end() ? 0 : &*it;
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
125