18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file name_storage.h
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Type-safe unique storage of global names (filenames and symbols)
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef NAME_STORAGE_H
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define NAME_STORAGE_H
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <string>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "unique_storage.h"
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass extra_images;
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// store original name and processed name
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct stored_name {
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	stored_name(std::string const & n = std::string())
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		: name(n) {}
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool operator<(stored_name const & rhs) const {
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return name < rhs.name;
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string name;
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mutable std::string name_processed;
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// partial specialization for unique storage of names
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtemplate <typename I> struct name_storage : unique_storage<I, stored_name> {
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	typedef typename unique_storage<I, stored_name>::id_value id_value;
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string const & name(id_value const & id) const {
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return unique_storage<I, stored_name>::get(id).name;
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass debug_name_tag;
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// a debug filename
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtypedef name_storage<debug_name_tag>::id_value debug_name_id;
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// class storing a set of shared debug name (source filename)
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct debug_name_storage : name_storage<debug_name_tag> {
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return the basename for the given ID
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string const & basename(debug_name_id id) const;
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// store original name and processed name
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct stored_filename {
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	stored_filename(std::string const & n = std::string())
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		: filename(n), extra_images_uid(0) {}
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool operator<(stored_filename const & rhs) const {
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return filename < rhs.filename;
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string filename;
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mutable std::string base_filename;
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mutable std::string real_filename;
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mutable std::string real_base_filename;
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mutable int extra_images_uid;
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// partial specialization for unique storage of filenames
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtemplate <typename I>
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct filename_storage : unique_storage<I, stored_filename> {
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	typedef typename unique_storage<I, stored_filename>::id_value id_value;
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string const & name(id_value const & id) const {
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return unique_storage<I, stored_filename>::get(id).filename;
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass image_name_tag;
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// an image name
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtypedef filename_storage<image_name_tag>::id_value image_name_id;
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// class storing a set of shared image name
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct image_name_storage : filename_storage<image_name_tag> {
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	enum image_name_type {
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/// image name based on the sample filename w/o path
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		int_basename,
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/// image name based on the sample filename
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		int_filename,
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/// real image name, can be different for module.
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		int_real_basename,
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/// same as int_real_basename + the complete path, including an
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/// optionnal archive_path passed trough profile_spec
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		int_real_filename,
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	};
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param id  the image name id
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param type  the image name type
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param extra  extra locations where the image can be found
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * If type == int_real_name (resp. int_real_filename) and the image
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * can't be located the return value is the same as if get_name()
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * was called with int_name (resp. int_filename).
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * multiple call with the image_name_id and different extra parameter
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * will throw a runtime error, multiple extra_images are possible
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * with differential profile but the name. FIXME
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string const & get_name(image_name_id id,
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				     image_name_type type,
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				     extra_images const & extra) const;
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return the basename name for the given ID
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string const & basename(image_name_id) const;
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass symbol_name_tag;
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// a (demangled) symbol
1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtypedef name_storage<symbol_name_tag>::id_value symbol_name_id;
1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// class storing a set of shared symbol name
1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct symbol_name_storage : name_storage<symbol_name_tag> {
1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return the demangled name for the given ID
1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string const & demangle(symbol_name_id id) const;
1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// for images
1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddextern image_name_storage image_names;
1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// for debug filenames i.e. source filename
1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddextern debug_name_storage debug_names;
1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// for symbols
1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddextern symbol_name_storage symbol_names;
1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * debug name specialisation for comparison.
1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * We compare by name rather by id since what user will see are
1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * filename and when the criteria "samples count" give identical
1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * result it's better to obtain result sorted by the user visible
1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * property filename rather than by an obscure, invisible from user
1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * point of view, file identifier property
1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtemplate<> inline bool
1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddebug_name_id::operator<(debug_name_id const & rhs) const
1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return debug_names.name(*this) < debug_names.name(rhs);
1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* !NAME_STORAGE_H */
160