Home | History | Annotate | Download | only in libpp
      1 /**
      2  * @file symbol_container.cpp
      3  * Internal container for symbols
      4  *
      5  * @remark Copyright 2002 OProfile authors
      6  * @remark Read the file COPYING
      7  *
      8  * @author Philippe Elie
      9  * @author John Levon
     10  */
     11 
     12 #include <string>
     13 #include <algorithm>
     14 #include <set>
     15 #include <vector>
     16 
     17 #include "symbol_container.h"
     18 
     19 using namespace std;
     20 
     21 symbol_container::size_type symbol_container::size() const
     22 {
     23 	return symbols.size();
     24 }
     25 
     26 
     27 symbol_entry const * symbol_container::insert(symbol_entry const & symb)
     28 {
     29 	pair<symbols_t::iterator, bool> p = symbols.insert(symb);
     30 	if (!p.second) {
     31 		// safe: count is not used by sorting criteria
     32 		symbol_entry * symbol = const_cast<symbol_entry*>(&*p.first);
     33 		symbol->sample.counts += symb.sample.counts;
     34 	}
     35 
     36 	return &*p.first;
     37 }
     38 
     39 
     40 symbol_collection const
     41 symbol_container::find(debug_name_id filename, size_t linenr) const
     42 {
     43 	build_by_loc();
     44 
     45 	symbol_entry symbol;
     46 	symbol.sample.file_loc.filename = filename;
     47 	symbol.sample.file_loc.linenr = linenr;
     48 
     49 	symbol_collection result;
     50 
     51 	typedef symbols_by_loc_t::const_iterator it;
     52 	pair<it, it> p_it = symbols_by_loc.equal_range(&symbol);
     53 	for ( ; p_it.first != p_it.second; ++p_it.first)
     54 		result.push_back(*p_it.first);
     55 
     56 	return result;
     57 }
     58 
     59 
     60 symbol_collection const
     61 symbol_container::find(debug_name_id filename) const
     62 {
     63 	build_by_loc();
     64 
     65 	symbol_entry symbol;
     66 	symbol.sample.file_loc.filename = filename;
     67 	symbol.sample.file_loc.linenr = 0;
     68 
     69 	typedef symbols_by_loc_t::const_iterator it;
     70 	it first = symbols_by_loc.lower_bound(&symbol);
     71 	symbol.sample.file_loc.linenr = (unsigned int)size_t(-1);
     72 	it last  = symbols_by_loc.upper_bound(&symbol);
     73 
     74 	symbol_collection result;
     75 	for ( ; first != last ; ++first)
     76 		result.push_back(*first);
     77 
     78 	return result;
     79 }
     80 
     81 
     82 void symbol_container::build_by_loc() const
     83 {
     84 	if (!symbols_by_loc.empty())
     85 		return;
     86 
     87 	symbols_t::const_iterator cit = symbols.begin();
     88 	symbols_t::const_iterator end = symbols.end();
     89 	for (; cit != end; ++cit)
     90 		symbols_by_loc.insert(&*cit);
     91 }
     92 
     93 
     94 symbol_entry const * symbol_container::find_by_vma(string const & image_name,
     95 						   bfd_vma vma) const
     96 {
     97 	// FIXME: this is too inefficient probably
     98 	symbols_t::const_iterator it;
     99 	for (it = symbols.begin(); it != symbols.end(); ++it) {
    100 		if (it->sample.vma == vma &&
    101 		    image_names.name(it->image_name) == image_name)
    102 			return &*it;
    103 	}
    104 
    105 	return 0;
    106 }
    107 
    108 
    109 symbol_container::symbols_t::iterator symbol_container::begin()
    110 {
    111 	return symbols.begin();
    112 }
    113 
    114 
    115 symbol_container::symbols_t::iterator symbol_container::end()
    116 {
    117 	return symbols.end();
    118 }
    119 
    120 symbol_entry const * symbol_container::find(symbol_entry const & symbol) const
    121 {
    122 	symbols_t::const_iterator it = symbols.find(symbol);
    123 	return it == symbols.end() ? 0 : &*it;
    124 }
    125