#!/usr/bin/env python # -*- coding: utf-8 -*- """ Simple built-in backend. """ __author__ = "Lluís Vilanova " __copyright__ = "Copyright 2012, Lluís Vilanova " __license__ = "GPL version 2 or (at your option) any later version" __maintainer__ = "Stefan Hajnoczi" __email__ = "stefanha@linux.vnet.ibm.com" from tracetool import out def is_string(arg): strtype = ('const char*', 'char*', 'const char *', 'char *') if arg.lstrip().startswith(strtype): return True else: return False def c(events): out('#include "trace.h"', '#include "trace/simple.h"', '', 'TraceEvent trace_list[] = {') for e in events: out('{.tp_name = "%(name)s", .state=0},', name = e.name, ) out('};', '') for num, event in enumerate(events): out('void trace_%(name)s(%(args)s)', '{', ' TraceBufferRecord rec;', name = event.name, args = event.args, ) sizes = [] for type_, name in event.args: if is_string(type_): out(' size_t arg%(name)s_len = %(name)s ? MIN(strlen(%(name)s), MAX_TRACE_STRLEN) : 0;', name = name, ) strsizeinfo = "4 + arg%s_len" % name sizes.append(strsizeinfo) else: sizes.append("8") sizestr = " + ".join(sizes) if len(event.args) == 0: sizestr = '0' out('', ' if (!trace_list[%(event_id)s].state) {', ' return;', ' }', '', ' if (trace_record_start(&rec, %(event_id)s, %(size_str)s)) {', ' return; /* Trace Buffer Full, Event Dropped ! */', ' }', event_id = num, size_str = sizestr, ) if len(event.args) > 0: for type_, name in event.args: # string if is_string(type_): out(' trace_record_write_str(&rec, %(name)s, arg%(name)s_len);', name = name, ) # pointer var (not string) elif type_.endswith('*'): out(' trace_record_write_u64(&rec, (uintptr_t)(uint64_t *)%(name)s);', name = name, ) # primitive data type else: out(' trace_record_write_u64(&rec, (uint64_t)%(name)s);', name = name, ) out(' trace_record_finish(&rec);', '}', '') def h(events): out('#include "trace/simple.h"', '') for event in events: out('void trace_%(name)s(%(args)s);', name = event.name, args = event.args, ) out('') out('#define NR_TRACE_EVENTS %d' % len(events)) out('extern TraceEvent trace_list[NR_TRACE_EVENTS];')