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