populate.cpp revision 8cfa702f803c5ef6a2b062a489a1b2cf66b45b5e
18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/** 28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file populate.cpp 38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Fill up a profile_container from inverted profiles 48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2003 OProfile authors 68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING 78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon 98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie 108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Modified by Maynard Johnson <maynardj@us.ibm.com> 128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * (C) Copyright IBM Corporation 2007 138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "profile.h" 168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "profile_container.h" 178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "arrange_profiles.h" 188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_bfd.h" 198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_header.h" 208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "populate.h" 218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "populate_for_spu.h" 228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "image_errors.h" 248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <iostream> 268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddusing namespace std; 288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace { 308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// load merged files for one set of sample files 328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool 338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpopulate_from_files(profile_t & profile, op_bfd const & abfd, 348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd list<profile_sample_files> const & files) 358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd list<profile_sample_files>::const_iterator it = files.begin(); 378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd list<profile_sample_files>::const_iterator const end = files.end(); 388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool found = false; 408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // we can't handle cg files here obviously 418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd for (; it != end; ++it) { 428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // A bit ugly but we must accept silently empty sample filename 438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // since we can create a profile_sample_files for cg file only 448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // (i.e no sample to the binary) 458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (!it->sample_filename.empty()) { 468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd profile.add_sample_file(it->sample_filename); 478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd profile.set_offset(abfd); 488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd found = true; 498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return found; 538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} // anon namespace 568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid 598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpopulate_for_image(profile_container & samples, inverted_profile const & ip, 608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string_filter const & symbol_filter, bool * has_debug_info) 618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (is_spu_profile(ip)) { 638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd populate_for_spu_image(samples, ip, symbol_filter, 648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd has_debug_info); 658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return; 668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool ok = ip.error == image_ok; 698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd op_bfd abfd(ip.image, symbol_filter, 708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples.extra_found_images, ok); 718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (!ok && ip.error == image_ok) 728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd ip.error = image_format_failure; 738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (ip.error == image_format_failure) 758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd report_image_error(ip, false, samples.extra_found_images); 768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd opd_header header; 788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool found = false; 808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd for (size_t i = 0; i < ip.groups.size(); ++i) { 818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd list<image_set>::const_iterator it 828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd = ip.groups[i].begin(); 838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd list<image_set>::const_iterator const end 848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd = ip.groups[i].end(); 858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // we can only share a profile_t amongst each 878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // image_set's files - this is because it->app_image 888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // changes, and the .add() would mis-attribute 898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // to the wrong app_image otherwise 908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd for (; it != end; ++it) { 918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd profile_t profile; 928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (populate_from_files(profile, abfd, it->files)) { 938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd header = profile.get_header(); 948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples.add(profile, abfd, it->app_image, i); 958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd found = true; 968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (found == true && ip.error == image_ok) { 1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd image_error error; 1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string filename = 1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd samples.extra_found_images.find_image_path( 1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd ip.image, error, true); 1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd check_mtime(filename, header); 1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (has_debug_info) 1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *has_debug_info = abfd.has_debug_info(); 1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 111