18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/** 28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file sample_container.cpp 38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Internal container for samples 48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002, 2003 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 <climits> 138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <set> 148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <numeric> 158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <algorithm> 168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <vector> 178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "sample_container.h" 198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddusing namespace std; 218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace { 238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// FIXME: efficiency ? 258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcount_array_t add_counts(count_array_t const & counts, 268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample_entry const * s) 278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd count_array_t temp(counts); 298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd temp += s->counts; 308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return temp; 318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} // namespace anon 348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_container::samples_iterator sample_container::begin() const 378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return samples.begin(); 398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_container::samples_iterator sample_container::end() const 438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return samples.end(); 458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_container::samples_iterator 498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_container::begin(symbol_entry const * symbol) const 508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples_storage::key_type key(symbol, 0); 528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return samples.lower_bound(key); 548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_container::samples_iterator 588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_container::end(symbol_entry const * symbol) const 598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples_storage::key_type key(symbol, ~bfd_vma(0)); 618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return samples.upper_bound(key); 638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid sample_container::insert(symbol_entry const * symbol, 678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample_entry const & sample) 688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples_storage::key_type key(symbol, sample.vma); 708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples_storage::iterator it = samples.find(key); 728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (it != samples.end()) { 738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd it->second.counts += sample.counts; 748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } else { 758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples[key] = sample; 768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcount_array_t 818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_container::accumulate_samples(debug_name_id filename_id) const 828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd build_by_loc(); 848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample_entry lower, upper; 868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd lower.file_loc.filename = upper.file_loc.filename = filename_id; 888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd lower.file_loc.linenr = 0; 898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd upper.file_loc.linenr = INT_MAX; 908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef samples_by_loc_t::const_iterator iterator; 928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd iterator it1 = samples_by_loc.lower_bound(&lower); 948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd iterator it2 = samples_by_loc.upper_bound(&upper); 958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return accumulate(it1, it2, count_array_t(), add_counts); 978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_entry const * 1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_container::find_by_vma(symbol_entry const * symbol, bfd_vma vma) const 1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample_index_t key(symbol, vma); 1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples_iterator it = samples.find(key); 1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (it != samples.end()) 1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return &it->second; 1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return 0; 1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcount_array_t 1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsample_container::accumulate_samples(debug_name_id filename, 1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd size_t linenr) const 1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd build_by_loc(); 1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample_entry sample; 1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample.file_loc.filename = filename; 1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sample.file_loc.linenr = linenr; 1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef pair<samples_by_loc_t::const_iterator, 1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples_by_loc_t::const_iterator> it_pair; 1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd it_pair itp = samples_by_loc.equal_range(&sample); 1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return accumulate(itp.first, itp.second, count_array_t(), add_counts); 1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid sample_container::build_by_loc() const 1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (!samples_by_loc.empty()) 1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return; 1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples_iterator cit = samples.begin(); 1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples_iterator end = samples.end(); 1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd for (; cit != end; ++cit) 1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples_by_loc.insert(&cit->second); 1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 142