From: Philippe E. <ph...@us...> - 2004-01-04 13:54:13
|
Update of /cvsroot/oprofile/oprofile/pp In directory sc8-pr-cvs1:/tmp/cvs-serv953/pp Modified Files: Tag: BRANCH_CALLGRAPH opgprof.cpp opgprof_options.cpp opreport.cpp populate.cpp Log Message: Big. Better handling of callgraph. Only opgprof can handle callgraph but in a less ugly way than previosly. Daemon now create cross-binary call graph. Fix a cg filename filtering bug (Run this fix the invalid filename error you get). Index: opgprof.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/opgprof.cpp,v retrieving revision 1.3.2.11 retrieving revision 1.3.2.12 diff -u -p -d -r1.3.2.11 -r1.3.2.12 --- opgprof.cpp 23 Nov 2003 00:08:37 -0000 1.3.2.11 +++ opgprof.cpp 4 Jan 2004 13:54:09 -0000 1.3.2.12 @@ -152,6 +152,11 @@ void output_gprof(op_bfd const & abfd, p size_t histsize = (high_pc - low_pc) / multiplier; + // FIXME: must we skip the flat profile write if histsize == 0 ? + // (this can occur with callgraph w/o samples to the binary) but in + // this case user must gprof --no-flat-profile whiwh is a bit boring + // and result *seems* weirds. + FILE * fp = op_open_file(gmon_filename.c_str(), "w"); op_write_file(fp,&hdr, sizeof(gmon_hdr)); @@ -185,7 +190,7 @@ void output_gprof(op_bfd const & abfd, p if (pos >= histsize) { cerr << "Bogus histogram bin " << pos - << ", larger than " << pos << " !\n"; + << ", larger than " << pos << " !\n"; continue; } @@ -210,17 +215,22 @@ void output_gprof(op_bfd const & abfd, p } -void load_samples(op_bfd const & abfd, list<string> const & files, +void +load_samples(op_bfd const & abfd, list<profile_sample_files> const & files, string const & image, profile_container & samples) { - list<string>::const_iterator it = files.begin(); - list<string>::const_iterator const end = files.end(); + list<profile_sample_files>::const_iterator it = files.begin(); + list<profile_sample_files>::const_iterator const end = files.end(); for (; it != end; ++it) { + // we can get call graph w/o any samples to the binary + if (it->sample_filename.empty()) + continue; profile_t profile; - profile.add_sample_file(*it, abfd.get_start_offset()); + profile.add_sample_file(it->sample_filename, + abfd.get_start_offset()); check_mtime(abfd.get_filename(), profile.get_header()); @@ -229,10 +239,10 @@ void load_samples(op_bfd const & abfd, l } -void load_cg(profile_t & cg_db, list<string> const & files) +void load_cg(profile_t & cg_db, list<profile_sample_files> const & files) { - list<string>::const_iterator it = files.begin(); - list<string>::const_iterator const end = files.end(); + list<profile_sample_files>::const_iterator it = files.begin(); + list<profile_sample_files>::const_iterator const end = files.end(); /* the list of non cg files is a super set of the list of cg file * (module always log a samples to non-cg files before logging @@ -240,14 +250,12 @@ void load_cg(profile_t & cg_db, list<str * all existing cg files. */ for (; it != end; ++it) { - string::size_type prefixend = it->find_last_of("/"); - string const base = it->substr(0, prefixend + 1); - string const end = it->substr(prefixend + 1, string::npos); - - string const cg_file = base + "{cg}/" + end; - - if (op_file_readable(cg_file.c_str())) - cg_db.add_sample_file(cg_file, 0); + list<string>::const_iterator cit; + list<string>::const_iterator const cend = it->cg_files.end(); + for (cit = it->cg_files.begin(); cit != cend; ++cit) { + // FIXME: do we need filtering ? + cg_db.add_sample_file(*cit, 0); + } } } Index: opgprof_options.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/opgprof_options.cpp,v retrieving revision 1.2.2.5 retrieving revision 1.2.2.6 diff -u -p -d -r1.2.2.5 -r1.2.2.6 --- opgprof_options.cpp 4 Jan 2004 13:19:53 -0000 1.2.2.5 +++ opgprof_options.cpp 4 Jan 2004 13:54:09 -0000 1.2.2.6 @@ -43,7 +43,7 @@ popt::option options_array[] = { bool try_merge_profiles(profile_spec const & spec, bool exclude_dependent) { - list<string> sample_files = spec.generate_file_list(exclude_dependent, true); + list<string> sample_files = spec.generate_file_list(exclude_dependent, false); cverb << "Matched sample files: " << sample_files.size() << endl; copy(sample_files.begin(), sample_files.end(), Index: opreport.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/opreport.cpp,v retrieving revision 1.5.2.9 retrieving revision 1.5.2.10 diff -u -p -d -r1.5.2.9 -r1.5.2.10 --- opreport.cpp 8 Nov 2003 16:17:53 -0000 1.5.2.9 +++ opreport.cpp 4 Jan 2004 13:54:09 -0000 1.5.2.10 @@ -47,21 +47,29 @@ struct summary { } /// add a set of files to a summary - size_t add_files(list<string> const & files, size_t pclass); + size_t add_files(list<profile_sample_files> const & files, + size_t pclass); }; -size_t summary::add_files(list<string> const & files, size_t pclass) +size_t summary:: +add_files(list<profile_sample_files> const & files, size_t pclass) { size_t subtotal = 0; - list<string>::const_iterator it = files.begin(); - list<string>::const_iterator const end = files.end(); + list<profile_sample_files>::const_iterator it = files.begin(); + list<profile_sample_files>::const_iterator const end = files.end(); for (; it != end; ++it) { - size_t count = profile_t::sample_count(*it); + size_t count = profile_t::sample_count(it->sample_filename); counts[pclass] += count; subtotal += count; + + // FIXME: is it worth (for now yes I expect bugs ...) + if (!it->cg_files.empty()) { + throw "opreport.cpp::add_files(): unxpected non empty " + "cg file set\n"; + } } return subtotal; Index: populate.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/populate.cpp,v retrieving revision 1.2.2.3 retrieving revision 1.2.2.4 diff -u -p -d -r1.2.2.3 -r1.2.2.4 --- populate.cpp 8 Nov 2003 16:17:53 -0000 1.2.2.3 +++ populate.cpp 4 Jan 2004 13:54:09 -0000 1.2.2.4 @@ -28,13 +28,20 @@ namespace { /// load merged files for one set of sample files void -populate_from_files(profile_t & profile, list<string> const & files, u32 offset) +populate_from_files(profile_t & profile, + list<profile_sample_files> const & files, u32 offset) { - list<string>::const_iterator it = files.begin(); - list<string>::const_iterator const end = files.end(); + list<profile_sample_files>::const_iterator it = files.begin(); + list<profile_sample_files>::const_iterator const end = files.end(); - for (; it != end; ++it) - profile.add_sample_file(*it, offset); + for (; it != end; ++it) { + profile.add_sample_file(it->sample_filename, offset); + // FIXME: is it worth (for now yes I expect bugs ...) + if (!it->cg_files.empty()) { + throw "opreport.cpp::add_files(): unxpected non empty " + "cg file set\n"; + } + } } } // anon namespace |