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