/* Copyright (c) 2015 Google Inc
 * Davide Libenzi <dlibenzi@google.com>
 * See LICENSE for details.
 *
 * Converts kprof profiler files into Linux perf ones. The Linux Perf file
 * format has bee illustrated here:
 *
 *	 https://lwn.net/Articles/644919/
 *	 https://openlab-mu-internal.web.cern.ch/openlab-mu-internal/03_Documents/
 *			 3_Technical_Documents/Technical_Reports/2011/Urs_Fassler_report.pdf
 *
 */

#pragma once

#include <sys/types.h>
#include <stdio.h>
#include <stdint.h>
#include "xlib.h"
#include "perf_format.h"

struct mem_file_reloc {
	struct mem_file_reloc *next;
	uint64_t *ptr;
};

struct mem_block {
	struct mem_block *next;
	char *base;
	char *top;
	char *wptr;
};

struct mem_file {
	size_t size;
	struct mem_block *head;
	struct mem_block *tail;
	struct mem_file_reloc *relocs;
};

struct static_mmap64 {
	struct static_mmap64 *next;
	uint64_t addr;
	uint64_t size;
	uint64_t offset;
	uint32_t pid;
	uint32_t tid;
	uint16_t header_misc;
	char *path;
};

struct perf_headers {
	struct mem_block *headers[HEADER_FEAT_BITS];
};

struct perf_event_id {
	uint64_t event;
	uint64_t id;
};

struct perfconv_context {
	struct perf_context *pctx;
	int debug_level;
	struct static_mmap64 *static_mmaps;
	struct perf_header ph;
	struct perf_headers hdrs;
	struct mem_file fhdrs, attr_ids, attrs, data, event_types;
};

extern char *cmd_line_save;

struct perfconv_context *perfconv_create_context(struct perf_context *pctx);
void perfconv_free_context(struct perfconv_context *cctx);
void perfconv_set_dbglevel(int level, struct perfconv_context *cctx);
void perfconv_add_kernel_mmap(struct perfconv_context *cctx);
void perfconv_add_kernel_buildid(struct perfconv_context *cctx);
void perfconv_process_input(struct perfconv_context *cctx, FILE *input,
							FILE *output);
