18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file arrange_profiles.cpp
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Classify and process a list of candidate sample files
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * into merged sets and classes.
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2003 OProfile authors
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <algorithm>
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <cstdlib>
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <iostream>
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <iterator>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <map>
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <set>
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "string_manip.h"
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_header.h"
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_exception.h"
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "arrange_profiles.h"
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "format_output.h"
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "xml_utils.h"
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "parse_filename.h"
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "locate_images.h"
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddusing namespace std;
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace {
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint numeric_compare(string const & lhs, string const & rhs)
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (lhs == "all" && rhs == "all")
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return 0;
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// we choose an order arbitrarily
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (lhs == "all")
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return 1;
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (rhs == "all")
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return -1;
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	unsigned int lhsval = op_lexical_cast<unsigned int>(lhs);
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	unsigned int rhsval = op_lexical_cast<unsigned int>(rhs);
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (lhsval == rhsval)
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return 0;
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (lhsval < rhsval)
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return -1;
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return 1;
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} // anonymous namespace
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// global to fix some C++ obscure corner case.
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool operator<(profile_class const & lhs,
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd               profile_class const & rhs)
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_template const & lt = lhs.ptemplate;
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_template const & rt = rhs.ptemplate;
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	int comp;
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// The profile classes are used to traverse the sample data
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// arrays.  We create XML elements for <process> and <thread>
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// that contain the sample data that can then be divided amongst
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// CPU, event, mask axes so it is more convenient to have the
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// process and thread classes be the outermost nesting level of
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// the sample data arrays
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!want_xml) {
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		comp = numeric_compare(lt.cpu, rt.cpu);
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (comp)
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return comp < 0;
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	comp = numeric_compare(lt.tgid, rt.tgid);
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (comp)
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return comp < 0;
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	comp = numeric_compare(lt.tid, rt.tid);
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (comp)
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return comp < 0;
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	comp = numeric_compare(lt.unitmask, rt.unitmask);
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (comp)
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return comp < 0;
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (want_xml) {
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (lt.event != rt.event)
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return lt.event < rt.event;
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (lt.count != rt.count)
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return lt.count < rt.count;
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return numeric_compare(lt.cpu, rt.cpu) < 0;
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	} else {
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (lt.event == rt.event)
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return lt.count < rt.count;
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return lt.event < rt.event;
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace {
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct axis_t {
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string name;
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string suggestion;
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} axes[AXIS_MAX] = {
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{ "event", "specify event:, count: or unitmask: (see also --merge=unitmask)" },
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{ "tgid", "specify tgid: or --merge tgid" },
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{ "tid", "specify tid: or --merge tid" },
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{ "cpu", "specify cpu: or --merge cpu" },
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} // anonymous namespace
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool profile_classes::matches(profile_classes const & classes)
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (v.size() != classes.v.size())
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return false;
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	axis_types const axis2 = classes.axis;
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	switch (axis) {
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case AXIS_EVENT:
1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			break;
1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case AXIS_TGID:
1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case AXIS_TID:
1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return axis2 == AXIS_TID || axis2 == AXIS_TGID;
1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case AXIS_CPU:
1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return axis2 == AXIS_CPU;
1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case AXIS_MAX:
1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return false;
1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// check that the events match (same event, count)
1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<profile_class>::const_iterator it1 = v.begin();
1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<profile_class>::const_iterator end1 = v.end();
1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<profile_class>::const_iterator it2 = classes.v.begin();
1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	while (it1 != end1) {
1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (it1->ptemplate.event != it2->ptemplate.event)
1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return false;
1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (it1->ptemplate.count != it2->ptemplate.count)
1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return false;
1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// differing unit mask is considered comparable
1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		++it1;
1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		++it2;
1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return true;
1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace {
1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtypedef growable_vector<string> event_array_t;
1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtypedef growable_vector<string>::size_type event_index_t;
1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool new_event_index(string event, event_array_t & events, event_index_t & index)
1608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_index_t sz = events.size();
1628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (event_index_t i = 0; i != sz; ++i) {
1638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (events[i] == event) {
1648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			index = i;
1658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return false;
1668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
1678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	index = sz;
1708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	events[sz] = event;
1718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return true;
1728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// We have more than one axis of classification, tell the user.
1768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid report_error(profile_classes const & classes, axis_types newaxis)
1778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string str = "Already displaying results for parameter ";
1798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	str += axes[classes.axis].name;
1808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	str += " with values:\n";
1818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<profile_class>::const_iterator it = classes.v.begin();
1828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<profile_class>::const_iterator const end = classes.v.end();
1838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// We show error for the first conflicting axis but on this
1858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// axis we can get only a few different it->name, we display only
1868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// these different name.
1878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	set <string> name_seen;
1888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t i = 5;
1898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (; it != end && i; ++it) {
1908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (name_seen.find(it->name) == name_seen.end()) {
1918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			name_seen.insert(it->name);
1928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			str += it->name + ",";
1938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--i;
1948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
1958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!i) {
1988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		str += " and ";
1998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		str += op_lexical_cast<string>(classes.v.size() - 5);
2008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		str += " more,";
2018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	str += "\nwhich conflicts with parameter ";
2048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	str += axes[newaxis].name += ".\n";
2058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	str += "Suggestion: ";
2068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	str += axes[classes.axis].suggestion;
2078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	throw op_fatal_error(str);
2088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
2128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * check that two different axes are OK - this is only
2138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * allowed if they are TGID,TID and for each class,
2148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * tid == tgid
2158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
2168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool allow_axes(profile_classes const & classes, axis_types newaxis)
2178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// No previous axis - OK
2198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (classes.axis == AXIS_MAX)
2208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return true;
2218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (classes.axis != AXIS_TID && classes.axis != AXIS_TGID)
2238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return false;
2248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (newaxis != AXIS_TID && newaxis != AXIS_TGID)
2268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return false;
2278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<profile_class>::const_iterator it = classes.v.begin();
2298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<profile_class>::const_iterator const end = classes.v.end();
2308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (; it != end; ++it) {
2328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (it->ptemplate.tgid != it->ptemplate.tid)
2338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return false;
2348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return true;
2378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// find the first sample file header in the class
2418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddopd_header const get_first_header(profile_class const & pclass)
2428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_set const & profile = *(pclass.profiles.begin());
2448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string file;
2468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// could be only one main app, with no samples for the main image
2488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (profile.files.empty()) {
2498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		profile_dep_set const & dep = *(profile.deps.begin());
2508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		list<profile_sample_files> const & files = dep.files;
2518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		profile_sample_files const & sample_files = *(files.begin());
2528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!sample_files.sample_filename.empty())
2538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			file = sample_files.sample_filename;
2548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
2558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			file = *sample_files.cg_files.begin();
2568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	} else {
2578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		profile_sample_files const & sample_files
2588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			= *(profile.files.begin());
2598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!sample_files.sample_filename.empty())
2608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			file = sample_files.sample_filename;
2618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
2628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			file = *sample_files.cg_files.begin();
2638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return read_header(file);
2668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// merge sample file header in the profile_sample_files
2698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid merge_header(profile_sample_files const & files, opd_header & header)
2708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!files.sample_filename.empty()) {
2728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		opd_header const temp = read_header(files.sample_filename);
2738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header.ctr_um |=  temp.ctr_um;
2748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<string>::const_iterator it = files.cg_files.begin();
2778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<string>::const_iterator const end = files.cg_files.end();
2788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for ( ; it != end; ++it) {
2798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		opd_header const temp = read_header(*it);
2808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header.ctr_um |= temp.ctr_um;
2818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// merge sample file header in the class
2858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddopd_header const get_header(profile_class const & pclass,
2868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                            merge_option const & merge_by)
2878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	opd_header header = get_first_header(pclass);
2898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!merge_by.unitmask)
2918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return header;
2928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_set const & profile = *(pclass.profiles.begin());
2948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	typedef list<profile_sample_files>::const_iterator citerator;
2968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	citerator it = profile.files.begin();
2988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	citerator const end = profile.files.end();
2998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for ( ; it != end; ++it)
3008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		merge_header(*it, header);
3018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_dep_set>::const_iterator dep_it = profile.deps.begin();
3038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_dep_set>::const_iterator dep_end = profile.deps.end();
3048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for ( ; dep_it != dep_end; ++dep_it) {
3058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		citerator it = dep_it->files.begin();
3068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		citerator const end = dep_it->files.end();
3078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		for ( ; it != end; ++it)
3088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			merge_header(*it, header);
3098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
3108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return header;
3128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
3138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// Give human-readable names to each class.
3168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid name_classes(profile_classes & classes, merge_option const & merge_by)
3178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	opd_header header = get_header(classes.v[0], merge_by);
3198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	classes.event = describe_header(header);
3218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	classes.cpuinfo = describe_cpu(header);
3228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// If we're splitting on event anyway, clear out the
3248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// global event name
3258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (classes.axis == AXIS_EVENT)
3268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		classes.event.erase();
3278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<profile_class>::iterator it = classes.v.begin();
3298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<profile_class>::iterator const end = classes.v.end();
3308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (; it != end; ++it) {
3328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		it->name = axes[classes.axis].name + ":";
3338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		switch (classes.axis) {
3348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case AXIS_EVENT:
3358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			it->name = it->ptemplate.event
3368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				+ ":" + it->ptemplate.count;
3378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			header = get_header(*it, merge_by);
3388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			it->longname = describe_header(header);
3398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			break;
3408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case AXIS_TGID:
3418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			it->name += it->ptemplate.tgid;
3428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			it->longname = "Processes with a thread group ID of ";
3438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			it->longname += it->ptemplate.tgid;
3448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			break;
3458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case AXIS_TID:
3468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			it->name += it->ptemplate.tid;
3478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			it->longname = "Processes with a thread ID of ";
3488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			it->longname += it->ptemplate.tid;
3498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			break;
3508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case AXIS_CPU:
3518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			it->name += it->ptemplate.cpu;
3528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			it->longname = "Samples on CPU " + it->ptemplate.cpu;
3538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			break;
3548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case AXIS_MAX:;
3558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
3568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
3578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
3588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
3618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Name and verify classes.
3628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
3638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid identify_classes(profile_classes & classes,
3648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                      merge_option const & merge_by)
3658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_template & ptemplate = classes.v[0].ptemplate;
3678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool changed[AXIS_MAX] = { false, };
3688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<profile_class>::iterator it = classes.v.begin();
3708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	++it;
3718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<profile_class>::iterator end = classes.v.end();
3728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// only one class, name it after the event
3748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (it == end)
3758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		changed[AXIS_EVENT] = true;
3768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (; it != end; ++it) {
3788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (it->ptemplate.event != ptemplate.event
3798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		    ||  it->ptemplate.count != ptemplate.count
3808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		    // unit mask are mergeable
3818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		    || (!merge_by.unitmask
3828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			&& it->ptemplate.unitmask != ptemplate.unitmask))
3838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			changed[AXIS_EVENT] = true;
3848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// we need the merge checks here because each
3868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// template is filled in from the first non
3878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// matching profile, so just because they differ
3888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// doesn't mean it's the axis we care about
3898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!merge_by.tgid && it->ptemplate.tgid != ptemplate.tgid)
3908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			changed[AXIS_TGID] = true;
3918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!merge_by.tid && it->ptemplate.tid != ptemplate.tid)
3938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			changed[AXIS_TID] = true;
3948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!merge_by.cpu && it->ptemplate.cpu != ptemplate.cpu)
3968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			changed[AXIS_CPU] = true;
3978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
3988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	classes.axis = AXIS_MAX;
4008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (size_t i = 0; i < AXIS_MAX; ++i) {
4028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!changed[i])
4038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			continue;
4048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!allow_axes(classes, axis_types(i)))
4068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			report_error(classes, axis_types(i));
4078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		classes.axis = axis_types(i);
4088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/* do this early for report_error */
4098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		name_classes(classes, merge_by);
4108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
4118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (classes.axis == AXIS_MAX) {
4138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		cerr << "Internal error - no equivalence class axis" << endl;
4148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		abort();
4158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
4168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
4178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid identify_xml_classes(profile_classes & classes, merge_option const & merge_by)
4198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
4208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	opd_header header = get_header(classes.v[0], merge_by);
4218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<profile_class>::iterator it = classes.v.begin();
4238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<profile_class>::iterator end = classes.v.end();
4248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_index_t event_num;
4268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_index_t event_max = 0;
4278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_array_t event_array;
4288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t nr_cpus = 0;
4298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool has_nonzero_mask = false;
4308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ostringstream event_setup;
4328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// fill in XML identifying each event, and replace event name by event_num
4348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (; it != end; ++it) {
4358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		string mask = it->ptemplate.unitmask;
4368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (mask.find_first_of("x123456789abcdefABCDEF") != string::npos)
4378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			has_nonzero_mask = true;
4388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (new_event_index(it->ptemplate.event, event_array, event_num)) {
4398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			// replace it->ptemplate.event with the event_num string
4408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			// this is the first time we've seen this event
4418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			header = get_header(*it, merge_by);
4428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			event_setup << describe_header(header);
4438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			event_max = event_num;
4448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
4458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (it->ptemplate.cpu != "all") {
4468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			size_t cpu = atoi(it->ptemplate.cpu.c_str());
4478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (cpu > nr_cpus) nr_cpus = cpu;
4488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
4498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ostringstream str;
4518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		str << event_num;
4528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		it->ptemplate.event = str.str();
4538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
4548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	xml_utils::set_nr_cpus(++nr_cpus);
4558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	xml_utils::set_nr_events(event_max+1);
4568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (has_nonzero_mask)
4578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		xml_utils::set_has_nonzero_masks();
4588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	classes.event = event_setup.str();
4598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	classes.cpuinfo = describe_cpu(header);
4608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
4618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// construct a class template from a profile
4638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_template const
4648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtemplate_from_profile(parsed_filename const & parsed,
4658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                      merge_option const & merge_by)
4668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
4678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_template ptemplate;
4688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ptemplate.event = parsed.event;
4708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ptemplate.count = parsed.count;
4718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!merge_by.unitmask)
4738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ptemplate.unitmask = parsed.unitmask;
4748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!merge_by.tgid)
4758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ptemplate.tgid = parsed.tgid;
4768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!merge_by.tid)
4778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ptemplate.tid = parsed.tid;
4788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!merge_by.cpu)
4798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ptemplate.cpu = parsed.cpu;
4808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return ptemplate;
4818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
4828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
4858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Find a matching class the sample file could go in, or generate
4868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * a new class if needed.
4878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * This is the heart of the merging and classification process.
4888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * The returned value is non-const reference but the ptemplate member
4898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * must be considered as const
4908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
4918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_class & find_class(set<profile_class> & classes,
4928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                           parsed_filename const & parsed,
4938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                           merge_option const & merge_by)
4948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
4958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_class cls;
4968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cls.ptemplate = template_from_profile(parsed, merge_by);
4978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pair<set<profile_class>::iterator, bool> ret = classes.insert(cls);
4998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return const_cast<profile_class &>(*ret.first);
5018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
5028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
5048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Sanity check : we can't overwrite sample_filename, if we abort here it means
5058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * we fail to detect that parsed sample filename for two distinct samples
5068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * filename must go in two distinct profile_sample_files. This assumption is
5078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * false for callgraph samples files so this function is only called for non cg
5088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * files.
5098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
5108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid sanitize_profile_sample_files(profile_sample_files const & sample_files,
5118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    parsed_filename const & parsed)
5128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
5138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// We can't allow to overwrite sample_filename.
5148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!sample_files.sample_filename.empty()) {
5158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ostringstream out;
5168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		out << "sanitize_profile_sample_files(): sample file "
5178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		    << "parsed twice ?\nsample_filename:\n"
5188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		    << sample_files.sample_filename << endl
5198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		    << parsed << endl;
5208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		throw op_fatal_error(out.str());
5218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
5228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
5238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
5268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Add a sample filename (either cg or non cg files) to this profile.
5278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
5288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid
5298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddadd_to_profile_sample_files(profile_sample_files & sample_files,
5308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    parsed_filename const & parsed)
5318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
5328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (parsed.cg_image.empty()) {
5338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// We can't allow to overwrite sample_filename.
5348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		sanitize_profile_sample_files(sample_files, parsed);
5358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		sample_files.sample_filename = parsed.filename;
5378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	} else {
5388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		sample_files.cg_files.push_back(parsed.filename);
5398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
5408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
5418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
5448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * we need to fix cg filename: a callgraph filename can occur before the binary
5458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * non callgraph samples filename occur so we must search.
5468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
5478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_sample_files &
5488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddfind_profile_sample_files(list<profile_sample_files> & files,
5498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			  parsed_filename const & parsed,
5508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			  extra_images const & extra)
5518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
5528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_sample_files>::iterator it;
5538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_sample_files>::iterator const end = files.end();
5548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (it = files.begin(); it != end; ++it) {
5558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!it->sample_filename.empty()) {
5568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			parsed_filename psample_filename =
5578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			  parse_filename(it->sample_filename, extra);
5588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (psample_filename.lib_image == parsed.lib_image &&
5598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			    psample_filename.image == parsed.image &&
5608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			    psample_filename.profile_spec_equal(parsed))
5618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				return *it;
5628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
5638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		list<string>::const_iterator cit;
5658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		list<string>::const_iterator const cend = it->cg_files.end();
5668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		for (cit = it->cg_files.begin(); cit != cend; ++cit) {
5678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			parsed_filename pcg_filename =
5688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				parse_filename(*cit, extra);
5698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (pcg_filename.lib_image == parsed.lib_image &&
5708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			    pcg_filename.image == parsed.image &&
5718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			    pcg_filename.profile_spec_equal(parsed))
5728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				return *it;
5738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
5748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
5758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// not found, create a new one
5778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	files.push_back(profile_sample_files());
5788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return files.back();
5798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
5808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
5838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Add a profile to particular profile set. If the new profile is
5848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * a dependent image, it gets added to the dep list, or just placed
5858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * on the normal list of profiles otherwise.
5868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
5878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid
5888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddadd_to_profile_set(profile_set & set, parsed_filename const & parsed,
5898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		   bool merge_by_lib, extra_images const & extra)
5908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
5918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (parsed.image == parsed.lib_image && !merge_by_lib) {
5928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		profile_sample_files & sample_files =
5938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			find_profile_sample_files(set.files, parsed, extra);
5948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		add_to_profile_sample_files(sample_files, parsed);
5958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
5968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
5978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_dep_set>::iterator it = set.deps.begin();
5998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_dep_set>::iterator const end = set.deps.end();
6008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (; it != end; ++it) {
6028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (it->lib_image == parsed.lib_image && !merge_by_lib &&
6038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				parsed.jit_dumpfile_exists == false) {
6048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			profile_sample_files & sample_files =
6058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				find_profile_sample_files(it->files, parsed,
6068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd							  extra);
6078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			add_to_profile_sample_files(sample_files, parsed);
6088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return;
6098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
6108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
6118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_dep_set depset;
6138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	depset.lib_image = parsed.lib_image;
6148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_sample_files & sample_files =
6158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		find_profile_sample_files(depset.files, parsed, extra);
6168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	add_to_profile_sample_files(sample_files, parsed);
6178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	set.deps.push_back(depset);
6188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
6198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
6228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Add a profile to a particular equivalence class. The previous matching
6238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * will have ensured the profile "fits", so now it's just a matter of
6248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * finding which sample file list it needs to go on.
6258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
6268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid add_profile(profile_class & pclass, parsed_filename const & parsed,
6278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		 bool merge_by_lib, extra_images const & extra)
6288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
6298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_set>::iterator it = pclass.profiles.begin();
6308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_set>::iterator const end = pclass.profiles.end();
6318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (; it != end; ++it) {
6338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (it->image == parsed.image) {
6348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			add_to_profile_set(*it, parsed, merge_by_lib, extra);
6358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return;
6368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
6378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
6388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_set set;
6408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	set.image = parsed.image;
6418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	add_to_profile_set(set, parsed, merge_by_lib, extra);
6428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pclass.profiles.push_back(set);
6438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
6448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}  // anon namespace
6468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_classes const
6498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddarrange_profiles(list<string> const & files, merge_option const & merge_by,
6508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		 extra_images const & extra)
6518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
6528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	set<profile_class> temp_classes;
6538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<string>::const_iterator it = files.begin();
6558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<string>::const_iterator const end = files.end();
6568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (; it != end; ++it) {
6588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		parsed_filename parsed = parse_filename(*it, extra);
6598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (parsed.lib_image.empty())
6618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			parsed.lib_image = parsed.image;
6628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// This simplifies the add of the profile later,
6648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// if we're lib-merging, then the app_image cannot
6658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// matter. After this, any non-dependent has
6668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// image == lib_image
6678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (merge_by.lib)
6688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			parsed.image = parsed.lib_image;
6698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		profile_class & pclass =
6718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			find_class(temp_classes, parsed, merge_by);
6728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		add_profile(pclass, parsed, merge_by.lib, extra);
6738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
6748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_classes classes;
6768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	copy(temp_classes.begin(), temp_classes.end(),
6778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	     back_inserter(classes.v));
6788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (classes.v.empty())
6808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return classes;
6818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// sort by template for nicely ordered columns
6838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	stable_sort(classes.v.begin(), classes.v.end());
6848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (want_xml)
6868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		identify_xml_classes(classes, merge_by);
6878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
6888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		identify_classes(classes, merge_by);
6898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	classes.extra_found_images = extra;
6918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return classes;
6938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
6948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddostream & operator<<(ostream & out, profile_sample_files const & sample_files)
6978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
6988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	out << "sample_filename: " << sample_files.sample_filename << endl;
6998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	out << "callgraph filenames:\n";
7008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	copy(sample_files.cg_files.begin(), sample_files.cg_files.end(),
7018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	     ostream_iterator<string>(out, "\n"));
7028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return out;
7038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
7048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddostream & operator<<(ostream & out, profile_dep_set const & pdep_set)
7068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
7078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	out << "lib_image: " << pdep_set.lib_image << endl;
7088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_sample_files>::const_iterator it;
7108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_sample_files>::const_iterator const end =
7118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		pdep_set.files.end();
7128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t i = 0;
7138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (it = pdep_set.files.begin(); it != end; ++it)
7148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		out << "profile_sample_files #" << i++ << ":\n" << *it;
7158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return out;
7178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
7188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddostream & operator<<(ostream & out, profile_set const & pset)
7208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
7218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	out << "image: " << pset.image << endl;
7228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_sample_files>::const_iterator it;
7248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_sample_files>::const_iterator const end =
7258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		pset.files.end();
7268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t i = 0;
7278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (it = pset.files.begin(); it != end; ++it)
7288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		out << "profile_sample_files #" << i++ << ":\n" << *it;
7298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_dep_set>::const_iterator cit;
7318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_dep_set>::const_iterator const cend = pset.deps.end();
7328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	i = 0;
7338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (cit = pset.deps.begin(); cit != cend; ++cit)
7348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		out << "profile_dep_set #" << i++ << ":\n" << *cit;
7358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return out;
7378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
7388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddostream & operator<<(ostream & out, profile_template const & ptemplate)
7408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
7418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	out << "event: " << ptemplate.event << endl
7428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    << "count: " << ptemplate.count << endl
7438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    << "unitmask: " << ptemplate.unitmask << endl
7448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    << "tgid: " << ptemplate.tgid << endl
7458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    << "tid: " << ptemplate.tid << endl
7468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    << "cpu: " << ptemplate.cpu << endl;
7478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return out;
7488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
7498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddostream & operator<<(ostream & out, profile_class const & pclass)
7518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
7528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	out << "name: " << pclass.name << endl
7538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    << "longname: " << pclass.longname << endl
7548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    << "ptemplate:\n" << pclass.ptemplate;
7558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t i = 0;
7578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_set>::const_iterator it;
7588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<profile_set>::const_iterator const end = pclass.profiles.end();
7598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (it = pclass.profiles.begin(); it != end; ++it)
7608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		out << "profiles_set #" << i++ << ":\n" << *it;
7618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return out;
7638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
7648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddostream & operator<<(ostream & out, profile_classes const & pclasses)
7668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
7678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	out << "event: " << pclasses.event << endl
7688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    << "cpuinfo: " << pclasses.cpuinfo << endl;
7698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (size_t i = 0; i < pclasses.v.size(); ++i)
7718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		out << "class #" << i << ":\n" << pclasses.v[i];
7728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return out;
7748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
7758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace {
7788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// add the files to group of image sets
7808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid add_to_group(image_group_set & group, string const & app_image,
7818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                  list<profile_sample_files> const & files)
7828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
7838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	image_set set;
7848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	set.app_image = app_image;
7858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	set.files = files;
7868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	group.push_back(set);
7878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
7888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtypedef map<string, inverted_profile> app_map_t;
7918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddinverted_profile &
7948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddget_iprofile(app_map_t & app_map, string const & image, size_t nr_classes)
7958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
7968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	app_map_t::iterator ait = app_map.find(image);
7978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (ait != app_map.end())
7988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return ait->second;
7998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	inverted_profile ip;
8018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ip.image = image;
8028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ip.groups.resize(nr_classes);
8038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	app_map[image] = ip;
8048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return app_map[image];
8058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
8068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// Pull out all the images, removing any we can't access.
8098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid
8108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddverify_and_fill(app_map_t & app_map, list<inverted_profile> & plist,
8118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		extra_images const & extra)
8128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
8138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	app_map_t::iterator it = app_map.begin();
8148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	app_map_t::iterator const end = app_map.end();
8158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (; it != end; ++it) {
8178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		plist.push_back(it->second);
8188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		inverted_profile & ip = plist.back();
8198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		extra.find_image_path(ip.image, ip.error, false);
8208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
8218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
8228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} // anon namespace
8248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddlist<inverted_profile> const
8278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddinvert_profiles(profile_classes const & classes)
8288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
8298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	app_map_t app_map;
8308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t nr_classes = classes.v.size();
8328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (size_t i = 0; i < nr_classes; ++i) {
8348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		list<profile_set>::const_iterator pit
8358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			= classes.v[i].profiles.begin();
8368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		list<profile_set>::const_iterator pend
8378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			= classes.v[i].profiles.end();
8388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		for (; pit != pend; ++pit) {
8408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			// files can be empty if samples for a lib image
8418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			// but none for the main image. Deal with it here
8428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			// rather than later.
8438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (pit->files.size()) {
8448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				inverted_profile & ip = get_iprofile(app_map,
8458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					pit->image, nr_classes);
8468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				add_to_group(ip.groups[i], pit->image, pit->files);
8478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			}
8488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			list<profile_dep_set>::const_iterator dit
8508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				= pit->deps.begin();
8518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			list<profile_dep_set>::const_iterator const dend
8528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				= pit->deps.end();
8538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			for (;  dit != dend; ++dit) {
8558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				inverted_profile & ip = get_iprofile(app_map,
8568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					dit->lib_image, nr_classes);
8578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				add_to_group(ip.groups[i], pit->image,
8588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				             dit->files);
8598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			}
8608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
8618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
8628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<inverted_profile> inverted_list;
8648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	verify_and_fill(app_map, inverted_list, classes.extra_found_images);
8668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return inverted_list;
8688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
869