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