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