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