• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * @file name_storage.h
3  * Type-safe unique 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 #ifndef NAME_STORAGE_H
13 #define NAME_STORAGE_H
14 
15 #include <string>
16 
17 #include "unique_storage.h"
18 
19 class extra_images;
20 
21 /// store original name and processed name
22 struct stored_name {
23 	stored_name(std::string const & n = std::string())
namestored_name24 		: name(n) {}
25 
26 	bool operator<(stored_name const & rhs) const {
27 		return name < rhs.name;
28 	}
29 
30 	std::string name;
31 	mutable std::string name_processed;
32 };
33 
34 
35 /// partial specialization for unique storage of names
36 template <typename I> struct name_storage : unique_storage<I, stored_name> {
37 
38 	typedef typename unique_storage<I, stored_name>::id_value id_value;
39 
namename_storage40 	std::string const & name(id_value const & id) const {
41 		return unique_storage<I, stored_name>::get(id).name;
42 	}
43 };
44 
45 
46 class debug_name_tag;
47 /// a debug filename
48 typedef name_storage<debug_name_tag>::id_value debug_name_id;
49 
50 /// class storing a set of shared debug name (source filename)
51 struct debug_name_storage : name_storage<debug_name_tag> {
52 	/// return the basename for the given ID
53 	std::string const & basename(debug_name_id id) const;
54 };
55 
56 /// store original name and processed name
57 struct stored_filename {
58 	stored_filename(std::string const & n = std::string())
filenamestored_filename59 		: filename(n), extra_images_uid(0) {}
60 
61 	bool operator<(stored_filename const & rhs) const {
62 		return filename < rhs.filename;
63 	}
64 
65 	std::string filename;
66 	mutable std::string base_filename;
67 	mutable std::string real_filename;
68 	mutable std::string real_base_filename;
69 	mutable int extra_images_uid;
70 };
71 
72 /// partial specialization for unique storage of filenames
73 template <typename I>
74 struct filename_storage : unique_storage<I, stored_filename> {
75 
76 	typedef typename unique_storage<I, stored_filename>::id_value id_value;
77 
namefilename_storage78 	std::string const & name(id_value const & id) const {
79 		return unique_storage<I, stored_filename>::get(id).filename;
80 	}
81 };
82 
83 class image_name_tag;
84 /// an image name
85 typedef filename_storage<image_name_tag>::id_value image_name_id;
86 
87 /// class storing a set of shared image name
88 struct image_name_storage : filename_storage<image_name_tag> {
89 	enum image_name_type {
90 		/// image name based on the sample filename w/o path
91 		int_basename,
92 		/// image name based on the sample filename
93 		int_filename,
94 		/// real image name, can be different for module.
95 		int_real_basename,
96 		/// same as int_real_basename + the complete path, including an
97 		/// optionnal archive_path passed trough profile_spec
98 		int_real_filename,
99 	};
100 
101 	/**
102 	 * @param id  the image name id
103 	 * @param type  the image name type
104 	 * @param extra  extra locations where the image can be found
105 	 *
106 	 * If type == int_real_name (resp. int_real_filename) and the image
107 	 * can't be located the return value is the same as if get_name()
108 	 * was called with int_name (resp. int_filename).
109 	 *
110 	 * multiple call with the image_name_id and different extra parameter
111 	 * will throw a runtime error, multiple extra_images are possible
112 	 * with differential profile but the name. FIXME
113 	 */
114 	std::string const & get_name(image_name_id id,
115 				     image_name_type type,
116 				     extra_images const & extra) const;
117 
118 	/// return the basename name for the given ID
119 	std::string const & basename(image_name_id) const;
120 };
121 
122 
123 class symbol_name_tag;
124 /// a (demangled) symbol
125 typedef name_storage<symbol_name_tag>::id_value symbol_name_id;
126 
127 /// class storing a set of shared symbol name
128 struct symbol_name_storage : name_storage<symbol_name_tag> {
129 	/// return the demangled name for the given ID
130 	std::string const & demangle(symbol_name_id id) const;
131 };
132 
133 
134 /// for images
135 extern image_name_storage image_names;
136 
137 /// for debug filenames i.e. source filename
138 extern debug_name_storage debug_names;
139 
140 /// for symbols
141 extern symbol_name_storage symbol_names;
142 
143 
144 /**
145  * debug name specialisation for comparison.
146  *
147  * We compare by name rather by id since what user will see are
148  * filename and when the criteria "samples count" give identical
149  * result it's better to obtain result sorted by the user visible
150  * property filename rather than by an obscure, invisible from user
151  * point of view, file identifier property
152  */
153 template<> inline bool
154 debug_name_id::operator<(debug_name_id const & rhs) const
155 {
156 	return debug_names.name(*this) < debug_names.name(rhs);
157 }
158 
159 #endif /* !NAME_STORAGE_H */
160