From: hanseld <ha...@us...> - 2008-04-15 08:15:19
|
Update of /cvsroot/oprofile/oprofile/opjitconv In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv16970/opjitconv Modified Files: Tag: JIT_SUPPORT opjitconv.c opjitconv.h Makefile.am Added Files: Tag: JIT_SUPPORT conversion.c Log Message: Separated JIT dump file conversion --- NEW FILE: conversion.c --- /** * @file conversion.c * Convert a jit dump file to an ELF file * * @remark Copyright 2008 OProfile authors * @remark Read the file COPYING * * @author Daniel Hansel * * Copyright IBM Corporation 2008 * */ #include <stdlib.h> #include "opjitconv.h" static void free_jit_records(void) { struct jitentry * entry, * next; for (entry = jitentry_list; entry; entry = next) { if (entry->sym_name_malloced) free(entry->symbol_name); next = entry->next; free(entry); } jitentry_list = NULL; } static void free_jit_debug_line(void) { struct jitentry_debug_line * entry, * next; for (entry = jitentry_debug_line_list; entry; entry = next) { next = entry->next; free(entry); } jitentry_debug_line_list = NULL; } int op_jit_convert(struct op_jitdump_info file_info, char const * elffile, unsigned long long start_time, unsigned long long end_time) { void const * jitdump = file_info.dmp_file; int rc= OP_JIT_CONV_OK; entry_count = 0; max_entry_count = 0; syms = NULL; cur_bfd = NULL; jitentry_list = NULL; jitentry_debug_line_list = NULL; entries_symbols_ascending = entries_address_ascending = NULL; if ((rc = parse_all(jitdump, jitdump + file_info.dmp_file_stat.st_size, end_time)) == OP_JIT_CONV_FAIL) goto out; create_arrays(); if ((rc = resolve_overlaps(start_time)) == OP_JIT_CONV_FAIL) goto out; disambiguate_symbol_names(); if (!entry_count) return OP_JIT_CONV_NO_JIT_RECS_IN_DUMPFILE; if ((cur_bfd = open_elf(elffile)) == NULL) { rc = OP_JIT_CONV_FAIL; goto out; } init_debug_line_info(cur_bfd); if ((rc = partition_sections()) == OP_JIT_CONV_FAIL) goto out; if ((rc = fill_sections()) == OP_JIT_CONV_FAIL) goto out; finalize_debug_line_info(cur_bfd); if (cur_bfd) bfd_close(cur_bfd); free(syms); out: free_jit_records(); free_jit_debug_line(); free(entries_symbols_ascending); free(entries_address_ascending); return rc; } Index: opjitconv.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/opjitconv/Attic/opjitconv.c,v retrieving revision 1.1.2.20 retrieving revision 1.1.2.21 diff -u -p -d -r1.1.2.20 -r1.1.2.21 --- opjitconv.c 3 Apr 2008 12:58:03 -0000 1.1.2.20 +++ opjitconv.c 15 Apr 2008 08:15:23 -0000 1.1.2.21 @@ -16,11 +16,8 @@ #include "opjitconv.h" #include "opd_printf.h" #include "op_file.h" -#include "op_list.h" #include "op_libiberty.h" -#include <bfd.h> -#include <dlfcn.h> #include <dirent.h> #include <fnmatch.h> #include <errno.h> @@ -31,28 +28,10 @@ #include <stdlib.h> #include <string.h> #include <sys/mman.h> -#include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <wait.h> - -#define OP_JIT_CONV_NO_DUMPFILE 1 -#define OP_JIT_CONV_NO_ANON_SAMPLES 2 -#define OP_JIT_CONV_NO_MATCHING_ANON_SAMPLES 3 -#define OP_JIT_CONV_NO_JIT_RECS_IN_DUMPFILE 4 -#define OP_JIT_CONV_ALREADY_DONE 5 - -struct op_jitdump_info { - void * dmp_file; - struct stat dmp_file_stat; -}; - -struct pathname { - char * name; - struct list_head neighbor; -}; - /* * list head. The linked list is used during parsing (parse_all) to * hold all jitentry elements. After parsing, the program works on the @@ -85,85 +64,6 @@ struct jitentry ** entries_address_ascen /* debug flag, print some information */ int debug; - -static void free_jit_records(void) -{ - struct jitentry * entry, * next; - - for (entry = jitentry_list; entry ; entry = next) { - if (entry->sym_name_malloced) - free(entry->symbol_name); - next = entry->next; - free(entry); - } - jitentry_list = NULL; -} - -static void free_jit_debug_line(void) -{ - struct jitentry_debug_line * entry, * next; - - for (entry = jitentry_debug_line_list; entry ; entry = next) { - next = entry->next; - free(entry); - } - jitentry_debug_line_list = NULL; -} - -static int op_jit_convert(struct op_jitdump_info file_info, - char const * elffile, unsigned long long start_time, - unsigned long long end_time) -{ - void const * jitdump = file_info.dmp_file; - int rc = OP_JIT_CONV_OK; - - entry_count = 0; - max_entry_count = 0; - syms = NULL; - cur_bfd = NULL; - jitentry_list = NULL; - jitentry_debug_line_list = NULL; - entries_symbols_ascending = entries_address_ascending = NULL; - - if ((rc = parse_all(jitdump, jitdump + file_info.dmp_file_stat.st_size, - end_time)) == OP_JIT_CONV_FAIL) - goto out; - - create_arrays(); - if ((rc = resolve_overlaps(start_time)) == OP_JIT_CONV_FAIL) - goto out; - - disambiguate_symbol_names(); - if (!entry_count) - return OP_JIT_CONV_NO_JIT_RECS_IN_DUMPFILE; - - if ((cur_bfd = open_elf(elffile)) == NULL) { - rc = OP_JIT_CONV_FAIL; - goto out; - } - - init_debug_line_info(cur_bfd); - - if ((rc = partition_sections()) == OP_JIT_CONV_FAIL) - goto out; - - if ((rc = fill_sections()) == OP_JIT_CONV_FAIL) - goto out; - - finalize_debug_line_info(cur_bfd); - - if (cur_bfd) - bfd_close(cur_bfd); - free(syms); - out: - free_jit_records(); - free_jit_debug_line(); - free(entries_symbols_ascending); - free(entries_address_ascending); - return rc; -} - - /* * Front-end processing from this point to end of the source. * From main(), the general flow is as follows: @@ -204,7 +104,6 @@ static void delete_path_names_list(struc } } - static int mmap_jitdump(char const * dumpfile, struct op_jitdump_info * file_info) { @@ -264,14 +163,31 @@ static int process_jit_dumpfile(char con int result_dir_length, proc_id_length; int rc = OP_JIT_CONV_OK; int jofd; - struct stat jo_file_stat; + struct stat file_stat; time_t dumpfile_modtime; struct op_jitdump_info dmp_info; char * elf_file = NULL; char * proc_id = NULL; char const * anon_dir; char const * dumpfilename = rindex(dmp_pathname, '/'); + verbprintf(debug, "Processing dumpfile %s\n", dmp_pathname); + + /* Check if the dump file is a symbolic link. + * We should not trust symbolic links because we only produce normal dump + * files (no links). + */ + if (lstat(dmp_pathname, &file_stat) == -1) { + printf("opjitconv: lstat for dumpfile failed (%s).\n", strerror(errno)); + rc = OP_JIT_CONV_FAIL; + goto out; + } + if (S_ISLNK(file_stat.st_mode)) { + printf("opjitconv: dumpfile path is corrupt (symbolic links not allowed).\n"); + rc = OP_JIT_CONV_FAIL; + goto out; + } + if (dumpfilename) { char const * dot_dump = rindex(++dumpfilename, '.'); if (!dot_dump) @@ -286,7 +202,6 @@ static int process_jit_dumpfile(char con chk_proc_id: if (!proc_id) { printf("opjitconv: dumpfile path is corrupt.\n"); - fflush(stdout); rc = OP_JIT_CONV_FAIL; goto out; } @@ -317,7 +232,7 @@ chk_proc_id: jofd = open(elf_file, O_RDONLY); if (jofd < 0) goto create_elf; - rc = fstat(jofd, &jo_file_stat); + rc = fstat(jofd, &file_stat); if (rc < 0) { perror("opjitconv:fstat on .jo file"); rc = OP_JIT_CONV_FAIL; @@ -333,8 +248,8 @@ chk_proc_id: * modified since the ELF file's mod time, we don't * need to do ELF creation again. */ - if (!(jo_file_stat.st_ctime < dumpfile_modtime || - jo_file_stat.st_mtime < dumpfile_modtime)) { + if (!(file_stat.st_ctime < dumpfile_modtime || + file_stat.st_mtime < dumpfile_modtime)) { rc = OP_JIT_CONV_ALREADY_DONE; goto free_res3; } Index: opjitconv.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/opjitconv/Attic/opjitconv.h,v retrieving revision 1.1.2.12 retrieving revision 1.1.2.13 diff -u -p -d -r1.1.2.12 -r1.1.2.13 --- opjitconv.h 3 Apr 2008 12:58:03 -0000 1.1.2.12 +++ opjitconv.h 15 Apr 2008 08:15:23 -0000 1.1.2.13 @@ -18,10 +18,17 @@ #define OP_JIT_CONV_OK 0 #define OP_JIT_CONV_FAIL -1 +#define OP_JIT_CONV_NO_DUMPFILE 1 +#define OP_JIT_CONV_NO_ANON_SAMPLES 2 +#define OP_JIT_CONV_NO_MATCHING_ANON_SAMPLES 3 +#define OP_JIT_CONV_NO_JIT_RECS_IN_DUMPFILE 4 +#define OP_JIT_CONV_ALREADY_DONE 5 #include <bfd.h> #include <stddef.h> +#include <sys/stat.h> +#include "op_list.h" #include "op_types.h" /* Structure that contains all information @@ -61,6 +68,18 @@ struct jitentry_debug_line { void const * end; }; +struct op_jitdump_info +{ + void * dmp_file; + struct stat dmp_file_stat; +}; + +struct pathname +{ + char * name; + struct list_head neighbor; +}; + /* jitsymbol.c */ void create_arrays(void); int resolve_overlaps(unsigned long long start_time); @@ -70,6 +89,10 @@ void disambiguate_symbol_names(void); int parse_all(void const * start, void const * end, unsigned long long end_time); +/* conversion.c */ +int op_jit_convert(struct op_jitdump_info file_info, char const * elffile, + unsigned long long start_time, unsigned long long end_time); + /* create_bfd.c */ bfd * open_elf(char const * filename); int partition_sections(void); Index: Makefile.am =================================================================== RCS file: /cvsroot/oprofile/oprofile/opjitconv/Attic/Makefile.am,v retrieving revision 1.1.2.6 retrieving revision 1.1.2.7 diff -u -p -d -r1.1.2.6 -r1.1.2.7 --- Makefile.am 27 Nov 2007 11:49:53 -0000 1.1.2.6 +++ Makefile.am 15 Apr 2008 08:15:23 -0000 1.1.2.7 @@ -13,6 +13,7 @@ opjitconv_LDADD = $(needed_libs) opjitconv_SOURCES = \ opjitconv.c \ opjitconv.h \ + conversion.c \ parse_dump.c \ jitsymbol.c \ create_bfd.c \ |