From: John L. <mov...@us...> - 2002-06-04 16:47:11
|
Update of /cvsroot/oprofile/oprofile/pp In directory usw-pr-cvs1:/tmp/cvs-serv18227/pp Modified Files: Makefile.in op_bfd.cpp op_bfd.h op_time.cpp op_to_source.cpp oprofpp.cpp oprofpp.h oprofpp_util.cpp samples_file.cpp samples_file.h Log Message: More refactoring (start libop++) Index: Makefile.in =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/Makefile.in,v retrieving revision 1.54 retrieving revision 1.55 diff -u -d -r1.54 -r1.55 --- Makefile.in 4 Jun 2002 14:27:16 -0000 1.54 +++ Makefile.in 4 Jun 2002 16:47:08 -0000 1.55 @@ -23,10 +23,10 @@ OP_MERGE_TARGET=op_merge TARGET=$(OPROFPP_TARGET) $(OP_TO_SOURCE_TARGET) $(OP_TIME_TARGET) $(OP_MERGE_TARGET) -OPROFPP_LIBS=-lopt++ -lop -lutil++ -lutil -ldb -lpopt -lbfd -liberty -ldl -OP_TO_SOURCE_LIBS=-lopt++ -lop -lutil++ -lutil -ldb -lpopt -lbfd -liberty -ldl -OP_TIME_LIBS=-lopt++ -lop -lutil++ -lutil -ldb -lpopt -lbfd -liberty -ldl -OP_MERGE_LIBS=-lopt++ -lop -lutil++ -lutil -ldb -lpopt -lbfd -liberty -ldl +OPROFPP_LIBS=-lopt++ -lop++ -lop -lutil++ -lutil -ldb -lpopt -lbfd -liberty -ldl +OP_TO_SOURCE_LIBS=-lopt++ -lop++ -lop -lutil++ -lutil -ldb -lpopt -lbfd -liberty -ldl +OP_TIME_LIBS=-lopt++ -lop++ -lop -lutil++ -lutil -ldb -lpopt -lbfd -liberty -ldl +OP_MERGE_LIBS=-lopt++ -lop++ -lop -lutil++ -lutil -ldb -lpopt -lbfd -liberty -ldl all: $(TARGET) Index: op_bfd.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/op_bfd.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- op_bfd.cpp 4 Jun 2002 14:27:16 -0000 1.11 +++ op_bfd.cpp 4 Jun 2002 16:47:08 -0000 1.12 @@ -20,7 +20,7 @@ using std::cout; using std::endl; -op_bfd::op_bfd(bool is_kernel, string const & filename) +op_bfd::op_bfd(string const & filename) : ibfd(0), bfd_syms(0), @@ -33,30 +33,6 @@ nr_samples = op_get_fsize(filename.c_str(), 0); - open_bfd_image(filename, is_kernel); -} - -op_bfd::~op_bfd() -{ - bfd_close(ibfd); - delete [] bfd_syms; -} - -/** - * open_bfd_image - op_bfd ctor helper - * @param file name of a valid image file - * @param is_kernel true if the image is the kernel or a module - * - * This function will open a bfd image and process symbols - * within this image file - * - * Failure to open the image a fatal - * gettings zero symbols from the image is not an error - */ -void op_bfd::open_bfd_image(string const & filename, bool is_kernel) -{ - char **matching; - ibfd = bfd_openr(filename.c_str(), NULL); if (!ibfd) { @@ -64,6 +40,8 @@ exit(EXIT_FAILURE); } + char ** matching; + if (!bfd_check_format_matches(ibfd, bfd_object, &matching)) { fprintf(stderr,"oprofpp: BFD format failure for %s.\n", filename.c_str()); exit(EXIT_FAILURE); @@ -72,12 +50,10 @@ /* Kernel / kernel modules are calculated as offsets against * the .text section, so they need special handling */ - if (is_kernel) { - asection *sect; - sect = bfd_get_section_by_name(ibfd, ".text"); + asection * sect = bfd_get_section_by_name(ibfd, ".text"); + if (sect) { text_offset = sect->filepos; - verbprintf("Adjusting kernel samples by 0x%x, .text filepos 0x%lx\n", - text_offset, sect->filepos); + verbprintf(".text filepos 0x%lx\n", text_offset); } get_symbols(); @@ -89,6 +65,14 @@ } } + +op_bfd::~op_bfd() +{ + bfd_close(ibfd); + delete [] bfd_syms; +} + + /** * symcomp - comparator * @@ -185,7 +169,7 @@ // now we can calculate the symbol size for (i = 0 ; i < syms.size() ; ++i) { - syms[i].symb_size = symbol_size(i); + syms[i].size(symbol_size(i)); } // we need to ensure than for a given vma only one symbol exist else @@ -424,23 +408,6 @@ } } -/** - * symbol_index - find a symbol - * @param name the symbol name - * - * find and return the index of a symbol. - * if the name is not found -1 is returned - */ -symbol_index_t op_bfd::symbol_index(char const * symbol) const -{ - for (symbol_index_t i = 0; i < syms.size(); i++) { - if (syms[i].name() == string(symbol)) - return i; - } - - return nil_symbol_index; -} - void op_bfd::get_vma_range(u32 & start, u32 & end) const { if (syms.size()) { @@ -460,9 +427,7 @@ // FIXME: prefer a bool artificial; to this ?? string symname = "?"; - char * const name = bfd_get_filename(ibfd); - if (name) - symname += name; + symname += get_filename(); op_bfd_symbol symbol(0, 0, start, 0, end - start, symname); @@ -471,5 +436,5 @@ string op_bfd::get_filename() const { - return bfd_get_filename(ibfd);; + return bfd_get_filename(ibfd); } Index: op_bfd.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/op_bfd.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- op_bfd.h 4 Jun 2002 14:27:16 -0000 1.9 +++ op_bfd.h 4 Jun 2002 16:47:08 -0000 1.10 @@ -31,7 +31,6 @@ * the symbol is an artificial symbol */ class op_bfd_symbol { - friend class op_bfd; public: op_bfd_symbol(asymbol const * a, u32 value, u32 filepos, u32 sect_vma, @@ -50,6 +49,7 @@ std::string const & name() const { return symb_name; } asymbol const * symbol() const { return bfd_symbol; } size_t size() const { return symb_size; } + void size(size_t s) { symb_size = s; } private: /// the original bfd symbol, this can be null if the symbol is an @@ -75,13 +75,11 @@ class op_bfd { public: /** - * @param is_kernel true if the image is a kernel module or a - * vmlinux file * @param filename the name of the image file * * All errors are fatal. */ - op_bfd(bool is_kernel, std::string const & filename); + op_bfd(std::string const & filename); /// close an opened bfd image and free all related resources ~op_bfd(); @@ -115,13 +113,6 @@ void get_symbol_range(symbol_index_t sym_idx, u32 & start, u32 & end) const; - /** - * @param symbol the symbol name - * - * find and return the index of a symbol else return -1 - */ - symbol_index_t symbol_index(char const * symbol) const; - /** * sym_offset - return offset from a symbol's start * @param num_symbols symbol number @@ -158,15 +149,14 @@ uint nr_samples; private: // the bfd object. - bfd *ibfd; + bfd * ibfd; // vector of symbol filled by the bfd lib. asymbol **bfd_syms; // image file such the linux kernel need than all vma are offset // by this value. u32 text_offset; - // ctor helper - void open_bfd_image(std::string const & file_name, bool is_kernel); + bool get_symbols(); /** Index: op_time.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/op_time.cpp,v retrieving revision 1.51 retrieving revision 1.52 diff -u -d -r1.51 -r1.52 --- op_time.cpp 4 Jun 2002 14:27:16 -0000 1.51 +++ op_time.cpp 4 Jun 2002 16:47:08 -0000 1.52 @@ -471,7 +471,7 @@ counter); check_mtime(samples_file, image_name); - op_bfd abfd(samples_file.is_kernel(), image_name); + op_bfd abfd(image_name); samples_file.set_start_offset(abfd.get_start_offset()); Index: op_to_source.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/op_to_source.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- op_to_source.cpp 4 Jun 2002 14:27:16 -0000 1.10 +++ op_to_source.cpp 4 Jun 2002 16:47:08 -0000 1.11 @@ -40,6 +40,7 @@ #include "string_manip.h" #include "file_manip.h" #include "filename_match.h" +#include "op_print_event.h" #include "op_events_desc.h" #include "op_to_source_options.h" @@ -739,7 +740,7 @@ check_mtime(samples_files, image_name); - op_bfd abfd(samples_files.is_kernel(), image_name); + op_bfd abfd(image_name); samples_files.set_start_offset(abfd.get_start_offset()); Index: oprofpp.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/oprofpp.cpp,v retrieving revision 1.67 retrieving revision 1.68 diff -u -d -r1.67 -r1.68 --- oprofpp.cpp 4 Jun 2002 14:27:16 -0000 1.67 +++ oprofpp.cpp 4 Jun 2002 16:47:08 -0000 1.68 @@ -216,7 +216,7 @@ opp_samples_files samples_files(sample_file, counter); check_mtime(samples_files, image_file); - op_bfd abfd(samples_files.is_kernel(), image_file); + op_bfd abfd(image_file); samples_files.set_start_offset(abfd.get_start_offset()); do_dump_gprof(abfd, samples_files, options::sort_by_counter); return 0; @@ -277,7 +277,7 @@ if (it == filelist.begin()) { check_mtime(samples_files, image_file); - op_bfd abfd(samples_files.is_kernel(), image_file); + op_bfd abfd(image_file); samples_files.set_start_offset(abfd.get_start_offset()); @@ -289,7 +289,7 @@ check_mtime(samples_files, image_file); - op_bfd abfd(samples_files.is_kernel(), demangle_filename(lib_name)); + op_bfd abfd(demangle_filename(lib_name)); samples_files.set_start_offset(abfd.get_start_offset()); samples.add(samples_files, abfd); Index: oprofpp.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/oprofpp.h,v retrieving revision 1.68 retrieving revision 1.69 diff -u -d -r1.68 -r1.69 --- oprofpp.h 4 Jun 2002 14:27:16 -0000 1.68 +++ oprofpp.h 4 Jun 2002 16:47:08 -0000 1.69 @@ -54,19 +54,6 @@ /** - * @param out output to this ostream - * @param counter_nr counter number - * @param cpu_type the cpu_type - * @param type event type - * @param um the unit mask - * @param count events count before overflow - * - * output a human readable form of an event setting - */ -void op_print_event(std::ostream & out, int counter_nr, op_cpu cpu_type, - u8 type, u8 um, u32 count); - -/** * process command line options * @param filename a filename passed on the command line, can be NULL * @param image_file where to store the image file name Index: oprofpp_util.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/oprofpp_util.cpp,v retrieving revision 1.65 retrieving revision 1.66 diff -u -d -r1.65 -r1.66 --- oprofpp_util.cpp 4 Jun 2002 14:27:16 -0000 1.65 +++ oprofpp_util.cpp 4 Jun 2002 16:47:08 -0000 1.66 @@ -40,26 +40,6 @@ using std::endl; -void op_print_event(ostream & out, int counter_nr, op_cpu cpu_type, - u8 type, u8 um, u32 count) -{ - char * typenamep; - char * typedescp; - char * umdescp; - - op_get_event_desc(cpu_type, type, um, - &typenamep, &typedescp, &umdescp); - - out << "Counter " << counter_nr << " counted " - << typenamep << " events (" << typedescp << ")"; - if (cpu_type != CPU_RTC) { - out << " with a unit mask of 0x" - << hex << setw(2) << setfill('0') << unsigned(um) << " (" - << (umdescp ? umdescp : "Not set") << ")"; - } - out << " count " << dec << count << endl; -} - /** * verbprintf */ Index: samples_file.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/samples_file.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- samples_file.cpp 16 May 2002 21:42:15 -0000 1.7 +++ samples_file.cpp 4 Jun 2002 16:47:08 -0000 1.8 @@ -18,6 +18,7 @@ #include "oprofpp.h" #include "op_events.h" #include "op_events_desc.h" +#include "op_print_event.h" using std::string; using std::cout; @@ -138,10 +139,12 @@ void opp_samples_files::set_start_offset(u32 start_offset) { + if (!first_header().is_kernel) + return; + for (uint k = 0; k < nr_counters; ++k) { - if (is_open(k)) { + if (is_open(k)) samples[k]->start_offset = start_offset; - } } } Index: samples_file.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/samples_file.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- samples_file.h 22 May 2002 03:20:34 -0000 1.9 +++ samples_file.h 4 Jun 2002 16:47:08 -0000 1.10 @@ -78,7 +78,6 @@ // function (not simple getter), make private and compile to see // what operation we need later. I've currently not a clear view // of what we need -//private: db_tree_t db_tree; /** @@ -177,12 +176,10 @@ return samples[first_file]->header(); } - /// return true if the samples file comes from the kernel or a module - bool is_kernel() const { return first_header().is_kernel; } - - /** set the start offset ofthe underlined samples files. Depending - * if the samples file is the kernel [module] or an user space - * application the start_offset is the text section filepos or zero + /** + * Set the start offset of the underlying samples files + * to non-zero (derived from the BFD) iff this contains + * the kernel or kernel module sample files. */ void set_start_offset(u32 start_offset); |