Home | History | Annotate | Download | only in libpp
      1 /**
      2  * @file populate.cpp
      3  * Fill up a profile_container from inverted profiles
      4  *
      5  * @remark Copyright 2003 OProfile authors
      6  * @remark Read the file COPYING
      7  *
      8  * @author John Levon
      9  * @author Philippe Elie
     10  *
     11  * Modified by Maynard Johnson <maynardj (at) us.ibm.com>
     12  * (C) Copyright IBM Corporation 2007
     13  */
     14 
     15 #include "profile.h"
     16 #include "profile_container.h"
     17 #include "arrange_profiles.h"
     18 #include "op_bfd.h"
     19 #include "op_header.h"
     20 #include "populate.h"
     21 #include "populate_for_spu.h"
     22 
     23 #include "image_errors.h"
     24 
     25 #include <iostream>
     26 
     27 using namespace std;
     28 
     29 namespace {
     30 
     31 /// load merged files for one set of sample files
     32 bool
     33 populate_from_files(profile_t & profile, op_bfd const & abfd,
     34                     list<profile_sample_files> const & files)
     35 {
     36 	list<profile_sample_files>::const_iterator it = files.begin();
     37 	list<profile_sample_files>::const_iterator const end = files.end();
     38 
     39 	bool found = false;
     40 	// we can't handle cg files here obviously
     41 	for (; it != end; ++it) {
     42 		// A bit ugly but we must accept silently empty sample filename
     43 		// since we can create a profile_sample_files for cg file only
     44 		// (i.e no sample to the binary)
     45 		if (!it->sample_filename.empty()) {
     46 			profile.add_sample_file(it->sample_filename);
     47 			profile.set_offset(abfd);
     48 			found = true;
     49 		}
     50 	}
     51 
     52 	return found;
     53 }
     54 
     55 }  // anon namespace
     56 
     57 
     58 void
     59 populate_for_image(profile_container & samples, inverted_profile const & ip,
     60 	string_filter const & symbol_filter, bool * has_debug_info)
     61 {
     62 	if (is_spu_profile(ip)) {
     63 		populate_for_spu_image(samples, ip, symbol_filter,
     64 				       has_debug_info);
     65 		return;
     66 	}
     67 
     68 	bool ok = ip.error == image_ok;
     69 	op_bfd abfd(ip.image, symbol_filter,
     70 		    samples.extra_found_images, ok);
     71 	if (!ok && ip.error == image_ok)
     72 		ip.error = image_format_failure;
     73 
     74 	if (ip.error == image_format_failure)
     75 		report_image_error(ip, false, samples.extra_found_images);
     76 
     77 	opd_header header;
     78 
     79 	bool found = false;
     80 	for (size_t i = 0; i < ip.groups.size(); ++i) {
     81 		list<image_set>::const_iterator it
     82 			= ip.groups[i].begin();
     83 		list<image_set>::const_iterator const end
     84 			= ip.groups[i].end();
     85 
     86 		// we can only share a profile_t amongst each
     87 		// image_set's files - this is because it->app_image
     88 		// changes, and the .add() would mis-attribute
     89 		// to the wrong app_image otherwise
     90 		for (; it != end; ++it) {
     91 			profile_t profile;
     92 			if (populate_from_files(profile, abfd, it->files)) {
     93 				header = profile.get_header();
     94 				samples.add(profile, abfd, it->app_image, i);
     95 				found = true;
     96 			}
     97 		}
     98 	}
     99 
    100 	if (found == true && ip.error == image_ok) {
    101 		image_error error;
    102 		string filename =
    103 			samples.extra_found_images.find_image_path(
    104 				ip.image, error, true);
    105 		check_mtime(filename, header);
    106 	}
    107 
    108 	if (has_debug_info)
    109 		*has_debug_info = abfd.has_debug_info();
    110 }
    111