Update of /cvsroot/oprofile/oprofile/libpp In directory sc8-pr-cvs1:/tmp/cvs-serv8126/libpp Modified Files: Tag: pp-interface-branch locate_images.cpp locate_images.h partition_files.cpp profile_container.cpp profile_spec.cpp profile_spec.h Log Message: Handle relative image in profile specs as stated in PP3.7 Index: locate_images.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/Attic/locate_images.cpp,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -p -d -r1.1.2.1 -r1.1.2.2 --- locate_images.cpp 7 May 2003 03:13:10 -0000 1.1.2.1 +++ locate_images.cpp 11 May 2003 18:33:27 -0000 1.1.2.2 @@ -15,7 +15,6 @@ #include <iostream> #include <sstream> #include <cstdlib> -#include <cerrno> using namespace std; @@ -25,8 +24,9 @@ void extra_images::populate(vector<strin vector<string>::const_iterator cit = paths.begin(); vector<string>::const_iterator end = paths.end(); for (; cit != end; ++cit) { + string const path = relative_to_absolute_path(*cit); list<string> file_list; - create_file_list(file_list, *cit, "*", true); + create_file_list(file_list, path, "*", true); list<string>::const_iterator lit = file_list.begin(); list<string>::const_iterator lend = file_list.end(); for (; lit != lend; ++lit) { @@ -92,39 +92,24 @@ public: /** * @param extra_images container where all candidate filename are stored * @param image_name binary image name - * @param samples_filename samples filename * * helper for find_image_path either return image name on success or an empty * string, output also a warning if we failt to retrieve the image name. All * this handling is special for 2.5/2.6 module where daemon are no way to know * full path name of module */ -string const find_module_path(extra_images const & extra_images, - string const & module_name, - string const & samples_filename) +string const find_module_path(string const & module_name, + extra_images const & extra_images) { vector<string> result = extra_images.find(module_matcher(module_name)); if (result.empty()) { - static bool first_warn = true; - if (first_warn) { - cerr << "I can't locate some binary image files, all\n" - << "of these files will be ignored in statistics" - << endl - << "Have you provided the right -p option ?" - << endl; - first_warn = false; - } - - cerr << "warning: can't locate image file for samples files : " - << samples_filename << endl; - return string(); } if (result.size() > 1) { - cerr << "The image name " << samples_filename + cerr << "The image name " << module_name << " matches more than one filename." << endl; cerr << "I have used " << result[0] << endl; } @@ -135,37 +120,29 @@ string const find_module_path(extra_imag } // anon namespace -string const find_image_path(extra_images const & extra_images, - string const & image_name, - string const & samples_filename) +string const find_image_path(string const & image_name, + extra_images const & extra_images) { + string const image = relative_to_absolute_path(image_name); + // simplest case - if (op_file_readable(image_name)) - return image_name; + if (op_file_readable(image)) + return image; - if (errno == EACCES) { - static bool first_warn = true; - if (first_warn) { - cerr << "You do not have read access to some binary " - << "images, all\nof these files will be ignored " - << "in the results.\n"; - first_warn = false; - } - cerr << "access denied for : " << image_name << endl; + if (errno == EACCES) + return image; - return string(); - } + string const base = basename(image); - vector<string> result = extra_images.find(basename(image_name)); + vector<string> result = extra_images.find(base); // not found, try a module search if (result.empty()) { - return find_module_path(extra_images, - basename(image_name) + ".ko", samples_filename); + return find_module_path(base + ".ko", extra_images); } if (result.size() > 1) { - cerr << "The image name " << samples_filename + cerr << "The image name " << image_name << " matches more than one filename, " << "and will be ignored." << endl; return string(); Index: locate_images.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/Attic/locate_images.h,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -p -d -r1.1.2.1 -r1.1.2.2 --- locate_images.h 7 May 2003 03:13:09 -0000 1.1.2.1 +++ locate_images.h 11 May 2003 18:33:27 -0000 1.1.2.2 @@ -61,15 +61,12 @@ private: /** * @param extra_images container where all extra candidate filenames are stored * @param image_name binary image name - * @param samples_filename sample file path, used for warnings only * * Locate a (number of) matching absolute paths to the given image name. * We return an empty vector if nothing could be found to match. * If we fail to find the file or if it is not readable we provide a warning * and return an empty string. */ -std::string const find_image_path(extra_images const & extra_images, - std::string const & image_name, - std::string const & samples_filename); - +std::string const find_image_path(std::string const & image_name, + extra_images const & extra_images); #endif /* LOCATE_IMAGES_H */ Index: partition_files.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/Attic/partition_files.cpp,v retrieving revision 1.1.2.10 retrieving revision 1.1.2.11 diff -u -p -d -r1.1.2.10 -r1.1.2.11 --- partition_files.cpp 11 May 2003 14:35:03 -0000 1.1.2.10 +++ partition_files.cpp 11 May 2003 18:33:27 -0000 1.1.2.11 @@ -171,6 +171,44 @@ partition_files::filename_set const & pa } +namespace { + +struct handle_insert { + handle_insert(image_set & o, extra_images const & e) + : out(o), extra(e) {} + + void operator()(split_sample_filename const & profile) { + string const image_name = profile.lib_image.empty() + ? profile.image : profile.lib_image; + + string const found_name = find_image_path(image_name, extra); + + if (found_name.empty()) { + static bool warned_already; + cerr << "Couldn't find the binary file " << image_name + << endl; + if (!warned_already) { + cerr << "Try adding a search path with the " + << "-p option." << endl; + warned_already = true; + } + } else if (!op_file_readable(found_name)) { + cerr << "Couldn't read the binary file " << image_name + << endl; + } else { + image_set::value_type value(found_name, profile); + out.insert(value); + } + } + +private: + image_set & out; + extra_images const & extra; +}; + +} + + image_set sort_by_image(partition_files const & files, extra_images const & extra_images) { @@ -179,22 +217,8 @@ image_set sort_by_image(partition_files for (size_t i = 0 ; i < files.nr_set(); ++i) { partition_files::filename_set const & file_set = files.set(i); - partition_files::filename_set::const_iterator it; - for (it = file_set.begin(); it != file_set.end(); ++it) { - string image_name = it->lib_image.empty() ? - it->image : it->lib_image; - - // if the image files does not exist try to retrieve it - image_name = find_image_path(extra_images, - image_name, it->sample_filename); - - // no need to warn if image_name is not readable - // check_image_name() already do that - if (op_file_readable(image_name)) { - image_set::value_type value(image_name, *it); - result.insert(value); - } - } + for_each(file_set.begin(), file_set.end(), + handle_insert(result, extra_images)); } return result; Index: profile_container.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/Attic/profile_container.cpp,v retrieving revision 1.1.2.22 retrieving revision 1.1.2.23 diff -u -p -d -r1.1.2.22 -r1.1.2.23 --- profile_container.cpp 11 May 2003 16:11:16 -0000 1.1.2.22 +++ profile_container.cpp 11 May 2003 18:33:27 -0000 1.1.2.23 @@ -71,8 +71,7 @@ profile_container::~profile_container() // the range of sample_entry inside each symbol entry are valid // the samples_by_file_loc member var is correctly setup. void profile_container::add(profile_t const & profile, - op_bfd const & abfd, - string const & app_name) + op_bfd const & abfd, string const & app_name) { string const image_name = abfd.get_filename(); @@ -229,10 +228,8 @@ vector<string> const profile_container:: = file_by_samples.end(); for (; cit != cend; ++cit) { - filename_by_samples const & s = *cit; - - if (s.percent >= threshold) - result.push_back(s.filename); + if (cit->percent >= threshold) + result.push_back(cit->filename); } return result; @@ -312,4 +309,3 @@ sample_container::samples_iterator profi { return samples->end(); } - Index: profile_spec.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/Attic/profile_spec.cpp,v retrieving revision 1.1.2.2 retrieving revision 1.1.2.3 diff -u -p -d -r1.1.2.2 -r1.1.2.3 --- profile_spec.cpp 8 May 2003 19:54:54 -0000 1.1.2.2 +++ profile_spec.cpp 11 May 2003 18:33:27 -0000 1.1.2.3 @@ -19,15 +19,41 @@ #include "profile_spec.h" #include "string_manip.h" #include "glob_filter.h" - +#include "locate_images.h" using namespace std; +namespace { -profile_spec::profile_spec() +// PP:3.7, full path, or relative path. If we can't find it, +// we should maintain the original to maintain the wordexp etc. +string const fixup_image_spec(string const & str, extra_images const & extra) +{ + string const image = find_image_path(str, extra); + if (image.empty()) + return str; + return image; +} + + +void fixup_image_spec(vector<string> & images, extra_images const & extra) +{ + vector<string>::iterator it = images.begin(); + vector<string>::iterator const end = images.end(); + + for (; it != end; ++it) { + *it = fixup_image_spec(*it, extra); + } +} + +} + + +profile_spec::profile_spec(extra_images const & extra) : normal_tag_set(false), - sample_file_set(false) + sample_file_set(false), + extra(extra) { parse_table["sample-file"] = &profile_spec::parse_sample_file; parse_table["binary"] = &profile_spec::parse_binary; @@ -91,7 +117,7 @@ void profile_spec::validate() void profile_spec::set_image_or_lib_name(string const & str) { normal_tag_set = true; - image_or_lib_image.push_back(str); + image_or_lib_image.push_back(fixup_image_spec(str, extra)); } @@ -126,6 +152,7 @@ void profile_spec::parse_image(string co { normal_tag_set = true; separate_token(image, str, ','); + fixup_image_spec(image, extra); } @@ -140,6 +167,7 @@ void profile_spec::parse_lib_image(strin { normal_tag_set = true; separate_token(lib_image, str, ','); + fixup_image_spec(image, extra); } @@ -225,9 +253,13 @@ bool profile_spec::match(string const & // PP:3.19 if (!image_or_lib_image.empty()) { + // Need the path search for the benefit of modules + // which have "/oprofile" or similar + string simage = find_image_path(spec.image, extra); + string slib_image = find_image_path(spec.lib_image, extra); glob_filter f_1(image_or_lib_image, image_exclude); glob_filter f_2(image_or_lib_image, lib_image_exclude); - if (f_1.match(spec.image) || f_2.match(spec.lib_image)) { + if (f_1.match(simage) || f_2.match(slib_image)) { matched_by_image_or_lib_image = true; } } @@ -295,9 +327,10 @@ static bool substitute_alias(profile_spe } -profile_spec profile_spec::create(vector<string> const & args) +profile_spec profile_spec::create(vector<string> const & args, + extra_images const & extra) { - profile_spec spec; + profile_spec spec(extra); for (size_t i = 0 ; i < args.size() ; ++i) { if (spec.is_valid_tag(args[i])) { Index: profile_spec.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/Attic/profile_spec.h,v retrieving revision 1.1.2.2 retrieving revision 1.1.2.3 diff -u -p -d -r1.1.2.2 -r1.1.2.3 --- profile_spec.h 8 May 2003 19:54:54 -0000 1.1.2.2 +++ profile_spec.h 11 May 2003 18:33:27 -0000 1.1.2.3 @@ -19,6 +19,8 @@ #include "filename_spec.h" #include "comma_list.h" +class extra_images; + /** * Holds a parsed profile spec composed of tag:value pairs, as given in * pp_interface documentation. @@ -37,7 +39,8 @@ public: * substitution, non-valid tag:value options are considered * as image:value */ - static profile_spec create(std::vector<std::string> const & args); + static profile_spec create(std::vector<std::string> const & args, + extra_images const & extra); /** * @param include_dependent whether to include dependent @@ -56,7 +59,7 @@ public: bool match(std::string const & filename) const; private: - profile_spec(); + profile_spec(extra_images const & extra); /** * @param tag_value a "tag:value" to interpret, all error throw an @@ -139,6 +142,8 @@ private: bool normal_tag_set; /// true if sample-file: tag has been seen bool sample_file_set; + /// extra search path for images + extra_images const & extra; }; #endif /* !PROFILE_SPEC_H */ |