18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file profile_spec.h
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Contains a PP profile specification
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2003 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef PROFILE_SPEC_H
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define PROFILE_SPEC_H
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <map>
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <vector>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <list>
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "filename_spec.h"
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "comma_list.h"
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "locate_images.h"
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Holds a parsed profile spec composed of tag:value pairs, as given in
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * pp_interface documentation.
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *  @internal implemented through a map of string, pointer to function member
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *  indexed by tag_name.
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass profile_spec
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpublic:
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param args  a vector of non options strings
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param extra extra image paths to search
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * Factory returning a profile_spec instance storing all valid
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * tag:value contained in args vector doing also alias
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * substitution, non-valid tag:value options are considered
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * as image:value
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	static profile_spec create(std::list<std::string> const & args,
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	                           std::vector<std::string> const & image_path,
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				   std::string const & root_path);
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param exclude_dependent  whether to exclude dependent sub-images
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param exclude_cg  whether to exclude call graph file
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * Use the spec to generate the list of candidate sample files.
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::list<std::string>
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	generate_file_list(bool exclude_dependent, bool exclude_cg) const;
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param file_spec  the filename specification to check
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * return true if filename match the spec. PP:3.24 internal loop
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool match(filename_spec const & file_spec) const;
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * return archive name
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * returns an empty string if not using an archive.
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string get_archive_path() const;
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprivate:
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	profile_spec();
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param tag_value  a "tag:value" to interpret, all error throw an
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * invalid_argument exception.
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void parse(std::string const & tag_value);
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param image an image or a libray name given on command line
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * Used for e.g. "opreport /bin/mybinary". We don't know yet
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * if this is an application or a dependent image.
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void set_image_or_lib_name(std::string const & image);
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param str  a "tag:value"
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * return true if tag is a valid tag
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool is_valid_tag(std::string const & str);
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * implement tag parsing: PP:3.3 to 3.16
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void parse_archive_path(std::string const &);
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void parse_session(std::string const &);
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void parse_session_exclude(std::string const &);
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void parse_image(std::string const &);
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void parse_image_exclude(std::string const &);
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void parse_lib_image(std::string const &);
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void parse_event(std::string const &);
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void parse_count(std::string const &);
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void parse_unitmask(std::string const &);
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void parse_tid(std::string const &);
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void parse_tgid(std::string const &);
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void parse_cpu(std::string const &);
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	typedef void (profile_spec::*action_t)(std::string const &);
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	typedef std::map<std::string, action_t> parse_table_t;
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	parse_table_t parse_table;
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param tag_value  input "tag:value" string
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param value  if success return the value part of tag_value
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * helper for set/is_valid_tag public interface
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * return null if tag is not valid, else return the pointer to member
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * function to apply and the value in value parameter
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	action_t get_handler(std::string const & tag_value,
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			     std::string & value);
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string archive_path;
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string binary;
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::vector<std::string> session;
1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::vector<std::string> session_exclude;
1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::vector<std::string> image;
1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::vector<std::string> image_exclude;
1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::vector<std::string> lib_image;
1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	comma_list<std::string> event;
1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	comma_list<int> count;
1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	comma_list<unsigned int> unitmask;
1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	comma_list<pid_t> tid;
1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	comma_list<pid_t> tgid;
1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	comma_list<int> cpu;
1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// specified by user on command like opreport image1 image2 ...
1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::vector<std::string> image_or_lib_image;
1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpublic: // FIXME
1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// extra search path for images
1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	extra_images extra_found_images;
1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* !PROFILE_SPEC_H */
144