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