18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/** 28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file profile_container.cpp 38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * profile file container 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 <set> 138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <vector> 148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <string> 158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <iostream> 168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <sstream> 178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <algorithm> 188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <numeric> 198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "symbol.h" 218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_header.h" 228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "profile.h" 238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "symbol_functors.h" 248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "profile_container.h" 258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "sample_container.h" 268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "symbol_container.h" 278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "populate_for_spu.h" 288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddusing namespace std; 308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace { 328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct filename_by_samples { 348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd filename_by_samples(debug_name_id id, double percent_) 358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd : filename(id), percent(percent_) 368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd {} 378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool operator<(filename_by_samples const & lhs) const { 398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (percent != lhs.percent) 408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return percent < lhs.percent; 418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return filename < lhs.filename; 428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd debug_name_id filename; 458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // ratio of samples which belongs to this filename. 468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd double percent; 478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} // anon namespace 508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_container::profile_container(bool debug_info_, bool need_details_, 538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd extra_images const & extra_) 548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd : 558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symbols(new symbol_container), 568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples(new sample_container), 578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd debug_info(debug_info_), 588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd need_details(need_details_), 598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd extra_found_images(extra_) 608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_container::~profile_container() 658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// Post condition: 708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// the symbols/samples are sorted by increasing vma. 718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// the range of sample_entry inside each symbol entry are valid 728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// the samples_by_file_loc member var is correctly setup. 738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid profile_container::add(profile_t const & profile, 748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd op_bfd const & abfd, string const & app_name, 758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd size_t pclass) 768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string const image_name = abfd.get_filename(); 788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd opd_header header = profile.get_header(); 798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd for (symbol_index_t i = 0; i < abfd.syms.size(); ++i) { 818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long long start = 0, end = 0; 838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symbol_entry symb_entry; 848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd abfd.get_symbol_range(i, start, end); 868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd profile_t::iterator_pair p_it = 888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd profile.samples_range(start, end); 898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd count_type count = accumulate(p_it.first, p_it.second, 0ull); 908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // skip entries with no samples 928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (count == 0) 938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd continue; 948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symb_entry.sample.counts[pclass] = count; 968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd total_count[pclass] += count; 978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symb_entry.size = end - start; 998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symb_entry.name = symbol_names.create(abfd.syms[i].name()); 1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symb_entry.sym_index = i; 1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symb_entry.sample.file_loc.linenr = 0; 1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (debug_info) { 1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string filename; 1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (abfd.get_linenr(i, start, filename, 1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symb_entry.sample.file_loc.linenr)) { 1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symb_entry.sample.file_loc.filename = 1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd debug_names.create(filename); 1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symb_entry.image_name = image_names.create(image_name); 1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symb_entry.app_name = image_names.create(app_name); 1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symb_entry.sample.vma = abfd.syms[i].vma(); 1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if ((header.spu_profile == cell_spu_profile) && 1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd header.embedded_offset) { 1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symb_entry.spu_offset = header.embedded_offset; 1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symb_entry.embedding_filename = 1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd image_names.create(abfd.get_embedding_filename()); 1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } else { 1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symb_entry.spu_offset = 0; 1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symbol_entry const * symbol = symbols->insert(symb_entry); 1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (need_details) 1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd add_samples(abfd, i, p_it, symbol, pclass, start); 1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid 1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_container::add_samples(op_bfd const & abfd, symbol_index_t sym_index, 1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd profile_t::iterator_pair const & p_it, 1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symbol_entry const * symbol, size_t pclass, 1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long start) 1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bfd_vma base_vma = abfd.syms[sym_index].vma(); 1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd profile_t::const_iterator it; 1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd for (it = p_it.first; it != p_it.second ; ++it) { 1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample_entry sample; 1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample.counts[pclass] = it.count(); 1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample.file_loc.linenr = 0; 1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (debug_info) { 1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string filename; 1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (abfd.get_linenr(sym_index, it.vma(), filename, 1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample.file_loc.linenr)) { 1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample.file_loc.filename = 1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd debug_names.create(filename); 1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample.vma = (it.vma() - start) + base_vma; 1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples->insert(symbol, sample); 1608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 1628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_collection const 1658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_container::select_symbols(symbol_choice & choice) const 1668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 1678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symbol_collection result; 1688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd double const threshold = choice.threshold / 100.0; 1708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symbol_container::symbols_t::iterator it = symbols->begin(); 1728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd symbol_container::symbols_t::iterator const end = symbols->end(); 1738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd for (; it != end; ++it) { 1758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (choice.match_image 1768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd && (image_names.name(it->image_name) != choice.image_name)) 1778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd continue; 1788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd double const percent = 1808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd op_ratio(it->sample.counts[0], total_count[0]); 1818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (percent >= threshold) { 1838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd result.push_back(&*it); 1848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd choice.hints = it->output_hint(choice.hints); 1868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return result; 1908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 1918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvector<debug_name_id> const 1948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_container::select_filename(double threshold) const 1958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 1968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd set<debug_name_id> filename_set; 1978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd threshold /= 100.0; 1998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // Trying to iterate on symbols to create the set of filenames which 2018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // contain sample does not work: a symbol can contain samples and this 2028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // symbol is in a source file that contain zero sample because only 2038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // inline function in this source file contains samples. 2048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample_container::samples_iterator sit = samples->begin(); 2058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample_container::samples_iterator const send = samples->end(); 2068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd for (; sit != send; ++sit) { 2088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd debug_name_id name_id = sit->second.file_loc.filename; 2098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (name_id.set()) 2108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd filename_set.insert(name_id); 2118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 2128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // Give a sort order on filename for the selected pclass. 2148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd vector<filename_by_samples> file_by_samples; 2158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd set<debug_name_id>::const_iterator it = filename_set.begin(); 2178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd set<debug_name_id>::const_iterator const end = filename_set.end(); 2188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd for (; it != end; ++it) { 2198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // FIXME: is samples_count() the right interface now ? 2208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd count_array_t counts = samples_count(*it); 2218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd double const ratio = op_ratio(counts[0], total_count[0]); 2238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd filename_by_samples const f(*it, ratio); 2248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd file_by_samples.push_back(f); 2268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 2278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // now sort the file_by_samples entry. 2298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sort(file_by_samples.begin(), file_by_samples.end()); 2308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // 2.91.66 doesn't like const_reverse_iterator in this context 2328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd vector<filename_by_samples>::reverse_iterator cit 2338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd = file_by_samples.rbegin(); 2348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd vector<filename_by_samples>::reverse_iterator const cend 2358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd = file_by_samples.rend(); 2368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd vector<debug_name_id> result; 2388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd for (; cit != cend; ++cit) { 2398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (cit->percent >= threshold) 2408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd result.push_back(cit->filename); 2418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 2428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return result; 2448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 2458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcount_array_t profile_container::samples_count() const 2488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 2498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return total_count; 2508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 2518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// Rest here are delegated to our private implementation. 2548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_entry const * 2568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_container::find_symbol(string const & image_name, bfd_vma vma) const 2578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 2588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return symbols->find_by_vma(image_name, vma); 2598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 2608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_collection const 2638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_container::find_symbol(debug_name_id filename, size_t linenr) const 2648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 2658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return symbols->find(filename, linenr); 2668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 2678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_collection const 2708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_container::select_symbols(debug_name_id filename) const 2718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 2728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return symbols->find(filename); 2738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 2748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_entry const * 2768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_container::find_sample(symbol_entry const * symbol, bfd_vma vma) const 2778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 2788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return samples->find_by_vma(symbol, vma); 2798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 2808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcount_array_t profile_container::samples_count(debug_name_id filename_id) const 2838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 2848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return samples->accumulate_samples(filename_id); 2858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 2868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcount_array_t profile_container::samples_count(debug_name_id filename, 2898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd size_t linenr) const 2908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 2918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return samples->accumulate_samples(filename, linenr); 2928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 2938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_container::samples_iterator 2968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_container::begin(symbol_entry const * symbol) const 2978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 2988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return samples->begin(symbol); 2998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 3008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_container::samples_iterator 3038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_container::end(symbol_entry const * symbol) const 3048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 3058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return samples->end(symbol); 3068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 3078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_container::samples_iterator profile_container::begin() const 3108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 3118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return samples->begin(); 3128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 3138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_container::samples_iterator profile_container::end() const 3168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 3178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return samples->end(); 3188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 3198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_entry const * profile_container::find(symbol_entry const & symbol) const 3218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 3228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return symbols->find(symbol); 3238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 3248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_container::symbols_t::iterator profile_container::begin_symbol() const 3268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 3278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return symbols->begin(); 3288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 3298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_container::symbols_t::iterator profile_container::end_symbol() const 3318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 3328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return symbols->end(); 3338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 334