symbol_container.cpp revision cc2ee177dbb3befca43e36cfc56778b006c3d050
1/**
2 * @file symbol_container.cpp
3 * Internal container for symbols
4 *
5 * @remark Copyright 2002 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author Philippe Elie
9 * @author John Levon
10 */
11
12#include <string>
13#include <algorithm>
14#include <set>
15#include <vector>
16
17#include "symbol_container.h"
18
19using namespace std;
20
21symbol_container::size_type symbol_container::size() const
22{
23	return symbols.size();
24}
25
26
27symbol_entry const * symbol_container::insert(symbol_entry const & symb)
28{
29	pair<symbols_t::iterator, bool> p = symbols.insert(symb);
30	if (!p.second) {
31		// safe: count is not used by sorting criteria
32		symbol_entry * symbol = const_cast<symbol_entry*>(&*p.first);
33		symbol->sample.counts += symb.sample.counts;
34	}
35
36	return &*p.first;
37}
38
39
40symbol_entry const *
41symbol_container::find(debug_name_id filename, size_t linenr) const
42{
43	build_by_loc();
44
45	symbol_entry symbol;
46	symbol.sample.file_loc.filename = filename;
47	symbol.sample.file_loc.linenr = linenr;
48
49	symbols_by_loc_t::const_iterator it = symbols_by_loc.find(&symbol);
50
51	if (it != symbols_by_loc.end())
52		return *it;
53
54	return 0;
55}
56
57
58void symbol_container::build_by_loc() const
59{
60	if (!symbols_by_loc.empty())
61		return;
62
63	symbols_t::const_iterator cit = symbols.begin();
64	symbols_t::const_iterator end = symbols.end();
65	for (; cit != end; ++cit)
66		symbols_by_loc.insert(&*cit);
67}
68
69
70symbol_entry const * symbol_container::find_by_vma(string const & image_name,
71						   bfd_vma vma) const
72{
73	// FIXME: this is too inefficient probably
74	symbols_t::const_iterator it;
75	for (it = symbols.begin(); it != symbols.end(); ++it) {
76		if (it->sample.vma == vma &&
77		    image_names.name(it->image_name) == image_name)
78			return &*it;
79	}
80
81	return 0;
82}
83
84
85symbol_container::symbols_t::iterator symbol_container::begin()
86{
87	return symbols.begin();
88}
89
90
91symbol_container::symbols_t::iterator symbol_container::end()
92{
93	return symbols.end();
94}
95
96symbol_entry const * symbol_container::find(symbol_entry const & symbol) const
97{
98	symbols_t::const_iterator it = symbols.find(symbol);
99	return it == symbols.end() ? 0 : &*it;
100}
101