From: Philippe E. <ph...@us...> - 2003-05-02 19:49:11
|
Update of /cvsroot/oprofile/oprofile/libpp In directory sc8-pr-cvs1:/tmp/cvs-serv29385/libpp Modified Files: Tag: pp-interface-branch parse_cmdline.cpp partition_files.cpp partition_files.h profile_container.cpp profile_container.h Log Message: better error message when no sample files found. Optimize opreport/opgrpof, I'll post on mail some number about this optimization later regards, Phil Index: parse_cmdline.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/Attic/parse_cmdline.cpp,v retrieving revision 1.1.2.10 retrieving revision 1.1.2.11 diff -u -d -r1.1.2.10 -r1.1.2.11 --- parse_cmdline.cpp 1 May 2003 21:23:10 -0000 1.1.2.10 +++ parse_cmdline.cpp 2 May 2003 19:49:07 -0000 1.1.2.11 @@ -393,6 +393,8 @@ throw invalid_argument(os.str()); } + bool found_file = false; + for (size_t i = 0; i < session.size(); ++i) { if (session[i].empty()) continue; @@ -407,12 +409,22 @@ list<string> files; create_file_list(files, base_dir, "*", true); + if (!files.empty()) + found_file = true; + list<string>::const_iterator it; for (it = files.begin(); it != files.end(); ++it) { if (valid_candidate(*it, parser, include_dependent)) { unique_files.insert(*it); } } + } + + if (!found_file) { + // FIXME: must we throw ? + cerr << "No sample file found: try running opcontrol --dump\n" + << "or specify a session containing sample files" << endl; + exit(EXIT_FAILURE); } list<string> result; Index: partition_files.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/Attic/partition_files.cpp,v retrieving revision 1.1.2.6 retrieving revision 1.1.2.7 diff -u -d -r1.1.2.6 -r1.1.2.7 --- partition_files.cpp 28 Apr 2003 01:05:33 -0000 1.1.2.6 +++ partition_files.cpp 2 May 2003 19:49:07 -0000 1.1.2.7 @@ -13,6 +13,7 @@ #include <iterator> #include "cverb.h" +#include "file_manip.h" #include "partition_files.h" #include "split_sample_filename.h" @@ -167,4 +168,35 @@ advance(it, filename_partition::difference_type(index)); return *it; +} + + +image_set sort_by_image(partition_files const & files, + alt_filename_t const & alternate_filename) +{ + image_set result; + + 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 = check_image_name(alternate_filename, + 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); + } + } + } + + return result; } Index: partition_files.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/Attic/partition_files.h,v retrieving revision 1.1.2.5 retrieving revision 1.1.2.6 diff -u -d -r1.1.2.5 -r1.1.2.6 --- partition_files.h 28 Apr 2003 02:31:36 -0000 1.1.2.5 +++ partition_files.h 2 May 2003 19:49:07 -0000 1.1.2.6 @@ -15,8 +15,11 @@ #include <iostream> #include <vector> #include <list> +#include <set> +#include <map> #include "split_sample_filename.h" +#include "derive_files.h" /** * store merging options options used to partition samples filename @@ -85,5 +88,22 @@ typedef std::list<filename_set> filename_partition; filename_partition filenames; }; + + +typedef std::multimap<std::string, split_sample_filename const> image_set; + +/** + * @param files a set of sample filename to sort + * @param merge_lib true if the image name must be derived from lib name + * @param alternate_filename alternate filename set to retrieve binary file + * if needed + * + * return the same set as passed in files but sorted by image name, where + * image name will be the bfd file to open. This is to allow caller to avoid + * to bfd_open more than one time each binary image + */ +image_set sort_by_image(partition_files const & files, + alt_filename_t const & alternate_filename); + #endif /* !PARTITION_FILES_H */ Index: profile_container.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/Attic/profile_container.cpp,v retrieving revision 1.1.2.13 retrieving revision 1.1.2.14 diff -u -d -r1.1.2.13 -r1.1.2.14 --- profile_container.cpp 1 May 2003 02:46:31 -0000 1.1.2.13 +++ profile_container.cpp 2 May 2003 19:49:07 -0000 1.1.2.14 @@ -47,13 +47,13 @@ profile_container::profile_container(bool add_zero_samples_symbols_, - outsymbflag flags_, + bool debug_info_, bool need_details_) : symbols(new symbol_container), samples(new sample_container), total_count(0), - flags(flags_), + debug_info(debug_info_), add_zero_samples_symbols(add_zero_samples_symbols_), need_details(need_details_) { @@ -74,7 +74,6 @@ string const & app_name) { string const image_name = abfd.get_filename(); - bool const need_linenr = flags & osf_linenr_info; for (symbol_index_t i = 0; i < abfd.syms.size(); ++i) { @@ -97,7 +96,7 @@ symb_entry.name = abfd.syms[i].name(); - if (need_linenr && abfd.get_linenr(i, start, filename, linenr)) { + if (debug_info && abfd.get_linenr(i, start, filename, linenr)) { symb_entry.sample.file_loc.filename = filename; symb_entry.sample.file_loc.linenr = linenr; } else { @@ -131,7 +130,6 @@ string const & app_name, symbol_entry const * symbol) { - bool const need_linenr = flags & osf_linenr_info; for (u32 pos = start; pos < end ; ++pos) { string filename; @@ -142,7 +140,7 @@ if (!sample.count) continue; - if (need_linenr && sym_index != nil_symbol_index && + if (debug_info && sym_index != nil_symbol_index && abfd.get_linenr(sym_index, pos, filename, linenr)) { sample.file_loc.filename = filename; sample.file_loc.linenr = linenr; @@ -314,15 +312,12 @@ bool add_samples(profile_container & samples, string const & sample_filename, - string const & image_name, - string const & app_name, - string_filter const & symbol_filter) + op_bfd const & abfd, + string const & app_name) { profile_t profile(sample_filename); - op_bfd abfd(image_name, symbol_filter); - - profile.check_mtime(image_name); + profile.check_mtime(abfd.get_filename()); profile.set_start_offset(abfd.get_start_offset()); samples.add(profile, abfd, app_name); Index: profile_container.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/Attic/profile_container.h,v retrieving revision 1.1.2.13 retrieving revision 1.1.2.14 diff -u -d -r1.1.2.13 -r1.1.2.14 --- profile_container.h 30 Apr 2003 04:42:07 -0000 1.1.2.13 +++ profile_container.h 2 May 2003 19:49:07 -0000 1.1.2.14 @@ -37,14 +37,15 @@ * @param add_zero_samples_symbols Must we add to the symbol container * symbols with zero samples count * - * @param flags Optimize hint to add samples. The flags is a promise - * of what will be required as information in future. Avoiding the - * lookup of line number etc. greatly improves performance. + * @param debug_info Optimize hint to add samples. If true line number + * are recorded. This boolean is a promise of what will be required as + * information in future. Avoiding line number lookup greatly improves + * performance. * * @param need_details true if we need to record all samples or to * to record them at symbol level. This is an optimization hint */ - profile_container(bool add_zero_samples_symbols, outsymbflag flags, + profile_container(bool add_zero_samples_symbols, bool debug_info, bool need_details); ~profile_container(); @@ -166,7 +167,7 @@ * see the explanation in profile_container() */ //@{ - outsymbflag flags; + bool debug_info; bool add_zero_samples_symbols; bool need_details; //@} @@ -176,19 +177,17 @@ * add_samples - populate a samples container with samples * @param samples the samples container to populate * @param sample_filename samples filename - * @param binary_name the name of the binary image + * @param abfd bfd object * @param app_name the owning application of these samples, identical to binary * name if profiling session did not separate samples for shared libs or * if binary name is not a shared libs - * @param symbol_filter filter to use for symbols to add * - * open a bfd object getting symbols name, then populate samples with the - * relevant samples + * populate samples with the relevant samples getting symbols name and size + * from abfd */ bool add_samples(profile_container & samples, std::string const & sample_filename, - std::string const & binary_name, - std::string const & app_name, - string_filter const & symbol_filter); + op_bfd const & abfd, + std::string const & app_name); #endif /* !PROFILE_CONTAINER_H */ |