18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/** 28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file opannotate_options.cpp 38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Options for opannotate 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 "profile_spec.h" 218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "arrange_profiles.h" 228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_exception.h" 238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "opannotate_options.h" 248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "popt_options.h" 258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "cverb.h" 268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddusing namespace std; 288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprofile_classes classes; 308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace options { 328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd demangle_type demangle = dmt_normal; 338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string output_dir; 348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd vector<string> search_dirs; 358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd vector<string> base_dirs; 368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd merge_option merge_by; 378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd path_filter file_filter; 388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string_filter symbol_filter; 398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool source; 408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool assembly; 418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd vector<string> objdump_params; 428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool exclude_dependent; 438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace { 478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstring include_symbols; 498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstring exclude_symbols; 508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstring include_file; 518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstring exclude_file; 528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstring demangle_option = "normal"; 538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvector<string> mergespec; 548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpopt::option options_array[] = { 568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(demangle_option, "demangle", 'D', 578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "demangle GNU C++ symbol names (default normal)", 588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "none|normal|smart"), 598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(options::output_dir, "output-dir", 'o', 608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "output directory", "directory name"), 618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(options::search_dirs, "search-dirs", 'd', 628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "directories to look for source files", "comma-separated paths"), 638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(options::base_dirs, "base-dirs", 'b', 648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "source file prefixes to strip", "comma-separated paths"), 658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(include_file, "include-file", '\0', 668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "include these comma separated filename", "filenames"), 678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(exclude_file, "exclude-file", '\0', 688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "exclude these comma separated filename", "filenames"), 698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(include_symbols, "include-symbols", 'i', 708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "include these comma separated symbols", "symbols"), 718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(exclude_symbols, "exclude-symbols", 'e', 728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "exclude these comma separated symbols", "symbols"), 738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(options::objdump_params, "objdump-params", '\0', 748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "additional params to pass to objdump", "parameters"), 758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(options::exclude_dependent, "exclude-dependent", 'x', 768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "exclude libs, kernel, and module samples for applications"), 778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(mergespec, "merge", 'm', 788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "comma separated list", "cpu,tid,tgid,unitmask,all"), 798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(options::source, "source", 's', "output source"), 808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(options::assembly, "assembly", 'a', "output assembly"), 818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd popt::option(options::threshold_opt, "threshold", 't', 828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "minimum percentage needed to produce output", 838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "percent"), 848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} // anonymous namespace 878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid handle_options(options::spec const & spec) 908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd using namespace options; 928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (spec.first.size()) { 948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd cerr << "differential profiles not allowed" << endl; 958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd exit(EXIT_FAILURE); 968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (!assembly && !source) { 998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd cerr << "you must specify at least --source or --assembly\n"; 1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd exit(EXIT_FAILURE); 1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (!objdump_params.empty() && !assembly) { 1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd cerr << "--objdump-params is meaningless without --assembly\n"; 1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd exit(EXIT_FAILURE); 1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (search_dirs.empty() && !base_dirs.empty()) { 1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd cerr << "--base-dirs is useless unless you specify an " 1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "alternative source location with --search-dirs" 1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd << endl; 1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd exit(EXIT_FAILURE); 1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (assembly && !output_dir.empty()) { 1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd cerr << "--output-dir is meaningless with --assembly" << endl; 1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd exit(EXIT_FAILURE); 1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd options::symbol_filter = string_filter(include_symbols, exclude_symbols); 1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd options::file_filter = path_filter(include_file, exclude_file); 1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd profile_spec const pspec = 1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd profile_spec::create(spec.common, options::image_path, 1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd options::root_path); 1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd list<string> sample_files = pspec.generate_file_list(exclude_dependent, true); 1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd cverb << vsfile << "Archive: " << pspec.get_archive_path() << endl; 1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd cverb << vsfile << "Matched sample files: " << sample_files.size() 1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd << endl; 1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd copy(sample_files.begin(), sample_files.end(), 1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd ostream_iterator<string>(cverb << vsfile, "\n")); 1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd demangle = handle_demangle_option(demangle_option); 1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // we always merge but this have no effect on output since at source 1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // or assembly point of view the result will be merged anyway 1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd merge_by = handle_merge_option(mergespec, false, exclude_dependent); 1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd classes = arrange_profiles(sample_files, merge_by, 1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd pspec.extra_found_images); 1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd cverb << vsfile << "profile_classes:\n" << classes << endl; 1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (classes.v.empty()) { 1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd cerr << "error: no sample files found: profile specification " 1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd "too strict ?" << endl; 1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd exit(EXIT_FAILURE); 1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 154