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