18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file profile_container.h
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Container associating symbols and 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#ifndef PROFILE_CONTAINER_H
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define PROFILE_CONTAINER_H
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <string>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <vector>
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "profile.h"
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "utility.h"
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_bfd.h"
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "sample_container.h"
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "symbol_container.h"
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "format_flags.h"
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "locate_images.h"
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass string_filter;
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass symbol_entry;
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass sample_entry;
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Store multiple samples files belonging to the same profiling session.
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * This is the main container capable of holding the profiles for arbitrary
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * binary images and arbitrary profile classes.
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass profile_container : noncopyable {
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpublic:
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * Build an object to store information on samples. All parameters
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * acts as hint for what you will request after recording samples and
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * so allow optimizations during recording the information.
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param debug_info If true line numbers and source files are
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * recorded.
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param need_details If true if we need to record all samples or to
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * to record them at symbol level.
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param extra extra images location
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_container(bool debug_info, bool need_details,
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			  extra_images const & extra);
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	~profile_container();
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * add() - record symbols/samples in the underlying container
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param profile the samples files container
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param abfd the associated bfd object
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param app_name the owning application name of sample
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param pclass the profile class to add results for
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * add() is an helper for delayed ctor. Take care you can't safely
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * make any call to add after any other member function call.
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * Obviously you can add only samples files which are coherent (same
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * sampling rate, same events etc.)
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void add(profile_t const & profile, op_bfd const & abfd,
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		 std::string const & app_name, size_t pclass);
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// Find a symbol from its image_name, vma, return zero if no symbol
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// for this image at this vma
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol_entry const * find_symbol(std::string const & image_name,
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					 bfd_vma vma) const;
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// Find the symbols from its filename, linenr, return an empty
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// symbol_collection if no symbol at this location
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol_collection const find_symbol(debug_name_id filename,
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					size_t linenr) const;
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// Find a sample by its symbol, vma, return zero if there is no sample
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// at this vma
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	sample_entry const * find_sample(symbol_entry const * symbol,
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					 bfd_vma vma) const;
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// Find a symbol. Return NULL if not found.
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol_entry const * find(symbol_entry const & symbol) const;
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// used for select_symbols()
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct symbol_choice {
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		symbol_choice()
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			: hints(cf_none), threshold(0.0), match_image(false) {}
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/// hints filled in
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		column_flags hints;
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/// percentage threshold
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		double threshold;
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/// match the image name only
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		bool match_image;
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/// owning image name
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		std::string image_name;
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	};
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * select_symbols - create a set of symbols sorted by sample count
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param choice  parameters to use/fill in when selecting
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol_collection const select_symbols(symbol_choice & choice) const;
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * select_symbols - create a set of symbols belonging to a given source
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param filename  source file where are defined the returned symbols
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol_collection const select_symbols(debug_name_id filename) const;
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// Like select_symbols for filename without allowing sort by vma.
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::vector<debug_name_id> const select_filename(double threshold) const;
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return the total number of samples
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	count_array_t samples_count() const;
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// Get the samples count which belongs to filename. Return 0 if
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// no samples found.
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	count_array_t samples_count(debug_name_id filename_id) const;
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// Get the samples count which belongs to filename, linenr. Return
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// 0 if no samples found.
1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	count_array_t samples_count(debug_name_id filename,
1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			   size_t linenr) const;
1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return an iterator to the first symbol
1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol_container::symbols_t::iterator begin_symbol() const;
1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return an iterator to the last symbol
1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	symbol_container::symbols_t::iterator end_symbol() const;
1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return iterator to the first samples
1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	sample_container::samples_iterator begin() const;
1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return iterator to the last samples
1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	sample_container::samples_iterator end() const;
1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return iterator to the first samples for this symbol
1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	sample_container::samples_iterator begin(symbol_entry const *) const;
1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return iterator to the last samples for this symbol
1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	sample_container::samples_iterator end(symbol_entry const *) const;
1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprivate:
1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// helper for add()
1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void add_samples(op_bfd const & abfd, symbol_index_t sym_index,
1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	                 profile_t::iterator_pair const &,
1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	                 symbol_entry const * symbol, size_t pclass,
1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			 unsigned long start);
1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * create an unique artificial symbol for an offset range. The range
1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * is only a hint of the maximum size of the created symbol. We
1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * give to the symbol an unique name as ?image_file_name#order and
1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * a range up to the nearest of syms or for the whole range if no
1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * syms exist after the start offset. the end parameter is updated
1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * to reflect the symbol range.
1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *
1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * The rationale here is to try to create symbols for alignment between
1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * function as little as possible and to create meaningfull symbols
1608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * for special case such image w/o symbol.
1618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
1628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string create_artificial_symbol(op_bfd const & abfd, u32 start,
1638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	                                     u32 & end, size_t & order);
1648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// The symbols collected by pp tools sorted by increased vma, provide
1668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// also a sort order on samples count for each profile class
1678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	scoped_ptr<symbol_container> symbols;
1688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// The samples count collected by pp tools sorted by increased vma,
1698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// provide also a sort order on (filename, linenr)
1708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	scoped_ptr<sample_container> samples;
1718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// build() must count samples count for each profile class so cache it
1728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// here since user of profile_container often need it later.
1738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	count_array_t total_count;
1748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
1768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * Optimization hints for what information we are going to need,
1778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * see the explanation in profile_container()
1788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
1798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	//@{
1808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool debug_info;
1818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool need_details;
1828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	//@}
1838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpublic: // FIXME
1858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	extra_images extra_found_images;
1868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
1878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* !PROFILE_CONTAINER_H */
189