1 /** 2 * @file symbol_container.h 3 * Internal container for symbols 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 SYMBOL_CONTAINER_H 13 #define SYMBOL_CONTAINER_H 14 15 #include <string> 16 #include <set> 17 18 #include "symbol.h" 19 #include "symbol_functors.h" 20 21 /** 22 * An arbitrary container of symbols. Supports lookup 23 * by name, by VMA, and by file location. 24 * 25 * Lookup by name or by VMA is O(n). Lookup by file location 26 * is O(log(n)). 27 */ 28 class symbol_container { 29 public: 30 /// container type 31 typedef std::set<symbol_entry, less_symbol> symbols_t; 32 33 typedef symbols_t::size_type size_type; 34 35 /// return the number of symbols stored 36 size_type size() const; 37 38 /** 39 * Insert a new symbol. If the symbol already exists in the container, 40 * then the sample counts are accumulated. 41 * Returns the newly created symbol or the existing one. This pointer 42 * remains valid during the whole life time of a symbol_container 43 * object and is warranted unique according to less_symbol comparator. 44 * Can only be done before any file-location based lookups, since the 45 * two lookup methods are not synchronised. 46 */ 47 symbol_entry const * insert(symbol_entry const &); 48 49 /// find the symbols at the given filename and line number, if any 50 symbol_collection const find(debug_name_id filename, size_t linenr) const; 51 52 /// find the symbols defined in the given filename, if any 53 symbol_collection const find(debug_name_id filename) const; 54 55 /// find the symbol with the given image_name vma if any 56 symbol_entry const * find_by_vma(std::string const & image_name, 57 bfd_vma vma) const; 58 59 /// Search a symbol. Return NULL if not found. 60 symbol_entry const * find(symbol_entry const & symbol) const; 61 62 /// return start of symbols 63 symbols_t::iterator begin(); 64 65 /// return end of symbols 66 symbols_t::iterator end(); 67 68 private: 69 /// build the symbol by file-location cache 70 void build_by_loc() const; 71 72 /** 73 * The main container of symbols. Multiple symbols with the same 74 * name are allowed. 75 */ 76 symbols_t symbols; 77 78 /** 79 * Differently-named symbol at same file location are allowed e.g. 80 * template instantiation. 81 */ 82 typedef std::multiset<symbol_entry const *, less_by_file_loc> 83 symbols_by_loc_t; 84 85 // must be declared after the set to ensure a correct life-time. 86 87 /** 88 * Symbols sorted by location order. Lazily built on request, 89 * so mutable. 90 */ 91 mutable symbols_by_loc_t symbols_by_loc; 92 }; 93 94 #endif /* SYMBOL_CONTAINER_H */ 95