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