18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/** 28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file name_storage.cpp 38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 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#include "name_storage.h" 138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "demangle_symbol.h" 148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "file_manip.h" 158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "string_manip.h" 168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "locate_images.h" 178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_exception.h" 188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddusing namespace std; 208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddimage_name_storage image_names; 228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddebug_name_storage debug_names; 238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsymbol_name_storage symbol_names; 248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstring const & image_name_storage::basename(image_name_id id) const 278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stored_filename const & n = get(id); 298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (n.base_filename.empty()) 308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd n.base_filename = op_basename(n.filename); 318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return n.base_filename; 328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstring const & image_name_storage::get_name(image_name_id id, 368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd image_name_type type, 378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd extra_images const & extra) const 388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stored_filename const & n = get(id); 408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (type == int_filename) { 418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return n.filename; 428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } else if (type == int_basename) { 438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return basename(id); 448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } else if (type == int_real_basename) { 458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (n.extra_images_uid == 0) { 468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // recursive call to init real_filename. 478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd get_name(id, int_real_filename, extra); 488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd n.real_base_filename = op_basename(n.real_filename); 498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return n.real_base_filename; 518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } else if (type == int_real_filename) { 528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (n.extra_images_uid == 0) { 538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // We ignore error here, the real path will be 548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // identical to the name derived from the sample 558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // filename in this case. FIXME: this mean than the 568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // archive path will be ignored if an error occur. 578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd image_error error; 588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd n.real_filename = extra.find_image_path(name(id), 598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd error, true); 608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd n.extra_images_uid = extra.get_uid(); 618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (n.extra_images_uid == extra.get_uid()) 648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return n.real_filename; 658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd throw op_runtime_error("image_name_storage::get_name() called" 668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd " with different extra parameter"); 678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd throw op_runtime_error("invalid parameter to" 708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd " image_name_storage;;get_name()"); 718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstring const & debug_name_storage::basename(debug_name_id id) const 758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stored_name const & n = get(id); 778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (n.name_processed.empty()) 788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd n.name_processed = op_basename(n.name); 798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return n.name_processed; 808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstring const & symbol_name_storage::demangle(symbol_name_id id) const 848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stored_name const & n = get(id); 868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (!n.name_processed.empty() || n.name.empty()) 878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return n.name_processed; 888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (n.name[0] != '?') { 908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd n.name_processed = demangle_symbol(n.name); 918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return n.name_processed; 928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (n.name.length() < 2 || n.name[1] != '?') { 958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd n.name_processed = "(no symbols)"; 968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return n.name_processed; 978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd n.name_processed = "anonymous symbol from section "; 1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd n.name_processed += ltrim(n.name, "?"); 1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return n.name_processed; 1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 103