oprofile 0.9.6

Copy in the rest of the oprofile 0.9.6 tree so we have a source
copy to match the prebuilt binaries that are checked into
external/.

Change-Id: Iaac327571d5d583594a4194973bf256569061048
diff --git a/libpp/name_storage.cpp b/libpp/name_storage.cpp
new file mode 100644
index 0000000..3664573
--- /dev/null
+++ b/libpp/name_storage.cpp
@@ -0,0 +1,102 @@
+/**
+ * @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;
+}