18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file opgprof_options.cpp
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Options for opgprof tool
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
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <cstdlib>
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <vector>
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <list>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <iterator>
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <iostream>
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <cstdlib>
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "opgprof_options.h"
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "popt_options.h"
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "cverb.h"
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "profile_spec.h"
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "arrange_profiles.h"
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddusing namespace std;
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_classes classes;
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddinverted_profile image_profile;
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace options {
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string gmon_filename = "gmon.out";
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// Ugly, for build only
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	demangle_type demangle;
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace {
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpopt::option options_array[] = {
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popt::option(options::gmon_filename, "output-filename", 'o',
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	             "output filename, defaults to gmon.out if not specified",
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	             "filename"),
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popt::option(options::threshold_opt, "threshold", 't',
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		     "minimum percentage needed to produce output",
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		     "percent"),
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool try_merge_profiles(profile_spec const & spec, bool exclude_dependent)
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<string> sample_files = spec.generate_file_list(exclude_dependent, false);
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cverb << vsfile
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      << "Matched sample files: " << sample_files.size() << endl;
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	copy(sample_files.begin(), sample_files.end(),
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	     ostream_iterator<string>(cverb << vsfile, "\n"));
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// opgprof merge all by default
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	merge_option merge_by;
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	merge_by.cpu = true;
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	merge_by.lib = true;
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	merge_by.tid = true;
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	merge_by.tgid = true;
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	merge_by.unitmask = true;
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	classes	= arrange_profiles(sample_files, merge_by,
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				   spec.extra_found_images);
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cverb << vsfile << "profile_classes:\n" << classes << endl;
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t nr_classes = classes.v.size();
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list<inverted_profile> iprofiles = invert_profiles(classes);
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (nr_classes == 1 && iprofiles.size() == 1) {
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		image_profile = *(iprofiles.begin());
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return true;
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// come round for another try
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (exclude_dependent)
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return false;
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (iprofiles.empty()) {
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		cerr << "error: no sample files found: profile specification "
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		     "too strict ?" << endl;
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (nr_classes > 1 || iprofiles.size() > 1) {
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		cerr << "error: specify exactly one binary to process "
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		     "and give an event: or count: specification if necessary"
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		     << endl;
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return false;
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}  // anonymous namespace
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid handle_options(options::spec const & spec)
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (spec.first.size()) {
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		cerr << "differential profiles not allowed" << endl;
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_spec const pspec =
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		profile_spec::create(spec.common, options::image_path,
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				     options::root_path);
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cverb << vsfile << "output filename: " << options::gmon_filename
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      << endl;
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// we do a first try with exclude-dependent if it fails we include
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// dependent. First try should catch "opgrof /usr/bin/make" whilst
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// the second catch "opgprof /lib/libc-2.2.5.so"
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!try_merge_profiles(pspec, true))
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		try_merge_profiles(pspec, false);
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
125