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