name_storage.cpp revision cc2ee177dbb3befca43e36cfc56778b006c3d050
1/**
2 * @file name_storage.cpp
3 * Storage of global names (filenames and 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 <stdexcept>
13
14#include "name_storage.h"
15#include "demangle_symbol.h"
16#include "file_manip.h"
17#include "string_manip.h"
18
19using namespace std;
20
21image_name_storage image_names;
22debug_name_storage debug_names;
23symbol_name_storage symbol_names;
24
25
26string const & image_name_storage::basename(image_name_id id) const
27{
28	stored_name const & n = get(id);
29	if (n.name_processed.empty()) {
30		n.name_processed = op_basename(n.name);
31	}
32	return n.name_processed;
33}
34
35
36string const & debug_name_storage::basename(debug_name_id id) const
37{
38	stored_name const & n = get(id);
39	if (n.name_processed.empty()) {
40		n.name_processed = op_basename(n.name);
41	}
42	return n.name_processed;
43}
44
45
46string const & symbol_name_storage::demangle(symbol_name_id id) const
47{
48	stored_name const & n = get(id);
49	if (!n.name_processed.empty() || n.name.empty())
50		return n.name_processed;
51
52	if (n.name[0] != '?') {
53		n.name_processed = demangle_symbol(n.name);
54		return n.name_processed;
55	}
56
57	if (n.name.length() < 2 || n.name[1] != '?') {
58		n.name_processed = "(no symbols)";
59		return n.name_processed;
60	}
61
62	n.name_processed = "anonymous symbol from section ";
63	n.name_processed += ltrim(n.name, "?");
64	return n.name_processed;
65}
66