| /** |
| * @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; |
| } |
| |