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 */
28class symbol_container {
29public:
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
68private:
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