1 /** 2 * @file profile_container.h 3 * Container associating symbols and samples 4 * 5 * @remark Copyright 2002, 2003 OProfile authors 6 * @remark Read the file COPYING 7 * 8 * @author Philippe Elie 9 * @author John Levon 10 */ 11 12 #ifndef PROFILE_CONTAINER_H 13 #define PROFILE_CONTAINER_H 14 15 #include <string> 16 #include <vector> 17 18 #include "profile.h" 19 #include "utility.h" 20 #include "op_bfd.h" 21 #include "sample_container.h" 22 #include "symbol_container.h" 23 #include "format_flags.h" 24 #include "locate_images.h" 25 26 class string_filter; 27 class symbol_entry; 28 class sample_entry; 29 30 /** 31 * Store multiple samples files belonging to the same profiling session. 32 * This is the main container capable of holding the profiles for arbitrary 33 * binary images and arbitrary profile classes. 34 */ 35 class profile_container : noncopyable { 36 public: 37 /** 38 * Build an object to store information on samples. All parameters 39 * acts as hint for what you will request after recording samples and 40 * so allow optimizations during recording the information. 41 * 42 * @param debug_info If true line numbers and source files are 43 * recorded. 44 * @param need_details If true if we need to record all samples or to 45 * to record them at symbol level. 46 * @param extra extra images location 47 */ 48 profile_container(bool debug_info, bool need_details, 49 extra_images const & extra); 50 51 ~profile_container(); 52 53 /** 54 * add() - record symbols/samples in the underlying container 55 * 56 * @param profile the samples files container 57 * @param abfd the associated bfd object 58 * @param app_name the owning application name of sample 59 * @param pclass the profile class to add results for 60 * 61 * add() is an helper for delayed ctor. Take care you can't safely 62 * make any call to add after any other member function call. 63 * Obviously you can add only samples files which are coherent (same 64 * sampling rate, same events etc.) 65 */ 66 void add(profile_t const & profile, op_bfd const & abfd, 67 std::string const & app_name, size_t pclass); 68 69 /// Find a symbol from its image_name, vma, return zero if no symbol 70 /// for this image at this vma 71 symbol_entry const * find_symbol(std::string const & image_name, 72 bfd_vma vma) const; 73 74 /// Find the symbols from its filename, linenr, return an empty 75 /// symbol_collection if no symbol at this location 76 symbol_collection const find_symbol(debug_name_id filename, 77 size_t linenr) const; 78 79 /// Find a sample by its symbol, vma, return zero if there is no sample 80 /// at this vma 81 sample_entry const * find_sample(symbol_entry const * symbol, 82 bfd_vma vma) const; 83 84 /// Find a symbol. Return NULL if not found. 85 symbol_entry const * find(symbol_entry const & symbol) const; 86 87 /// used for select_symbols() 88 struct symbol_choice { 89 symbol_choice() 90 : hints(cf_none), threshold(0.0), match_image(false) {} 91 92 /// hints filled in 93 column_flags hints; 94 /// percentage threshold 95 double threshold; 96 /// match the image name only 97 bool match_image; 98 /// owning image name 99 std::string image_name; 100 }; 101 102 /** 103 * select_symbols - create a set of symbols sorted by sample count 104 * @param choice parameters to use/fill in when selecting 105 */ 106 symbol_collection const select_symbols(symbol_choice & choice) const; 107 108 /** 109 * select_symbols - create a set of symbols belonging to a given source 110 * @param filename source file where are defined the returned symbols 111 */ 112 symbol_collection const select_symbols(debug_name_id filename) const; 113 114 /// Like select_symbols for filename without allowing sort by vma. 115 std::vector<debug_name_id> const select_filename(double threshold) const; 116 117 /// return the total number of samples 118 count_array_t samples_count() const; 119 120 /// Get the samples count which belongs to filename. Return 0 if 121 /// no samples found. 122 count_array_t samples_count(debug_name_id filename_id) const; 123 /// Get the samples count which belongs to filename, linenr. Return 124 /// 0 if no samples found. 125 count_array_t samples_count(debug_name_id filename, 126 size_t linenr) const; 127 128 /// return an iterator to the first symbol 129 symbol_container::symbols_t::iterator begin_symbol() const; 130 /// return an iterator to the last symbol 131 symbol_container::symbols_t::iterator end_symbol() const; 132 133 /// return iterator to the first samples 134 sample_container::samples_iterator begin() const; 135 /// return iterator to the last samples 136 sample_container::samples_iterator end() const; 137 138 /// return iterator to the first samples for this symbol 139 sample_container::samples_iterator begin(symbol_entry const *) const; 140 /// return iterator to the last samples for this symbol 141 sample_container::samples_iterator end(symbol_entry const *) const; 142 143 private: 144 /// helper for add() 145 void add_samples(op_bfd const & abfd, symbol_index_t sym_index, 146 profile_t::iterator_pair const &, 147 symbol_entry const * symbol, size_t pclass, 148 unsigned long start); 149 150 /** 151 * create an unique artificial symbol for an offset range. The range 152 * is only a hint of the maximum size of the created symbol. We 153 * give to the symbol an unique name as ?image_file_name#order and 154 * a range up to the nearest of syms or for the whole range if no 155 * syms exist after the start offset. the end parameter is updated 156 * to reflect the symbol range. 157 * 158 * The rationale here is to try to create symbols for alignment between 159 * function as little as possible and to create meaningfull symbols 160 * for special case such image w/o symbol. 161 */ 162 std::string create_artificial_symbol(op_bfd const & abfd, u32 start, 163 u32 & end, size_t & order); 164 165 /// The symbols collected by pp tools sorted by increased vma, provide 166 /// also a sort order on samples count for each profile class 167 scoped_ptr<symbol_container> symbols; 168 /// The samples count collected by pp tools sorted by increased vma, 169 /// provide also a sort order on (filename, linenr) 170 scoped_ptr<sample_container> samples; 171 /// build() must count samples count for each profile class so cache it 172 /// here since user of profile_container often need it later. 173 count_array_t total_count; 174 175 /** 176 * Optimization hints for what information we are going to need, 177 * see the explanation in profile_container() 178 */ 179 //@{ 180 bool debug_info; 181 bool need_details; 182 //@} 183 184 public: // FIXME 185 extra_images extra_found_images; 186 }; 187 188 #endif /* !PROFILE_CONTAINER_H */ 189