C++程序  |  93行  |  1.91 KB

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