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