| /** |
| * @file name_storage.cpp |
| * Storage of global names (filenames and symbols) |
| * |
| * @remark Copyright 2002 OProfile authors |
| * @remark Read the file COPYING |
| * |
| * @author Philippe Elie |
| * @author John Levon |
| */ |
| |
| #include "name_storage.h" |
| #include "demangle_symbol.h" |
| #include "file_manip.h" |
| #include "string_manip.h" |
| #include "locate_images.h" |
| #include "op_exception.h" |
| |
| using namespace std; |
| |
| image_name_storage image_names; |
| debug_name_storage debug_names; |
| symbol_name_storage symbol_names; |
| |
| |
| string const & image_name_storage::basename(image_name_id id) const |
| { |
| stored_filename const & n = get(id); |
| if (n.base_filename.empty()) |
| n.base_filename = op_basename(n.filename); |
| return n.base_filename; |
| } |
| |
| |
| string const & image_name_storage::get_name(image_name_id id, |
| image_name_type type, |
| extra_images const & extra) const |
| { |
| stored_filename const & n = get(id); |
| if (type == int_filename) { |
| return n.filename; |
| } else if (type == int_basename) { |
| return basename(id); |
| } else if (type == int_real_basename) { |
| if (n.extra_images_uid == 0) { |
| // recursive call to init real_filename. |
| get_name(id, int_real_filename, extra); |
| n.real_base_filename = op_basename(n.real_filename); |
| } |
| return n.real_base_filename; |
| } else if (type == int_real_filename) { |
| if (n.extra_images_uid == 0) { |
| // We ignore error here, the real path will be |
| // identical to the name derived from the sample |
| // filename in this case. FIXME: this mean than the |
| // archive path will be ignored if an error occur. |
| image_error error; |
| n.real_filename = extra.find_image_path(name(id), |
| error, true); |
| n.extra_images_uid = extra.get_uid(); |
| } |
| |
| if (n.extra_images_uid == extra.get_uid()) |
| return n.real_filename; |
| throw op_runtime_error("image_name_storage::get_name() called" |
| " with different extra parameter"); |
| } |
| |
| throw op_runtime_error("invalid parameter to" |
| " image_name_storage;;get_name()"); |
| } |
| |
| |
| string const & debug_name_storage::basename(debug_name_id id) const |
| { |
| stored_name const & n = get(id); |
| if (n.name_processed.empty()) |
| n.name_processed = op_basename(n.name); |
| return n.name_processed; |
| } |
| |
| |
| string const & symbol_name_storage::demangle(symbol_name_id id) const |
| { |
| stored_name const & n = get(id); |
| if (!n.name_processed.empty() || n.name.empty()) |
| return n.name_processed; |
| |
| if (n.name[0] != '?') { |
| n.name_processed = demangle_symbol(n.name); |
| return n.name_processed; |
| } |
| |
| if (n.name.length() < 2 || n.name[1] != '?') { |
| n.name_processed = "(no symbols)"; |
| return n.name_processed; |
| } |
| |
| n.name_processed = "anonymous symbol from section "; |
| n.name_processed += ltrim(n.name, "?"); |
| return n.name_processed; |
| } |