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