| /** |
| * @file symbol_container.h |
| * Internal container for symbols |
| * |
| * @remark Copyright 2002, 2003 OProfile authors |
| * @remark Read the file COPYING |
| * |
| * @author Philippe Elie |
| * @author John Levon |
| */ |
| |
| #ifndef SYMBOL_CONTAINER_H |
| #define SYMBOL_CONTAINER_H |
| |
| #include <string> |
| #include <set> |
| |
| #include "symbol.h" |
| #include "symbol_functors.h" |
| |
| /** |
| * An arbitrary container of symbols. Supports lookup |
| * by name, by VMA, and by file location. |
| * |
| * Lookup by name or by VMA is O(n). Lookup by file location |
| * is O(log(n)). |
| */ |
| class symbol_container { |
| public: |
| /// container type |
| typedef std::set<symbol_entry, less_symbol> symbols_t; |
| |
| typedef symbols_t::size_type size_type; |
| |
| /// return the number of symbols stored |
| size_type size() const; |
| |
| /** |
| * Insert a new symbol. If the symbol already exists in the container, |
| * then the sample counts are accumulated. |
| * Returns the newly created symbol or the existing one. This pointer |
| * remains valid during the whole life time of a symbol_container |
| * object and is warranted unique according to less_symbol comparator. |
| * Can only be done before any file-location based lookups, since the |
| * two lookup methods are not synchronised. |
| */ |
| symbol_entry const * insert(symbol_entry const &); |
| |
| /// find the symbols at the given filename and line number, if any |
| symbol_collection const find(debug_name_id filename, size_t linenr) const; |
| |
| /// find the symbols defined in the given filename, if any |
| symbol_collection const find(debug_name_id filename) const; |
| |
| /// find the symbol with the given image_name vma if any |
| symbol_entry const * find_by_vma(std::string const & image_name, |
| bfd_vma vma) const; |
| |
| /// Search a symbol. Return NULL if not found. |
| symbol_entry const * find(symbol_entry const & symbol) const; |
| |
| /// return start of symbols |
| symbols_t::iterator begin(); |
| |
| /// return end of symbols |
| symbols_t::iterator end(); |
| |
| private: |
| /// build the symbol by file-location cache |
| void build_by_loc() const; |
| |
| /** |
| * The main container of symbols. Multiple symbols with the same |
| * name are allowed. |
| */ |
| symbols_t symbols; |
| |
| /** |
| * Differently-named symbol at same file location are allowed e.g. |
| * template instantiation. |
| */ |
| typedef std::multiset<symbol_entry const *, less_by_file_loc> |
| symbols_by_loc_t; |
| |
| // must be declared after the set to ensure a correct life-time. |
| |
| /** |
| * Symbols sorted by location order. Lazily built on request, |
| * so mutable. |
| */ |
| mutable symbols_by_loc_t symbols_by_loc; |
| }; |
| |
| #endif /* SYMBOL_CONTAINER_H */ |