From: hanseld <ha...@us...> - 2008-04-28 21:23:49
|
Update of /cvsroot/oprofile/oprofile/libutil++ In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv15532/libutil++ Modified Files: op_bfd.cpp op_bfd.h file_manip.cpp bfd_support.cpp bfd_support.h Log Message: JIT support (for profiling Java applications) added Index: op_bfd.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libutil++/op_bfd.cpp,v retrieving revision 1.79 retrieving revision 1.80 diff -u -p -d -r1.79 -r1.80 --- op_bfd.cpp 18 Mar 2008 02:00:08 -0000 1.79 +++ op_bfd.cpp 28 Apr 2008 21:23:25 -0000 1.80 @@ -95,7 +95,8 @@ op_bfd::op_bfd(string const & fname, str : filename(fname), archive_path(extra_images.get_archive_path()), - file_size(-1) + file_size(-1), + anon_obj(false) { int fd; struct stat st; @@ -104,6 +105,7 @@ op_bfd::op_bfd(string const & fname, str // O(N²) behavior when we will filter vector element below symbols_found_t symbols; asection const * sect; + string suf = ".jo"; image_error img_ok; string const image_path = @@ -140,6 +142,12 @@ op_bfd::op_bfd(string const & fname, str goto out_fail; } + string::size_type pos; + pos = filename.rfind(suf); + if (pos != string::npos && pos == filename.size() - suf.size()) + anon_obj = true; + + // find .text and use it for (sect = ibfd.abfd->sections; sect; sect = sect->next) { if (sect->flags & SEC_CODE) { @@ -151,6 +159,9 @@ op_bfd::op_bfd(string const & fname, str } filepos_map[sect->name] = sect->filepos; + + if (sect->vma == 0 && strcmp(sect->name, ".text")) + filtered_section.push_back(sect); } } @@ -182,11 +193,6 @@ unsigned long op_bfd::get_start_offset(b return 0; } - for (asection * sect = ibfd.abfd->sections; sect; sect = sect->next) { - if (sect->vma == vma) - return sect->filepos; - } - return 0; } @@ -205,8 +211,12 @@ void op_bfd::get_symbols(op_bfd::symbols size_t i; for (i = 0; i < ibfd.nr_syms; ++i) { - if (interesting_symbol(ibfd.syms[i])) - symbols.push_back(op_bfd_symbol(ibfd.syms[i])); + if (!interesting_symbol(ibfd.syms[i])) + continue; + if (find(filtered_section.begin(), filtered_section.end(), + ibfd.syms[i]->section) != filtered_section.end()) + continue; + symbols.push_back(op_bfd_symbol(ibfd.syms[i])); } for (i = 0; i < dbfd.nr_syms; ++i) { @@ -347,8 +357,9 @@ bool op_bfd::get_linenr(symbol_index_t s return false; bfd_info const & b = dbfd.valid() ? dbfd : ibfd; + op_bfd_symbol const & sym = syms[sym_idx]; - linenr_info const info = find_nearest_line(b, syms[sym_idx], offset); + linenr_info const info = find_nearest_line(b, sym, offset, anon_obj); if (!info.found) return false; @@ -376,7 +387,10 @@ void op_bfd::get_symbol_range(symbol_ind bool const verbose = cverb << (vbfd & vlevel1); - start = sym.filepos(); + if (anon_obj) + start = sym.vma(); + else + start = sym.filepos(); end = start + sym.size(); if (!verbose) Index: op_bfd.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/libutil++/op_bfd.h,v retrieving revision 1.48 retrieving revision 1.49 diff -u -p -d -r1.48 -r1.49 --- op_bfd.h 18 Mar 2008 02:00:08 -0000 1.48 +++ op_bfd.h 28 Apr 2008 21:23:25 -0000 1.49 @@ -18,6 +18,7 @@ #include <string> #include <list> #include <map> +#include <set> #include "bfd_support.h" #include "utility.h" @@ -78,8 +79,8 @@ private: bool symb_hidden; /// whether other symbols can override it bool symb_weak; - /// symbol is artificially created - bool symb_artificial; + /// symbol is artificially created + bool symb_artificial; /// code bytes corresponding to symbol -- used for XML generation std::string symb_bytes; }; @@ -189,6 +190,8 @@ public: bool get_symbol_contents(symbol_index_t sym_index, unsigned char * contents) const; + bool valid() const { return ibfd.valid(); } + private: /// temporary container type for getting symbols typedef std::list<op_bfd_symbol> symbols_found_t; @@ -256,6 +259,12 @@ private: // corresponding debug bfd object, if one is found mutable bfd_info dbfd; + /// sections we will avoid to use symbol from, this is needed + /// because elf file allows sections with identical vma and we can't + /// allow overlapping symbols. Such elf layout is used actually by + /// kernel modules where all code section vma are set to 0. + std::vector<asection const *> filtered_section; + typedef std::map<std::string, u32> filepos_map_t; // mapping of section names to filepos in the original binary filepos_map_t filepos_map; @@ -265,6 +274,8 @@ private: * the embedded SPU image. */ std::string embedding_filename; + + bool anon_obj; }; Index: file_manip.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libutil++/file_manip.cpp,v retrieving revision 1.37 retrieving revision 1.38 diff -u -p -d -r1.37 -r1.38 --- file_manip.cpp 22 Feb 2008 16:17:48 -0000 1.37 +++ file_manip.cpp 28 Apr 2008 21:23:25 -0000 1.38 @@ -12,8 +12,6 @@ #include <unistd.h> #include <sys/stat.h> #include <fcntl.h> -#include <dirent.h> -#include <fnmatch.h> #include <utime.h> #include <limits.h> #include <stdlib.h> @@ -114,49 +112,20 @@ bool op_file_readable(string const & fil return op_file_readable(file.c_str()); } -inline static bool is_directory_name(char const * name) +static void get_pathname(const char * pathname, void * name_list) { - return name[0] == '.' && - (name[1] == '\0' || - (name[1] == '.' && name[2] == '\0')); + list<string> * file_list = (list<string> *)name_list; + file_list->push_back(pathname); } - bool create_file_list(list<string> & file_list, string const & base_dir, string const & filter, bool recursive) { - DIR * dir; - struct dirent * ent; - - if (!(dir = opendir(base_dir.c_str()))) - return false; - - while ((ent = readdir(dir)) != 0) { - if (!is_directory_name(ent->d_name) && - fnmatch(filter.c_str(), ent->d_name, 0) != FNM_NOMATCH) { - if (recursive) { - struct stat stat_buffer; - string name = base_dir + '/' + ent->d_name; - if (stat(name.c_str(), &stat_buffer) == 0) { - if (S_ISDIR(stat_buffer.st_mode) && - !S_ISLNK(stat_buffer.st_mode)) { - // recursive retrieve - create_file_list(file_list, - name, filter, - recursive); - } else { - file_list.push_back(name); - } - } - } else { - file_list.push_back(ent->d_name); - } - } - } - - closedir(dir); - - return true; + return !get_matching_pathnames(&file_list, get_pathname, + base_dir.c_str(), filter.c_str(), + recursive ? MATCH_ANY_ENTRY_RECURSION : + NO_RECURSION) ? true : false; + } @@ -178,7 +147,6 @@ static string erase_trailing_path_separa return result; } - string op_dirname(string const & file_name) { string result = erase_trailing_path_separator(file_name); Index: bfd_support.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libutil++/bfd_support.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -u -p -d -r1.7 -r1.8 --- bfd_support.cpp 15 Feb 2008 18:28:19 -0000 1.7 +++ bfd_support.cpp 28 Apr 2008 21:23:25 -0000 1.8 @@ -508,7 +508,7 @@ void bfd_info::get_symbols() linenr_info const find_nearest_line(bfd_info const & b, op_bfd_symbol const & sym, - unsigned int offset) + unsigned int offset, bool anon_obj) { char const * function = ""; char const * cfilename = ""; @@ -530,7 +530,10 @@ find_nearest_line(bfd_info const & b, op abfd = b.abfd; syms = b.syms.get(); section = sym.symbol()->section; - pc = (sym.value() + offset) - sym.filepos(); + if (anon_obj) + pc = offset - sym.symbol()->section->vma; + else + pc = (sym.value() + offset) - sym.filepos(); if ((bfd_get_section_flags(abfd, section) & SEC_ALLOC) == 0) goto fail; Index: bfd_support.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/libutil++/bfd_support.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -p -d -r1.4 -r1.5 --- bfd_support.h 31 May 2007 15:33:18 -0000 1.4 +++ bfd_support.h 28 Apr 2008 21:23:25 -0000 1.5 @@ -128,6 +128,6 @@ struct linenr_info { */ linenr_info const find_nearest_line(bfd_info const & ibfd, op_bfd_symbol const & sym, - unsigned int offset); + unsigned int offset, bool anon_obj); #endif /* !BFD_SUPPORT_H */ |